2009-07-31 15 views
25

Chcę mieć przycisk w mojej aplikacji WPF, który ponownie uruchamia maszynę. Ta aplikacja zawsze działa w systemie Vista.Uruchom ponownie komputer z aplikacji C#/WPF

Fakt, że szybkie wyszukiwanie niczego nie zmieniło, sprawia, że ​​myślę, że to może być trudniejsze, niż bym chciał ... Jakieś pomysły? Dzięki!

Odpowiedz

50

Spróbuj tego:

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

Zaczyna wbudowana shutdown narzędzie Windows', który może również zamknąć lub wylogowanie zdalnym lub lokalnym.

Oto lista pełnych opcji z 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) 

będzie zauważyć, że użyłem styl Linux/Unix przechodzącej argumenty wiersza polecenia (przy użyciu „-”) znak. W systemie Windows konwencja używa "/". To nie ma znaczenia - program nie obchodzi.

9

Alternatywą byłoby wykorzystanie WMI (tj. Przestrzeni nazw System.Management); Google wywołuje odmiany tego kodu -

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

Możesz użyć interfejsu API ExitWindowsEx. Od 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); 

I z niego korzystać:

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

To nie będzie działać, chyba że także dostosować token procesu zamykania systemu, aby uzyskać uprawnienia. Zobacz http://ithoughthecamewithyou.com/post/Reboot-computer-in-C-NET.aspx dla klasy, która robi to poprawnie. –

+0

To działa dla mnie bez ustawiania żadnego tokena procesu. Aplikacja WPF z włączoną funkcją UAC, Win7 x64. – RandomEngy

+0

Chcesz przekazać drugi parametr do ** ExitWindowsEx ** w ten sposób: ** ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned **. Użycie bitowego ORAZ spowoduje wyzerowanie argumentu. System zostanie pozostawiony z raportem o nieplanowanym i nieokreślonym zamknięciu w * Śledzeniu zdarzeń zamknięcia systemu *. Przeczytaj więcej tutaj: http://msdn.microsoft.com/en-us/library/windows/desktop/aa376885(v=vs.85).aspx –