윈도우를 종료시키는 방법에 대해서 알아 보겠습니다.
어플리케이션에서 윈도우를 종료하는 거라면, ExitWindowsEx 를 사용하면 됩니다.

그런데, 만약 어플리케이션이 아니라, 윈도우 서비스로 돌고있는 녀석이 있다고 가정해 봅시다.
그리고 이 서비스에서 윈도우를 종료시키려고 합니다.

이때, ExitWindowsEx 를 사용하면, 제대로 동작하지 않습니다. 아니, 아무런 반응도 없습니다.
그럼 어떻게 해야 할까요...?

아래와 같이 권한을 먼저 얻은 뒤에 호출해 주면 됩니다. :)

[Service 에서 동작하는 System Off 하는 코드]


BOOL GrabPrivilege (LPCTSTR lpctPrivName) 
{
	TOKEN_PRIVILEGES newtkp;
	HANDLE hToken;
	BOOL   bRetVal = FALSE;

	if (OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
	{
		LookupPrivilegeValue (NULL, lpctPrivName,  &newtkp.Privileges[0].Luid);
		newtkp.PrivilegeCount = 1;
		newtkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

		if (AdjustTokenPrivileges (hToken, FALSE, &newtkp, 0, (PTOKEN_PRIVILEGES) NULL, 0))
		{
			DWORD dwRet = GetLastError();
			if (dwRet == ERROR_SUCCESS) { bRetVal = TRUE; }
		}
	}
	CloseHandle (hToken);
	return bRetVal;
}



BOOL system_exit() {
	if (GrabPrivilege (SE_SHUTDOWN_NAME)) {
		if (ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0)) {
			return TRUE;
		}
	}

	return FALSE;
}