我正在使用System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")
重新启动服务器。直到最近我注意到它server(win xp)
并没有立即关闭时,它一直运行良好。shutdown.exe
我的日志显示应用程序在命令后至少 60 秒运行。
所以我开始怀疑是否有任何原因/条件/等shutdown.exe
无法关闭系统,即使使用了 -f 也是如此。
我正在使用System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")
重新启动服务器。直到最近我注意到它server(win xp)
并没有立即关闭时,它一直运行良好。shutdown.exe
我的日志显示应用程序在命令后至少 60 秒运行。
所以我开始怀疑是否有任何原因/条件/等shutdown.exe
无法关闭系统,即使使用了 -f 也是如此。
您可以直接调用 API,而不是调用可执行文件
[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
该类,该类发布在 MSDN 杂志文章中,可从文章链接下载。
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
,但最关键的是,如果存在任何阻止关闭成功的故障或安全限制,它将引发异常。
尝试使用斜线而不是破折号。/r /f /t 1