Die Process Explorer-Antwort funktioniert einmal, aber Sie möchten wahrscheinlich, dass dies auch nach dem Neustart des Computers zutrifft. Dazu können Sie PowerShell verwenden:
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)
}
}
Es basiert auf dieser Stack Overflow-Antwort . Grundsätzlich stellen Sie ihm die Liste der zu schützenden Prozesse und die Liste der zu schützenden Benutzer zur Verfügung, und die Zugriffssteuerungslisten der Prozesse werden entsprechend geändert. Speichern Sie es als .ps1
Datei (irgendwo, wo der Benutzer lesen, aber nicht schreiben kann), und legen Sie dann eine Batch-Datei mit folgendem Inhalt im Autostart des Benutzers ab:
powershell \path\to\script.ps1 ('snippingtool', 'mspaint') 'Guest' -executionpolicy bypass
Das schützt snippingtool.exe
und mspaint.exe
(das Snipping Tool und Paint) davor, von Guest getötet zu werden.
Beachten Sie, dass dies ausgeführt werden muss, nachdem diese Prozesse gestartet wurden. Möglicherweise müssen Sie sleep 10
nach dem Param
Block des PowerShell-Skripts ein oder mehrere hinzufügen . Sobald dies abgeschlossen ist, führt der Versuch, diese Prozesse mit dem Task-Manager abzubrechen, zu folgendem Ergebnis:
Beachten Sie auch, dass es keinen Sinn macht, wenn das Konto, mit dem Sie es testen, ein Administrator ist oder genauer gesagt hat SeDebugPrivilege
.
Wenn Sie in den Fenstern auf das X klicken oder die Schließfunktion der Anwendung verwenden, werden die Prozesse immer noch beendet, da alle Prozesse die Möglichkeit haben, die Ausführung zu beenden. Möglicherweise müssen Sie den Benachrichtigungsbereich ausblenden, wie in einer anderen Antwort beschrieben. Da diese wichtigen Prozesse als Gastbenutzer ausgeführt werden, ist dieser Benutzer der Eigentümer der Prozessobjekte und kann die Zugriffssteuerungsliste ohnehin zurücksetzen oder Funktionen verwenden PROCESS_VM_WRITE
, um den Arbeitsspeicher der Prozesse zu kritzeln und sie zum Absturz zu bringen. Diese könnten durch Hinzufügen eines leeren ACE für OWNER RIGHTS
bzw. durch Ändern 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'
von gelöst werden 'PROCESS_ALL_ACCESS'
.
Das Verweigern des Zugriffs auf den Task-Manager über ein Gruppenrichtlinienobjekt würde den Benutzer (offensichtlich) daran hindern, den Task-Manager zu verwenden. Dies ist die einfachste Lösung, aber nichts hindert ihn daran, ein eigenes Programm (oder taskkill
) auszuführen, das nicht den Gruppenrichtlinien entspricht. Es ist am besten, wenn die Prozesse, gegen die Sie verteidigen möchten, als ein anderer Benutzer ausgeführt werden als der, gegen den Sie verteidigen möchten.
Wenn Ihr Gast gewillt ist, all diese Anstrengungen zu unternehmen, um diese verschiedenen "Schutzmaßnahmen" zu umgehen, besteht möglicherweise eher ein soziales Problem als ein technisches.