我正在使用System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")重新引导服务器。直到最近我发现server(win xp)不会立即关闭时,它运行得非常好。我的日志显示应用程序在shutdown.exe命令之后至少运行60秒。

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

最佳答案

除了调用可执行文件,您还可以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.Privelege类,该类was 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来执行的功能相同的功能,但是最关键的是,如果存在任何故障或安全性限制而无法成功执行关闭操作,则将引发异常。

关于c# - Shutdown.exe没有立即关闭系统,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22058586/

10-10 22:09