2014-02-27 11 views
2

System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 1")을 사용하여 서버를 재부팅합니다. 이것은 server(win xp)이 즉시 종료되지 않는 것을 알았을 때까지 완벽하게 실행되었습니다. 내 기록에 따르면 응용 프로그램이 shutdown.exe 명령을 실행 한 후 적어도 60 초 동안 실행 중임을 보여줍니다.Shutdown.exe가 시스템을 즉시 종료하지 않는 이유는 무엇입니까?

그래서 어떤 이유/조건/shutdown.exe이 -f가 사용 된 경우에도 시스템을 종료 할 수 없다는 점이 궁금해지기 시작했습니다.

답변

0

대시 대신 슬래시를 사용하십시오. 어떤 문제가있을 경우 /r /f /t 1

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를 호출 할 시도하는 것과 동일한 기능을 수행하지만, 성공에서 종료를 방지 불이행 또는 보안 제한이있는 경우 가장 비판적으로, 예외가 발생합니다.

+0

불행히도 내 응용 프로그램은 윈도우 서비스이며이 API는 데스크톱 응용 프로그램에만 사용됩니다. – ahsant

+0

이것은 'advapi32'의 일부로 서비스에서 확실히 사용할 수 있습니다. 'shutdown.exe'는'InitiateSystemShutdownEx'의 래퍼입니다. – Mitch