Ich hab da irgendwo mal einen COde gefunden, aber noch nicht probiert, ob das so funktioniert...
Option Explicit
' Windows-Version
' für den Aufruf der GetVersionEx-Funktion
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 Declare Function GetVersionEx Lib "Kernel32" Alias "GetVersionExA" ( _
lpVersionInformation As OSVERSIONINFO) As Long
'System beenden + neu starten
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
ByVal dwReserved As Long) As Long
Public Enum EWX_ACTION
EWX_LOGOFF = 0
EWX_SHUTDOWN = 1
EWX_REBOOT = 2
End Enum
'Für Windows NT/2000
Private Const ANYSIZE_ARRAY = 1
Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LARGE_INTEGER
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Const TOKEN_ADJUST_PRIVILEGES = 32
Private Const TOKEN_QUERY = 8
Private Const SE_PRIVILEGE_ENABLED As Long = 2
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 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
'Aktuelle Windows-Plattform ermitteln
Private Function GetWinPlatform() As Long
Dim osvi As OSVERSIONINFO
Dim strCSDVersion As String
osvi.dwOSVersionInfoSize = Len(osvi)
If GetVersionEx(osvi) = 0 Then Exit Function
GetWinPlatform = osvi.dwPlatformId
End Function
'Prüfen, ob Windows NT/2000
Public Function IsWindowsNT() As Boolean
Const dwMaskNT = &H2&
IsWindowsNT = (GetWinPlatform() And dwMaskNT)
End Function
'System herunterfahren/neu starten
'oder aktuellen Benutzer abmelden
Public Function RebootSystem(ByVal Action As EWX_ACTION) As Boolean
Dim fOkReboot As Boolean
Dim ret As Long
Dim hToken As Long
Dim tkp As TOKEN_PRIVILEGES
Dim tkpOld As TOKEN_PRIVILEGES
Const sSHUTDOWN As String = "SeShutdownPrivilege"
If IsWindowsNT() Then
' Windows NT wird ausgeführt.
' Sicherheitsüberprüfungen und
' Veränderungen sind jetzt notwendig,
' um sicherzustellen, daß das Token
' vorhanden ist, das einen Neustart zuläßt.
If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY, hToken) Then
ret = LookupPrivilegeValue(vbNullString, sSHUTDOWN, tkp.Privileges( _
0).pLuid)
tkp.PrivilegeCount = 1
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
fOkReboot = AdjustTokenPrivileges(hToken, 0, tkp, LenB(tkpOld), tkpOld, _
ret)
End If
Else
' Win95/98 wird ausgeführt. Keine Aktion ist notwendig.
fOkReboot = True
End If
If fOkReboot Then RebootSystem = (ExitWindowsEx(Action, 0) <> 0)
End Function MfG
CyberDreams |