Rubrik: System/Windows · Prozesse/Tasks | VB-Versionen: VB4, VB5, VB6 | 13.01.05 |
Debugging Privilegien Setzen von Debugging Privilegien, so dass TerminateProcess fast immer erfolgreich ist | ||
Autor: Tobias Tangemann | Bewertung: | Views: 13.181 |
ohne Homepage | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Mit den beiden Tipps Einen Prozess beenden und der API-Funktion CreateToolhelp32Snapshot lässt sich sehr bequem ein Programm entwickeln, das alle ungewünschten Programme schnell beendet. Einige Prozesse weigern sich ab WinNT jedoch mit TerminateProcess beendet zu werden. Damit auch diese hartnäckigen Prozesse beendet werden können, muss das Programm Debugging Privilegien besitzen. Das hilft bei fast allen Prozessen, die sich weigern, beendet zu werden. Einige lassen sich aber trotzdem nicht beenden, so z.B ZoneAlarm, das sich berechtigterweise vor dieser Methode schützt oder System-Prozesse wie z.B smss.exe. Zum Setzen von DebugingPrivilegien verwendet man einfach folgende Methode, die einfach in ein Modul kopiert werden kann:
Option Explicit ' Konstanten Private Const SE_DEBUG_NAME = "SeDebugPrivilege" Private Const SE_PRIVILEGE_ENABLED = &H2 Private Const ANYSIZE_ARRAY = 1 Private Const TOKEN_ADJUST_PRIVILEGES = &H20 Private Const TOKEN_QUERY = &H8 ' Typen Private Type LUID LowPart As Long HighPart As Long End Type Private Type LUID_AND_ATTRIBUTES pLuid As LUID Attributes As Long End Type Private Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type Private Type LARGE_INTEGER LowPart As Long HighPart As Long End Type ' API's Private Declare Function OpenProcessToken Lib "advapi32.dll" ( _ ByVal ProcessHandle As Long, _ ByVal DesiredAccess As Long, _ TokenHandle As Long) As Long Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" _ Alias "LookupPrivilegeValueA" ( _ ByVal lpSystemName As String, _ ByVal lpName As String, _ lpLuid As LARGE_INTEGER) As Long Private Declare Function AdjustTokenPrivileges Lib "advapi32" ( _ ByVal TokenHandle As Long, _ ByVal DisableAllPrivileges As Long, _ ByRef NewState As TOKEN_PRIVILEGES, _ ByVal BufferLength As Long, _ ByRef PreviousState As Any, _ ByRef ReturnLength As Any) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Function EnableDebugPrivNT() As Boolean Dim hToken As Long Dim DebugValue1 As LARGE_INTEGER Dim DebugValue2 As LUID Dim tkp As TOKEN_PRIVILEGES Dim lResult As Long ' Handle des AccessToken ermitteln lResult = OpenProcessToken(GetCurrentProcess, _ TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) If lResult = 0 Then EnableDebugPrivNT = False Exit Function End If ' Debuging Privilegien setzen lResult = LookupPrivilegeValue("", SE_DEBUG_NAME, DebugValue1) If lResult = 0 Then EnableDebugPrivNT = False Exit Function End If DebugValue2.HighPart = DebugValue1.HighPart DebugValue2.LowPart = DebugValue1.LowPart tkp.PrivilegeCount = 1 tkp.Privileges(0).pLuid = DebugValue2 tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED ' Debuging Privilegien aktivieren lResult = AdjustTokenPrivileges(hToken, False, tkp, 0, ByVal 0&, 0) If lResult = 0 Then EnableDebugPrivNT = False Exit Function End If EnableDebugPrivNT = True End Function