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

Другие вопросы по тегам