คำตอบ Process Explorer ทำงานเพียงครั้งเดียว แต่คุณอาจต้องการให้สิ่งนี้ใช้ได้แม้หลังจากที่คอมพิวเตอร์รีบูตแล้ว ในการทำเช่นนั้นคุณสามารถใช้ PowerShell:
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)
}
}
ก็ขึ้นอยู่กับคำตอบนี้กองมากเกิน โดยทั่วไปคุณจะต้องจัดทำรายการกระบวนการเพื่อป้องกันและผู้ใช้ป้องกันและทำหน้าที่ปรับ ACL ของกระบวนการอย่างเหมาะสม บันทึกเป็น.ps1
ไฟล์ (ที่ใดที่ผู้ใช้สามารถอ่าน แต่ไม่สามารถเขียนได้) จากนั้นใส่แบตช์ไฟล์ที่มีสิ่งนี้ในการเริ่มต้นของผู้ใช้:
powershell \path\to\script.ps1 ('snippingtool', 'mspaint') 'Guest' -executionpolicy bypass
ที่ปกป้องsnippingtool.exe
และmspaint.exe
(Snipping Tool and Paint) จากการถูก Guest ฆ่า
โปรดทราบว่าสิ่งนี้จะต้องทำงานหลังจากเริ่มกระบวนการเหล่านั้น คุณอาจต้องเพิ่ม a sleep 10
หรือดังนั้นหลังจากParam
บล็อกของสคริปต์ PowerShell เมื่อเสร็จสิ้นการพยายามฆ่ากระบวนการเหล่านั้นด้วย Task Manager จะทำให้สิ่งนี้:
โปรดทราบด้วยว่าจะไม่มีประโยชน์หากบัญชีที่คุณทดสอบมีผู้ดูแลระบบหรือมากกว่าSeDebugPrivilege
นั้น
การคลิก X บนหน้าต่างหรือใช้ฟังก์ชันการทำงานใกล้ตัวของแอปพลิเคชันจะยังคงทำให้กระบวนการออกเนื่องจากกระบวนการทั้งหมดมีอิสระที่จะตัดสินใจหยุดทำงาน คุณอาจต้องซ่อนพื้นที่แจ้งเตือนดังที่อธิบายไว้ในคำตอบอื่น นอกจากนี้เนื่องจากกระบวนการที่สำคัญเหล่านี้ทำงานในฐานะผู้ใช้ของผู้ใช้ทั่วไปผู้ใช้นั้นเป็นเจ้าของวัตถุของกระบวนการและจะสามารถปรับ ACL กลับได้หรือไม่หรือสามารถใช้PROCESS_VM_WRITE
ความสามารถในการเขียนลวกหน่วยความจำของกระบวนการ สิ่งเหล่านี้สามารถแก้ไขได้โดยการเพิ่ม ACE ว่างสำหรับOWNER RIGHTS
และโดยเปลี่ยน'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'
เป็น'PROCESS_ALL_ACCESS'
ตามลำดับ
การปฏิเสธการเข้าถึงตัวจัดการงานผ่าน GPO จะหยุดผู้ใช้จากการใช้ตัวจัดการงาน (ชัด) และเป็นทางออกที่ตรงไปตรงมาที่สุด แต่ไม่มีอะไรหยุดพวกเขาจากการเรียกใช้โปรแกรมของตนเอง (หรือtaskkill
) ที่ไม่ปฏิบัติตามนโยบายกลุ่ม มันจะเป็นการดีที่สุดถ้ากระบวนการที่คุณพยายามปกป้องนั้นรันในฐานะผู้ใช้ที่แตกต่างจากกระบวนการที่คุณพยายามป้องกัน
แน่นอนหากแขกของคุณยินดีที่จะไปที่ปัญหาทั้งหมดเพื่อหลีกเลี่ยง "การป้องกัน" ที่หลากหลายเหล่านี้คุณอาจมีปัญหาทางสังคมมากกว่าทางเทคนิค