vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Windows/System22.03.05
AdjustTokenPrivileges-Funktion

Diese Funktion aktiviert oder deaktiviert ein Privileg eines angegebenen Zugriffs-Token.

Betriebssystem:  WinNT 3.1, WinNT 3.1, Win2000Views:  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:
TokenHandleErwartet den Handle des Tokens dessen Privilegien geändert werden sollen.
DisableAllPrivilegesErwartet "False" wenn alle Privilegien des Tokensdeaktiviert werden sollen (NewState wird ignoriert) oder "True", wenn die bei "NewState" angegebenen Privilegienaktiviert werden sollen.
NewStateErwartet 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.
BufferLengthErwartet die Größe des Puffers der bei "Previous_State" übergeben wird in Bytes.
PreviousStateErwartet 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.
ReturnLengthErwartet 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.

Rückgabekonstanten:
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

 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.