2009-07-31 37 views
25

Quiero tener un botón en mi aplicación WPF que reinicie la máquina. Esta aplicación siempre se ejecuta en Vista.Reiniciar la máquina desde una aplicación C#/WPF

El hecho de que una búsqueda rápida no haya cambiado nada me hace pensar que esto podría ser más difícil de lo que desearía ... ¿alguna idea? ¡Gracias!

Respuesta

50

Prueba esto:

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

Esta herramienta comienza shutdown incorporado de Windows', que también se puede apagar o cerrar la sesión un mando a distancia o la máquina local.

Aquí está la lista de opciones completas de ss64.com:

 
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) 

Probablemente notará que he utilizado el de Linux/UNIX de pasar argumentos de línea de comandos (a través del '-') señal. En Windows, la convención está usando '/'. Esto no importa: al programa no le importa.

9

Una alternativa sería utilizar WMI (es decir, el espacio de nombres System.Management); Google nos lleva a variaciones en el código -

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); 
    } 
20

Puede utilizar la API de ExitWindowsEx. De 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); 

Y utilizarlo:

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

Esto no funcionará a menos que también ajustar el testigo de proceso para obtener privilegios de apagado. Consulte http://ithoughthecamewithyou.com/post/Reboot-computer-in-C-NET.aspx para obtener una clase que lo haga correctamente. –

+0

Funciona para mí sin configurar ningún token de proceso. Aplicación WPF con UAC habilitado, Win7 x64. – RandomEngy

+0

Quiere pasar el segundo parámetro a ** ExitWindowsEx ** como este: ** ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned **. Usar el bit a nivel AND simplemente pondrá a cero el argumento. El sistema se quedará con el informe de un cierre no planificado y no especificado en * Shutdown Event Tracker *. Lea más aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/aa376885(v=vs.85).aspx –

Cuestiones relacionadas