İşlem Gezgini yanıtı bir kez çalışıyor, ancak muhtemelen bilgisayar yeniden başlatıldıktan sonra bile uygulanmasını istiyorsunuz. Bunu yapmak için, PowerShell'i kullanabilirsiniz:
Param (
[string[]]$ProcessNames,
[string]$DenyUsername
)
$cscode = @"
using System;
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
public class ProcessSecurity : NativeObjectSecurity
{
public ProcessSecurity(SafeHandle processHandle)
: base(false, ResourceType.KernelObject, processHandle, AccessControlSections.Access)
{
}
public void AddAccessRule(ProcessAccessRule rule)
{
base.AddAccessRule(rule);
}
// this is not a full impl- it only supports writing DACL changes
public void SaveChanges(SafeHandle processHandle)
{
Persist(processHandle, AccessControlSections.Access);
}
public override Type AccessRightType
{
get { return typeof(ProcessAccessRights); }
}
public override AccessRule AccessRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
{
return new ProcessAccessRule(identityReference, (ProcessAccessRights)accessMask, isInherited, inheritanceFlags, propagationFlags, type);
}
public override Type AccessRuleType
{
get { return typeof(ProcessAccessRule); }
}
public override AuditRule AuditRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags)
{
throw new NotImplementedException();
}
public override Type AuditRuleType
{
get { throw new NotImplementedException(); }
}
}
public class ProcessAccessRule : AccessRule
{
public ProcessAccessRule(IdentityReference identityReference, ProcessAccessRights accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
: base(identityReference, (int)accessMask, isInherited, inheritanceFlags, propagationFlags, type)
{
}
public ProcessAccessRights ProcessAccessRights { get { return (ProcessAccessRights)AccessMask; } }
}
[Flags]
public enum ProcessAccessRights
{
STANDARD_RIGHTS_REQUIRED = (0x000F0000),
DELETE = (0x00010000), // Required to delete the object.
READ_CONTROL = (0x00020000), // Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right.
WRITE_DAC = (0x00040000), // Required to modify the DACL in the security descriptor for the object.
WRITE_OWNER = (0x00080000), // Required to change the owner in the security descriptor for the object.
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, //All possible access rights for a process object.
PROCESS_CREATE_PROCESS = (0x0080), // Required to create a process.
PROCESS_CREATE_THREAD = (0x0002), // Required to create a thread.
PROCESS_DUP_HANDLE = (0x0040), // Required to duplicate a handle using DuplicateHandle.
PROCESS_QUERY_INFORMATION = (0x0400), // Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
PROCESS_QUERY_LIMITED_INFORMATION = (0x1000),
PROCESS_SET_INFORMATION = (0x0200), // Required to set certain information about a process, such as its priority class (see SetPriorityClass).
PROCESS_SET_QUOTA = (0x0100), // Required to set memory limits using SetProcessWorkingSetSize.
PROCESS_SUSPEND_RESUME = (0x0800), // Required to suspend or resume a process.
PROCESS_TERMINATE = (0x0001), // Required to terminate a process using TerminateProcess.
PROCESS_VM_OPERATION = (0x0008), // Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
PROCESS_VM_READ = (0x0010), // Required to read memory in a process using ReadProcessMemory.
PROCESS_VM_WRITE = (0x0020), // Required to write to memory in a process using WriteProcessMemory.
SYNCHRONIZE = (0x00100000), // Required to wait for the process to terminate using the wait functions.
}
"@
Add-Type -TypeDefinition $cscode
$ProcessNames | % {
Get-Process -ProcessName $_ | % {
$handle = $_.SafeHandle
$acl = New-Object ProcessSecurity $handle
$ident = New-Object System.Security.Principal.NTAccount $DenyUsername
$ace = New-Object ProcessAccessRule ($ident, 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC', $false, 'None', 'None', 'Deny')
$acl.AddAccessRule($ace)
$acl.SaveChanges($handle)
}
}
Bu Stack Overflow cevabına dayanıyor . Temel olarak, korunacak işlemler listesini ve korunacak kullanıcının listesini verirsiniz ve işlemlerin ACL'lerini uygun şekilde kullanır. .ps1
Dosya olarak kaydedin (kullanıcının okuyabileceği ancak yazamayacağı bir yerde), ardından kullanıcının Başlangıç bölümüne böyle bir şey içeren bir toplu iş dosyası yerleştirin:
powershell \path\to\script.ps1 ('snippingtool', 'mspaint') 'Guest' -executionpolicy bypass
Bu , Konuk tarafından öldürülmekten snippingtool.exe
ve mspaint.exe
(Snipping Tool ve Paint) korunmasını sağlar .
Bunun, bu işlemler başladıktan sonra çalışması gerektiğini unutmayın . PowerShell betiğinin bloğundan sleep 10
sonra bir şey eklemeniz gerekebilir Param
. Tamamlandığında, bu işlemleri Görev Yöneticisi ile öldürmeye çalışmak buna neden olur:
Ayrıca, test ettiğiniz hesabın bir yönetici olması veya daha kesin bir şekilde sahip olması durumunda hiçbir şeyin işe yaramayacağını unutmayın SeDebugPrivilege
.
Windows'ta X'e tıklamak veya uygulamaların kendi yakın işlevselliğini kullanmak, tüm işlemlerin çalışmayı durdurmaya karar vermekte özgür olduğu için işlemlerin çıkışını yapacaktır. Başka bir cevapta açıklandığı gibi bildirim alanını gizlemeniz gerekebilir. Ayrıca, bu önemli işlemler konuk kullanıcı olarak çalıştığından, bu kullanıcı işlem nesnelerinin sahibidir ve yine de ACL'yi yeniden ayarlayabilir veya PROCESS_VM_WRITE
işlemlerin hafızasını karalamak ve bunları çökertmek için yetenekler kullanabilir . Bunlar için boş ACE ekleyerek çözülebilir OWNER RIGHTS
ve değiştirerek 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'
için 'PROCESS_ALL_ACCESS'
sırasıyla.
Görev Yöneticisi'ne GPO üzerinden erişimi reddetmek kullanıcının Görev Yöneticisi'ni (açıkça) kullanmasını engeller ve en basit çözümdür, ancak taskkill
Grup İlkesi'ne uymayan kendi programlarını (veya ) çalıştırmalarını engelleyen hiçbir şey yoktur. Savunmaya çalıştığınız işlemler, savunmaya çalıştığınızdan farklı bir kullanıcı olarak çalıştırılsa en iyisi olur.
Tabii ki, eğer misafiriniz bu çeşitli “korumaları” aşmak için bu kadar zorlanmaya razıysa, teknik olandan daha fazla sosyal sorun yaşayabilirsiniz.