Rubrik: Windows/System | 22.03.05 |
AdjustTokenPrivileges-Funktion Diese Funktion aktiviert oder deaktiviert ein Privileg eines angegebenen Zugriffs-Token. | ||
Betriebssystem: WinNT 3.1, WinNT 3.1, Win2000 | Views: 16.241 |
Deklaration:
Declare Function AdjustTokenPrivileges Lib "advapi32.dll" ( _ ByVal TokenHandle As Long, _ ByVal DisableAllPrivileges As Long, _ NewState As Any, _ ByVal BufferLength As Long, _ PreviousState As Any, _ ReturnLength As Long) As Long
Beschreibung:
Diese Funktion aktiviert oder deaktiviert ein Privileg eines angegebenen Zugriffs-Token.
Parameter:
TokenHandle | Erwartet den Handle des Tokens dessen Privilegien geändert werden sollen. |
DisableAllPrivileges | Erwartet "False" wenn alle Privilegien des Tokensdeaktiviert werden sollen (NewState wird ignoriert) oder "True", wenn die bei "NewState" angegebenen Privilegienaktiviert werden sollen. |
NewState | Erwartet eine TOKEN_PRIVILEGES-Struktur die das Privileg und dessen Attribute enthält. Das Privileg wirdaktiviert, wenn die TOKEN_PRIVILEGES-Struktur die Konstante "SE_PRIVILEGE_ENABLED" enthält, ansonsten wird das Privilegdeaktiviert. |
BufferLength | Erwartet die Größe des Puffers der bei "Previous_State" übergeben wird in Bytes. |
PreviousState | Erwartet einen Puffer der mit einer TOKEN_PRIVILEGES-Struktur gefüllt wird, die die vorherige Einstellung des Privileges enthält. Wird die Rückgabe der vorherigenEinstellung nicht erwünscht, so kann hier der Wert "0" übergeben werden. |
ReturnLength | Erwartet eine Long-Variable, die mit der Größe des benötigten Speicherplatzes in dem Puffer gefüllt wird. Alternativ kann hier derWert "0" übergeben werden, wenn bei "Previous_State" der Wert "0" übergeben wurde. |
Rückgabewert:
Ist die Funktion erfolgreich so ist die Rückgabe der Wert "0", andernfalls wird einWert "ungleich 0" zurückgegeben. Für erweiterte Fehlerinformationen rufenSie die GetLastError-Funktion auf.
Const ERROR_SUCCESS = 0& ' Der Funktionsaufruf war erfolgreich Const ERROR_NOT_ALL_ASSIGNED = 1300& ' Nicht alle Privilegien konnten erfolgreich geändert werden
Beispiel:
Private Declare Function ExitWindowsEx Lib "user32" ( _ ByVal uFlags As Long, _ ByVal dwReserved As Long) As Long Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" _ Alias "LookupPrivilegeValueA" ( _ ByVal lpSystemName As String, _ ByVal lpName As String, _ lpLuid As LUID) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" ( _ ByVal TokenHandle As Long, _ ByVal DisableAllPrivileges As Long, _ NewState As TOKEN_PRIVILEGES, _ ByVal BufferLength As Long, _ PreviousState As TOKEN_PRIVILEGES, _ ReturnLength As Long) As Long Private Declare Function OpenProcessToken Lib "advapi32.dll" ( _ ByVal ProcessHandle As Long, _ ByVal DesiredAccess As Long, _ TokenHandle As Long) As Long Private Declare Function GetVersionEx Lib "kernel32" _ Alias "GetVersionExA" ( _ lpVersionInformation As OSVERSIONINFO) As Long Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type 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 Const ANYSIZE_ARRAY = 1 ' setzt die Größe des Privileges Array's Private Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(1) As LUID_AND_ATTRIBUTES End Type ' LUID_AND_ATTRIBUTES Attributes-Konstante Private Const SE_PRIVILEGE_ENABLED = 2 ' aktiviert ein Privileg ' ExitWindowsEx uFlags-Konstanten Private Const EWX_FORCE = 4 ' beendet alle Programme ohne Aufforderung an den Benutzer Private Const EWX_LOGOFF = 0 ' meldet sich neu am Netzwerk an Private Const EWX_REBOOT = 2 ' startet den Computer neu Private Const EWX_SHUTDOWN = 1 ' fährt den Computer herunter Private Const EWX_POWEROFF = 8 ' fährt den Computer herunter und schaltet ihn ab wenn möglich ' LookupPrivilegeValue lpName-Konstanten Private Const SE_ASSIGNPRIMARYTOKEN_NAME = "SeAssignPrimaryTokenPrivilege" ' wird benötigt, um den Primary-Token zuweisen zu können Private Const SE_AUDIT_NAME = "SeAuditPrivilege" ' wird benutzt, um audit-log-Einträge generieren zu können Private Const SE_BACKUP_NAME = "SeBackupPrivilege" ' wird benötigt, um Backup-Operationen durchführen zu können Private Const SE_CHANGE_NOTIFY_NAME = "SeChangeNotifyPrivilege" ' wird benötigt, um Änderungen für Notify-Funktionen im Dateisystem zu erhalten Private Const SE_CREATE_PAGEFILE_NAME = "SeCreatePagefilePrivilege" ' wird benötigt, um eine Paging-Datei erstellen zu können Private Const SE_CREATE_PERMANENT_NAME = "SeCreatePermanentPrivilege" ' wird benötigt, um permanente Objekte erstellen zu können Private Const SE_CREATE_TOKEN_NAME = "SeCreateTokenPrivilege" ' wird benötigt, um einen Primary-Token erstellen zu können Private Const SE_DEBUG_NAME = "SeDebugPrivilege" ' wird benötigt, um einen Prozess debuggen zu können Private Const SE_ENABLE_DELEGATION_NAME = ("SeEnableDelegationPrivilege") ' wird benötigt, um Netzwerkrechner als vertrauenswürdig zu markieren Private Const SE_INC_BASE_PRIORITY_NAME = "SeIncreaseBasePriorityPrivilege" ' wird benötigt, um die Basis-Priorität eines Prozesses erhöhen zu können Private Const SE_INCREASE_QUOTA_NAME = "SeIncreaseQuotaPrivilege" ' wird benötigt, um die Quote eines Prozesses erhöhen zu können Private Const SE_LOAD_DRIVER_NAME = "SeLoadDriverPrivilege" ' wird benötigt, um Gerätetreiber laden oder entladen zu können Private Const SE_LOCK_MEMORY_NAME = "SeLockMemoryPrivilege" ' wird benötigt, um physische Speicherseiten einfrieren zu können Private Const SE_MACHINE_ACCOUNT_NAME = "SeMachineAccountPrivilege" ' wird benötigt, um einen Maschinen-Account erstellen zu können Private Const SE_PROF_SINGLE_PROCESS_NAME = "SeProfileSingleProcessPrivilege" ' wird benötigt, um Informationen eines einzelnen Prozesses ermitteln zu können Private Const SE_REMOTE_SHUTDOWN_NAME = "SeRemoteShutdownPrivilege" ' wird benötigt, um einen Netzwerkrechner herunterfahren zu können Private Const SE_RESTORE_NAME = "SeRestorePrivilege" ' wird benötigt, um Wiederherstellungsoperationen durchführen zu können Private Const SE_SECURITY_NAME = "SeSecurityPrivilege" ' wird benötigt, um einige sicherheitsrelevante Funktionen nutzen zu können Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" ' wird benötigt, um das lokale System herunterfahren zu können Private Const SE_SYNC_AGENT_NAME = ("SeSyncAgentPrivilege") ' wird benötigt, um alle Leserechte eines Dateisystems zu erlauben die sonst nur der Administrator besitzt Private Const SE_SYSTEM_ENVIRONMENT_NAME = "SeSystemEnvironmentPrivilege" ' wird benötigt, um auf nicht flüchtigen Speicher des Systems zugreifen zu können Private Const SE_SYSTEM_PROFILE_NAME = "SeSystemProfilePrivilege" ' wird benötigt, um alle Informationen des Systems auslesen zu können Private Const SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege" ' wird benötigt, um die Systemzeit ändern zu können Private Const SE_TAKE_OWNERSHIP_NAME = "SeTakeOwnershipPrivilege" ' wird benötigt, um die Zugehörigkeit eines Objektes ändern zu können Private Const SE_TCB_NAME = "SeTcbPrivilege" ' ' _ ' wird benötigt, um das lokale System als Bestandteil des Netzwerkrechners anmelden zu können Private Const SE_UNDOCK_NAME = ("SeUndockPrivilege") ' wird benötigt, um einen Laptop undocken zu können Private Const SE_UNSOLICITED_INPUT_NAME = "SeUnsolicitedInputPrivilege" ' wird benötigt, um unaufgeforderte Daten eines Terminals lesen zu können ' AdjustTokenPrivileges DesiredAccess-Konstanten Private Const READ_CONTROL = &H20000 ' wird für einige Standardrechte der TOKEN-Konstanten benötigt Private Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL) ' wird für TOKEN_EXECUTE benötigt Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)' wird für TOKEN_READ benötigt Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL) ' wird für TOKEN_WRITE benötigt Private Const TOKEN_ADJUST_DEFAULT = (&H80) ' wird benötigt, um die Zugriffsrechte des Standardbesitzers, der Hauptgruppe oder DACL eines Zugriffs-Token zu ändern Private Const TOKEN_ADJUST_GROUPS = (&H40) ' wird benötigt, um die Zugriffsrechte einer Gruppe eines Zugriffs-Token zu ändern Private Const TOKEN_ADJUST_PRIVILEGES = (&H20) ' wird benötigt, um die Privilegien eines Zugriffs-Token zu setzen Private Const TOKEN_ADJUST_SESSIONID = (&H100) ' wird benötigt, um die Session-ID eines Zugriffs-Token zu ändern. Das SE_TCB_NAME Privileg wird benötigt. Private Const TOKEN_ASSIGN_PRIMARY = (&H1) ' ' wird benötigt, um ein Primary-Token einem Prozess zuweisen zu können. ' Das SE_ASSIGNPRIMARYTOKEN_NAME Privileg wird für diese Aktion benötigt. Private Const TOKEN_DUPLICATE = (&H2) ' wird benötigt, um ein Zugriffs-Token dublizieren zu können Private Const TOKEN_EXECUTE = (STANDARD_RIGHTS_EXECUTE) ' kombiniert die Privilegien STANDARD_RIGHTS_EXECUTE und TOKEN_IMPERSONATE Private Const TOKEN_IMPERSONATE = (&H4) ' wird benötigt, um einen verkörperten Zugriffs-Token einem Prozess zuweisen zu können Private Const TOKEN_QUERY = (&H8) ' wird benötigt, um einen Zugriffs-Token abzufragen Private Const TOKEN_QUERY_SOURCE = (&H10) ' wird benötigt, um die Quelle eines Zugriffs-Token abfragen zu können Private Const TOKEN_READ = (STANDARD_RIGHTS_READ Or TOKEN_QUERY) ' kombiniert die Privilegien STANDARD_RIGHTS_READ und TOKEN_QUERY Private Const TOKEN_WRITE = (STANDARD_RIGHTS_WRITE Or _ TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT) ' kombiniert die Privilegien STANDARD_RIGHTS_WRITE, TOKEN_ADJUST_PRIVILEGES, ' TOKEN_ADJUST_GROUPS und TOKEN_ADJUST_DEFAULT Private Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ TOKEN_ASSIGN_PRIMARY Or TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY _ Or TOKEN_QUERY_SOURCE Or TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or _ TOKEN_ADJUST_SESSIONID Or TOKEN_ADJUST_DEFAULT) ' wird benötigt, um alle Zugriffsrechte eines Zugriffs-Token zu erlauben ' AdjustTokenPrivileges Rückgabe-Konstanten Private Const ERROR_SUCCESS = 0& ' der Funktionsaufruf war erfolgreich Private Const ERROR_NOT_ALL_ASSIGNED = 1300& ' nicht alle Privilegien konnten erfolgreich geändert werden
' Windows neu starten Public Sub Command1_Click() Dim Retval As Long, hToken As Long, TKP As TOKEN_PRIVILEGES Dim TKPOld As TOKEN_PRIVILEGES, OSVI As OSVERSIONINFO ' Strukturgröße setzen OSVI.dwOSVersionInfoSize = Len(OSVI) ' Betriebsystemversion ermitteln Call GetVersionEx(OSVI) ' Falls Windows NT/2000/XP ausgeführt wird, erst Sicherheitseinstellungen vornehmen If OSVI.dwPlatformId = 2 Then ' öffnet einen Prozess Zugriffs-Token If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES _ Or TOKEN_QUERY, hToken) Then ' ermittelt die Zugriffs-ID für das Herunterfahren des Systems Retval = LookupPrivilegeValue(vbNullString, _ SE_SHUTDOWN_NAME, TKP.Privileges(0).pLuid) ' setzt in der Struktur, dass das Herunterfahren des Systems ' für diesen Prozess/Token aktiviert werden soll TKP.PrivilegeCount = 1 TKP.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED ' setzt die neuen Privilegien des Zugriff-Tokens und fährt bei Erfolg das System herunter If AdjustTokenPrivileges(hToken, 0&, TKP, LenB(TKPOld), TKPOld, Retval) Then Call ExitWindowsEx(EWX_REBOOT, 0&) End If End If Else ' Win95/98 wird ausgeführt. Keine Aktion ist notwendig. Call ExitWindowsEx(EWX_REBOOT, 0&) End If End Sub