Shutdown.exe没有立即关闭系统,为什么?

时间:2014-02-27 03:45:13

标签: c# window system-shutdown

我正在使用System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")来重启服务器。最近,当我注意到server(win xp)没有立即关闭时,这种情况完全没有运行。我的日志显示应用程序在shutdown.exe命令后至少运行60秒。

所以我开始怀疑是否有任何原因/条件/等shutdown.exe无法关闭系统,即使使用了-f。

2 个答案:

答案 0 :(得分:1)

您可以call the API directly

而不是呼叫可执行文件
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool InitiateSystemShutdownEx(
    string lpMachineName,
    string lpMessage,
    uint dwTimeout,
    bool bForceAppsClosed,
    bool bRebootAfterShutdown,
    uint dwReason);

如果存在问题,该异常应指向正确的方向。例如,您必须拥有SeShutdownPrivilege并且必须启用它。

考虑到特权时,完整代码应如下所示。注意:这假定使用System.Security.AccessControl.Privelegewas released in an MSDN magazine article,可供下载as linked from the article

Privilege.RunWithPrivilege(Privilege.Shutdown, true, (_) =>
{
    if (!NativeMethods.InitiateSystemShutdownEx(null /* this computer */,
        "My application really needs to restart",
        30 /* seconds */, true /* force shutdown */,
        true /* restart */, 0x4001 /* application: unplanned maintenance */))
    {
        throw new Win32Exception();
    }
}, null);

这将通过调用shutdown.exe执行与您尝试执行的操作相同的功能,但最重要的是,如果存在任何阻止关闭成功的失败或安全限制,则会抛出异常。

答案 1 :(得分:0)

尝试使用斜杠而不是破折号。 /r /f /t 1