我正在使用System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")
重新啓動服務器。當我注意到server(win xp)
沒有立即關閉時,它最近運行得很完美。我的日誌顯示應用程序在shutdown.exe
命令後至少運行了60秒。Shutdown.exe沒有立即關閉系統,爲什麼?
所以我開始懷疑是否有任何原因/條件/等,即使使用-f,shutdown.exe
也無法關閉系統。
我正在使用System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")
重新啓動服務器。當我注意到server(win xp)
沒有立即關閉時,它最近運行得很完美。我的日誌顯示應用程序在shutdown.exe
命令後至少運行了60秒。Shutdown.exe沒有立即關閉系統,爲什麼?
所以我開始懷疑是否有任何原因/條件/等,即使使用-f,shutdown.exe
也無法關閉系統。
嘗試使用斜槓代替破折號。 /r /f /t 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.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
做什麼,但最關鍵的,如果有任何故障或安全限制,防止關機得手將拋出一個異常。
不幸的是我的應用程序是窗口服務,我相信這個API只適用於桌面應用程序。 – ahsant
這是'advapi32'的一部分,從服務中絕對可用。 'shutdown.exe'只是'InitiateSystemShutdownEx'上的一個包裝。 – Mitch