대신 실행에 부르고, 당신은 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