2009-07-31 66 views

回答

50

試試這個:

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

這將啓動Windows的內置shutdown工具,它也可以關閉或註銷遠程或本地計算機。

這裏是所有的選項,從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) 

你可能會注意到,我已經使用通過命令行參數(使用「 - 」)的Linux/UNIX的風格標誌。在Windows上,約定使用'/'。這並不重要 - 程序不關心。

9

另一種方法是使用WMI(即System.Management命名空間);谷歌提出了此代碼的變化 -

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

您可以使用ExitWindowsEx API。從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); 

,並使用它:

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

這是行不通的,除非您還調整進程令牌來獲得關機的權限。請參閱http://ithoughthecamewithyou.com/post/Reboot-computer-in-C-NET.aspx,以獲得正確執行此操作的類。 – 2010-09-11 18:30:55