아래소스는 민성기 님이 올려주신 winnt 자동종료 소스입니다.
그런데 아래소스를 이용해서 종료를 하면 "이제 윈도우의 전원을 끄도 됩니다."
하는 메세지가 나타나고 자동종료는 되지를 않습니다.
다른 종료 알람 프로그램으로는 제대로 종료가 되거든요.
그리고 시작버턴을 누르고 윈도우 종료를 선택해주면 역시 자동종료가 됩니다.
질답게시판을 뒤져보며 이렇게 저렇게 해봐도 되지를 않는군요.
델파이로는 자동종료가 불가능한가요?
잘아시는 분 계시면 답변 부탁드리겠습니다.
procedure SystemOffWindowsNT;
var
PreviosPrivileges : ^TTokenPrivileges;
TokenPrivileges : TTokenPrivileges;
ProcessHandle : THandle;
nTmp : DWORD;
begin
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, ProcessHandle ) then
Exit;
LookupPrivilegeValue( '', 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid );
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
nTmp := 0;
PreviosPrivileges := nil;
AdjustTokenPrivileges( ProcessHandle, False, TokenPrivileges, 0, PreviosPrivileges^, nTmp );
if not GetLastError() = ERROR_SUCCESS then
Exit;
if not InitiateSystemShutdown( '', '', 0, True, False ) then
Exit;
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges( ProcessHandle, False, TokenPrivileges, 0,PreviosPrivileges^, nTmp );
end;
XP에서 잘 실행됩니다.
Procedure TForm1.WindowsShutDown;
var
hProc,hToken : THandle;
mLUID : Int64;
mPriv,mNewPriv : TTokenPrivileges;
begin
hProc := GetCurrentProcess();
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken);
LookupPrivilegeValue('', 'SeShutdownPrivilege', mLUID);
mPriv.PrivilegeCount := 1;
mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
mPriv.Privileges[0].Luid := mLUID;
AdjustTokenPrivileges(hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount),
mNewPriv, mNewPriv.PrivilegeCount);
ExitWindowsEx(EWX_POWEROFF, 0);
end;