Um Windows per Programmcode neu zu starten, kennen Sie sicherlich (fast) alle die API-Funktion ExitWindowsEx. Über einen Parameter gibt man hierbei an, ob
Unter den Betriebssystem Windows 95/98 und ME funktioniert ExitWindowsEx einwandfrei. Wie verhält sich die Funktion aber unter Windows NT/2000? Dieser Tipp stellt Ihnen die Prozedur RebootSystem vor, welche unabhängig vom eingesetzten Betriebssystem ordnungsgemäß arbeitet. Innerhalb der Prozedur wird zunächst das Betriebssystem ermittelt. Handelt es sich um Windows NT/2000, so werden die gerade genannten Vorkehrungen automatisch getroffen, so daß die API-Funktion ExitWindowsEx auch unter WinNT/2000 korrekt funktioniert. ' System herunterfahren/neu starten ' oder aktuellen Benutzer abmelden Public Function RebootSystem(ByVal Action As EWX_ACTION) _ As Boolean Dim ret As Long Dim hToken As Long Dim tkp As TOKEN_PRIVILEGES Dim tkpOld As TOKEN_PRIVILEGES Dim fOkReboot As Boolean 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 Und hier alle benötigten Deklarationen und "Hilfsfunktionen", welche die Hintergrundarbeiten erledigen. 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 End If 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 Beispiel für den Aufruf von RebootSystem ' System herunterfahren und neu starten RebootSystem EWX_REBOOT ' System herunterfahren (ohne Neustart) RebootSystem EWX_SHUTDOWN ' Aktuellen Benutzer abmelden RebootSystem EWX_LOGOFF Dieser Tipp wurde bereits 20.773 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevAniGif (VB/VBA) ![]() Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Tipp des Monats Matthias Kozlowski Umlaute konvertieren Ersetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) TOP Entwickler-Paket ![]() TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR... |
||||||||||||||||
|
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. |
|||||||||||||||||


Sicherer Windows-Neustart (auch unter NT/2000)


