Shutdown.exe не выключает систему сразу, почему?
Я использую System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")
перезагрузить сервер. Это было совершенно до недавнего времени, когда я заметил server(win xp)
не сразу выключается. Мои журналы показали, что приложение работало как минимум через 60 секунд после shutdown.exe
команда.
поэтому я начал задаваться вопросом, есть ли причина / условие / и т.д., что shutdown.exe
не смог выключить систему, даже если -f был использован.
2 ответа
Вместо вызова исполняемого файла вы можете вызвать 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