41 Stimmen

Neustart des Rechners aus einer C#/WPF-Anwendung

Ich möchte eine Schaltfläche in meiner WPF-Anwendung haben, die die Maschine neu startet. Diese Anwendung wird immer auf Vista ausgeführt.

Die Tatsache, dass eine schnelle Suche nichts ergeben hat, lässt mich denken, dass dies schwieriger sein könnte, als ich es mir wünsche... irgendwelche Ideen? Danke!

81voto

Lucas Jones Punkte 19251

Versuchen Sie dies:

System.Diagnostics.Process.Start("shutdown.exe", "-r -t 0");

Dies startet die Windows-eigene shutdown das auch einen entfernten oder lokalen Rechner herunterfahren oder abmelden kann.

Hier ist die Liste der vollständigen Optionen von ss64.de :

Syntax

      SHUTDOWN \[logoff\_option\]  \[/m \\\\Computer\] \[options\]

logoff\_option:
    /i         Display the GUI (must be the first option)
    /l         Log off. This cannot be used with /m or /d option
    /s         Shutdown
    /r         Shutdown and Restart
    /a         Abort a system shutdown.
               (only during the time-out period)
    /p         Turn off the local computer with no time-out or warning
               (only with /d)
    /h         Hibernate the local computer (only with /f )
    /e         Document the reason for an unexpected shutdown of a computer

Options:

   /m \\\\Computer  : A remote computer to shutdown.

   /t:xxx         : Time until system shutdown in seconds. 
                    The valid range is xxx=0-600 seconds. \[default=30\]
   /c "Msg"       : An optional shutdown message \[Max 127 chars\]

   /f             : Force running applications to close.
                    This will not prompt for File-Save in any open applications.
                    so will result in a loss of all unsaved data!!!

   /d u:xx:yy     : List a USER reason code for the shutdown. 
   /d P:xx:yy     : List a PLANNED reason code for the shutdown.
                     xx Specifies the major reason code (0-255)
                     yy Specifies the minor reason code (0-65536)

Sie werden wahrscheinlich bemerken, dass ich den Linux/UNIX-Stil der Übergabe von Befehlszeilenargumenten (unter Verwendung des Zeichens '-') verwendet habe. Unter Windows ist es üblich, '/' zu verwenden. Das spielt keine Rolle - dem Programm ist das egal.

3 Stimmen

Dies ist sowohl für Windows als auch für Linux sinnvoller

23voto

Martin Liversage Punkte 100306

Sie können die ExitWindowsEx API. Von pinvoke.net

[Flags]
public enum ExitWindows : uint
{
   // ONE of the following five:
   LogOff = 0x00,
   ShutDown = 0x01,
   Reboot = 0x02,
   PowerOff = 0x08,
   RestartApps = 0x40,
   // plus AT MOST ONE of the following two:
   Force = 0x04,
   ForceIfHung = 0x10,
}

[Flags]
enum ShutdownReason : uint
{
    MajorApplication = 0x00040000,
    MajorHardware = 0x00010000,
    MajorLegacyApi = 0x00070000,
    MajorOperatingSystem = 0x00020000,
    MajorOther = 0x00000000,
    MajorPower = 0x00060000,
    MajorSoftware = 0x00030000,
    MajorSystem = 0x00050000,

    MinorBlueScreen = 0x0000000F,
    MinorCordUnplugged = 0x0000000b,
    MinorDisk = 0x00000007,
    MinorEnvironment = 0x0000000c,
    MinorHardwareDriver = 0x0000000d,
    MinorHotfix = 0x00000011,
    MinorHung = 0x00000005,
    MinorInstallation = 0x00000002,
    MinorMaintenance = 0x00000001,
    MinorMMC = 0x00000019,
    MinorNetworkConnectivity = 0x00000014,
    MinorNetworkCard = 0x00000009,
    MinorOther = 0x00000000,
    MinorOtherDriver = 0x0000000e,
    MinorPowerSupply = 0x0000000a,
    MinorProcessor = 0x00000008,
    MinorReconfig = 0x00000004,
    MinorSecurity = 0x00000013,
    MinorSecurityFix = 0x00000012,
    MinorSecurityFixUninstall = 0x00000018,
    MinorServicePack = 0x00000010,
    MinorServicePackUninstall = 0x00000016,
    MinorTermSrv = 0x00000020,
    MinorUnstable = 0x00000006,
    MinorUpgrade = 0x00000003,
    MinorWMI = 0x00000015,

    FlagUserDefined = 0x40000000,
    FlagPlanned = 0x80000000
}

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

Und sie zu benutzen:

ExitWindowsEx(
  ExitWindows.Reboot,
  ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned
);

9 Stimmen

Dies wird nicht funktionieren, wenn Sie nicht auch das Prozess-Token anpassen, um die Rechte zum Herunterfahren zu erhalten. Siehe ithoughthecamewithyou.com/post/Reboot-computer-in-C-NET.aspx für eine Klasse, die dies richtig macht.

0 Stimmen

Bei mir funktioniert es, ohne dass ein Prozess-Token gesetzt wird. WPF-Anwendung mit UAC aktiviert, Win7 x64.

1 Stimmen

Sie möchten den zweiten Parameter an ExitWindowsEx wie diese: ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned . Bei der Verwendung des bitweisen AND wird das Argument einfach auf Null gesetzt. Das System wird mit dem Bericht über eine ungeplante und nicht spezifizierte Abschaltung in der Shutdown Event Tracker . Lesen Sie hier mehr: msdn.microsoft.com/de-us/library/Windows/desktop/

10voto

Steve Gilham Punkte 10979

Eine Alternative wäre die Verwendung von WMI (d. h. der System.Management Namespace); Google zeigt Variationen dieses Codes an --

  ManagementClass W32_OS = new ManagementClass("Win32_OperatingSystem")
  ManagementBaseObject inParams, outParams;
  int result;
  W32_OS.Scope.Options.EnablePrivileges = true;

  foreach(ManagementObject obj in W32_OS.GetInstances())
  {
    inParams = obj.GetMethodParameters("Win32Shutdown");
    inParams["Flags"] = 6; //ForcedReboot; -- fixed to restart rather than shutdown
    inParams["Reserved"] = 0;

    outParams = obj.InvokeMethod("Win32Shutdown", inParams, null)
    result = Convert.ToInt32(outParams["returnValue"]);
    if (result !=0) throw new Win32Exception(result);
  }

1voto

Johann Medina Punkte 574

Arbeitscode innerhalb eines Windows-Dienstes:

var cmd = new System.Diagnostics.ProcessStartInfo("shutdown.exe", "-r -t 0");
cmd.CreateNoWindow = true;
cmd.UseShellExecute = false;
cmd.ErrorDialog = false;
System.Diagnostics.Process.Start(cmd);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X