Um aus eigener Software heraus einen Neustart des Computers (Reboot) auszulösen, gibt es mehrere Optionen:
  
- ausführen des Kommandozeilenwerkzeugs shutdown.exe mit der Option /r (über Start eines Prozesses mit System.Diagnostics.Process)
 - 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)
 - über die Funktion ExitWindowsEx aus dem Win32-API
 - über die Windows Management Instrumentation (WMI)-Klasse Win32_OperatingSystem (die es seit Windows 2000 fest ins Betriebssystem eingebaut gibt)
 
Ich finde den vierten Weg gut (u.a. weil ich ein WMI-Fan bin). Hier der Programmcode in C# (es ist eine Referenz auf die System.Management.dll – verfügbar ab .NET 1.0 – notwendig):
// Anstelle des Punktes (lokaler Rechner) auch Rechnername oder IP möglich
ManagementObject mo = new ManagementObject(@"\\.↵
\root\cimv2:Win32_OperatingSystem=@");  
// 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 || (uint)ergebnis > 0)    
     {      Console.WriteLine("Reboot nicht möglich.");     }     
   else    
     {      Console.WriteLine("Reboot startet...");     }    }    
catch (Exception ex)    
    {     Console.WriteLine("Fehler: " + ex.Message);    }
()