Jawaban Process Explorer berfungsi sekali, tetapi Anda mungkin ingin ini berlaku bahkan setelah komputer di-boot ulang. Untuk melakukan itu, Anda dapat menggunakan 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)
}
}
Ini didasarkan pada jawaban Stack Overflow ini . Pada dasarnya, Anda memberikan daftar proses untuk melindungi dan pengguna untuk melindungi, dan itu mengotak-atik ACL proses secara tepat. Simpan sebagai .ps1
file (di suatu tempat pengguna dapat membaca tetapi tidak menulis), lalu taruh file batch yang berisi sesuatu seperti ini di Startup pengguna:
powershell \path\to\script.ps1 ('snippingtool', 'mspaint') 'Guest' -executionpolicy bypass
Itu melindungi snippingtool.exe
dan mspaint.exe
(Snipping Tool and Paint) agar tidak terbunuh oleh Tamu.
Perhatikan bahwa ini harus dijalankan setelah proses tersebut dimulai. Anda mungkin harus menambahkan kira-kira sleep 10
setelah Param
blok skrip PowerShell. Setelah selesai, mencoba untuk mematikan proses tersebut dengan Task Manager akan menyebabkan ini:
Perhatikan juga bahwa tidak akan ada gunanya jika akun yang Anda uji itu adalah administrator, atau lebih tepatnya dimiliki SeDebugPrivilege
.
Mengklik X pada windows mereka atau menggunakan fungsi dekat aplikasi sendiri masih akan membuat proses keluar, karena semua proses bebas untuk memutuskan untuk berhenti berjalan. Anda mungkin perlu menyembunyikan area notifikasi, seperti dijelaskan dalam jawaban lain. Juga, karena proses-proses penting ini berjalan sebagai pengguna tamu, pengguna tersebut adalah pemilik objek proses, dan akan dapat menyesuaikan kembali ACL, atau dapat menggunakan PROCESS_VM_WRITE
kemampuan untuk mencoret-coret memori proses dan menghancurkannya. Mereka bisa diselesaikan dengan menambahkan ACE kosong untuk OWNER RIGHTS
dan dengan mengubah 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'
ke 'PROCESS_ALL_ACCESS'
masing-masing.
Menolak akses ke Task Manager melalui GPO akan menghentikan pengguna dari menggunakan Task Manager (jelas) dan merupakan solusi yang paling mudah, tetapi tidak ada yang menghentikan mereka dari menjalankan program mereka sendiri (atau taskkill
) yang tidak mematuhi Kebijakan Grup. Akan lebih baik jika proses yang Anda coba pertahankan dijalankan sebagai pengguna yang berbeda dari yang Anda coba lawan.
Tentu saja, jika tamu Anda bersedia untuk bersusah payah menghindari berbagai "perlindungan" ini, Anda mungkin memiliki lebih banyak masalah sosial daripada masalah teknis.