C++ Builder Snippets  

Windows beenden, Rechner herunterfahren:
 
//---------------------------------------------------------------------------
// Mit Hilfe der Funktion ShutdownWindows(UINT ilFlag) kann Windows je nach
// Wert des Parameters ilFlag heruntergefahren oder neu gestartet werden
//---------------------------------------------------------------------------
// Parameter ilFlag kann folgende Werte annehmen:
//
// EWX_LOGOFF      Schließt alle Anwendungen und loggt den Benutzer aus
// EWX_POWEROFF    Schaltet den Rechner aus (sofern von der Hardware unterstützt)
// EWX_REBOOT      Bootet den Rechner neu
// EWX_SHUTDOWN    Fährt Windows herunter, ohne neu zu booten
//---------------------------------------------------------------------------
// Die ExitWindowsEx Funktion startet Shutdown-Prozess und kehrt anschließend 
// zur aufrufenden Funktion zurück. Shutdown wird erst nach einiger Zeit, 
// nach dem die Funktion einen Wert zurückgegeben hat, abgeschlossen. 
//
// ShutdownWindows() gibt true ("alles ok") oder false ("Fehler aufgetreten") 
// zurück.
//---------------------------------------------------------------------------

bool ShutdownWindows(UINT ilFlag)
{
  bool blRetVal = true;                 // Rückgabewert
  TOKEN_PRIVILEGES stTokenPriviledges;
  HANDLE hProcToken;                    // Prozess Token

  // auf NT-Platform prüfen
        OSVERSIONINFO stVerInfo;
  stVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&stVerInfo);

  // falls NT/2000:
  if(stVerInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
  {
    // Prozess Token besorgen
    blRetVal = OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hProcToken);

    if(blRetVal)
    {
      // LUID für Shutdown Privilege besorgen
      blRetVal = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &stTokenPriviledges.Privileges[0].Luid);
      stTokenPriviledges.PrivilegeCount=1;
      stTokenPriviledges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    }

    if(blRetVal)
    {
      // Shutdown privilege aktuellem Prozess geben
      blRetVal = AdjustTokenPrivileges(hProcToken, false, &stTokenPriviledges,
        0, (PTOKEN_PRIVILEGES)NULL, 0);
    }
  }
  // Windows beenden:
  if(blRetVal)
    blRetVal = ExitWindowsEx(ilFlag, NULL);

  return blRetVal;
}




© '99-2000 by S. Kreutzmann