Tipps und Tricks rund um .NET und Visual Studio

Neustart des Computers auslösen
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Um aus eigener Software heraus einen Neustart des Computers (Reboot) auszulösen, gibt es mehrere Optionen:

  1. Ausführen des Kommandozeilenwerkzeugs shutdown.exe mit der Option /r (über Start eines Prozesses mit System.Diagnostics.Process)
  2. Ausführen des PowerShell Commandlets restart-Computer (über Start von powershell.exe mit System.Diagnostics.Process oder aber das Hosting der PowerShell im .NET-Prozess)
  3. Über die Funktion ExitWindowsEx aus dem Win32-API
  4. Über die Windows-Management-Instrumentation (WMI)-Klasse Win32_OperatingSystem (die es seit Windows 2000 fest ins Betriebssystem eingebaut gibt)

Neustart des Computers – diesen Weg sollten Sie wählen

Weg Nummer 4 ist aus der Sicht von .NET der direkteste. Für Listing 1 ist eine Referenz auf die System.Management.dll – ab .NET 1.0 – notwendig. Im WMI-Pfad ist als Besonderheit „=@“ anstelle der Primärschlüsselattribute zu verwenden, da die WMI-Klasse Win32_OperatingSystem eine so genannte Singleton-Klasse ist, von der es immer nur genau eine Instanz gibt. Diese eine Instanz wird mit dem „@“ angesprochen.

Leider kann man WMI-Methoden nur indirekt über InvokeMethod() aufrufen. Ein direkter Aufruf ist nur möglich, wenn man vorher mit Visual Studio eine .NET-Wrapper-Klasse für die WMI-Klasse Win32_OperatingSystem generiert (Listing 1).

public void RebootComputer(string computer = ".")
{
  // Anstelle des Punkts (lokaler Rechner) auch Rechnername oder IP möglich!
  string path = @"\" + computer + @"rootcimv2:Win32_OperatingSystem=@";

  // Zugriff auf Instanz
  ManagementObject mo = new ManagementObject(path);

  // Wichtig: Ohne diese Rechteerhöhung, wird der Reboot nicht möglich sein
  mo.Scope.Options.EnablePrivileges = true;

  try
  {
    // Reboot-Methode ohne Parameter ausführen
    object ergebnis = mo.InvokeMethod("Reboot", new object[] { });
    // Ergebnis auswerten
    if (ergebnis == null || (unit)ergebnis > 0)
    {
      Console.WriteLine("Reboot nicht möglich.");
    }
    else
    {
      Console.WriteLine("Reboot startet...");
    }
  }
  catch (Exception ex)
  {
    Console.WriteLine("Fehler: " + ex.Message);
  }
}
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -