【问题标题】:Reboot machine from a C#/WPF app从 C#/WPF 应用程序重启机器
【发布时间】:2010-11-15 22:53:37
【问题描述】:

我想在我的 WPF 应用程序中有一个用于重启机器的按钮。此应用始终在 Vista 上运行。

快速搜索没有找到任何东西的事实让我觉得这可能比我希望的要难......有什么想法吗?谢谢!

【问题讨论】:

    标签: c# .net windows reboot


    【解决方案1】:

    试试这个:

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

    这将启动 Windows 的内置 shutdown 工具,该工具还可以关闭或注销远程或本地计算机。

    这里是来自ss64.com 的完整选项列表:

    句法 SHUTDOWN [注销选项] [/m \\计算机] [选项] 注销选项: /i 显示 GUI(必须是第一个选项) /l 注销。这不能与 /m 或 /d 选项一起使用 /s 关机 /r 关闭并重新启动 /a 中止系统关闭。 (仅在超时期间) /p 在没有超时或警告的情况下关闭本地计算机 (仅与 /d) /h 休眠本地计算机(仅使用 /f ) /e 记录计算机意外关闭的原因 选项: /m \\Computer :要关闭的远程计算机。 /t:xxx :系统关闭前的时间(以秒为单位)。 有效范围是 xxx=0-600 秒。 [默认=30] /c "Msg" : 可选的关闭消息 [最多 127 个字符] /f :强制关闭正在运行的应用程序。 这不会在任何打开的应用程序中提示文件保存。 所以会导致所有未保存的数据丢失!!! /d u:xx:yy :列出关机的用户原因代码。 /d P:xx:yy :列出关闭的计划原因代码。 xx 指定主要原因代码 (0-255) yy 指定次要原因代码 (0-65536)

    您可能会注意到我使用了传递命令行参数的 Linux/UNIX 风格(使用“-”)符号。在 Windows 上,约定使用“/”。这没关系 - 程序不在乎。

    【讨论】:

    • 这对windows和linux都比较有用
    【解决方案2】:

    您可以使用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
    ); 
    

    【讨论】:

    • 这将不起作用,除非您还调整进程令牌以获得关闭权限。请参阅 ithoughthecamewithyou.com/post/Reboot-computer-in-C-NET.aspx 了解正确执行此操作的类。
    • 它适用于我,无需设置任何进程令牌。启用 UAC 的 WPF 应用程序,Win7 x64。
    • 您想将第二个参数传递给 ExitWindowsEx,如下所示:ShutdownReason.MajorOther | ShutdownReason.Minor其他 | ShutdownReason.FlagPlanned。使用按位与只会将参数归零。 Shutdown Event Tracker 中将留下系统计划外和未指定关闭的报告。在此处阅读更多信息:msdn.microsoft.com/en-us/library/windows/desktop/…
    • @DerekW:感谢您指出错字并建议FlagPlanned。我已编辑答案以纳入您的建议。
    • @RobertEllison 它确实在 Windows 7 上作为管理员工作,但在我现在看到的 Windows 10 上不再工作。错误 1314。
    【解决方案3】:

    另一种方法是使用 WMI(即 System.Management 命名空间); Google 提供了此代码的变体 --

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

    【讨论】:

      【解决方案4】:

      Windows 服务中的工作代码:

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

      【讨论】:

        猜你喜欢
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 2013-08-09
        • 1970-01-01
        • 2016-10-15
        相关资源
        最近更新 更多