▼ Mr.XRAYさん
こんなコードがあったとします。
{===============================================================================
Windowsをシャットダウンさせる。
===============================================================================}
procedure TFrmSet.Shutdown;
var
hToken: THandle;
tkp: TTokenPrivileges;
dwRet: DWORD;
begin
// このプロセスのためのトークンを取得。
if (not OpenProcessToken(GetCurrentProcess,
(TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY), hToken)) then
Writeln('OpenProcessToken');
// シャットダウンに必要な権限を取得。
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1; // one privilege to set
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
dwRet := 0;
// シャットダウンプロセスに必要な特権を取得。
AdjustTokenPrivileges(hToken, false, tkp, 0, nil, dwRet);
// AdjustTokenPrivilegesの戻り値をチェック。
if (GetLastError <> ERROR_SUCCESS) then
Writeln('AdjustTokenPrivileges');
// 強制的にアプリケーションを終了させながら、シャットダウン。
if (not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)) then
Writeln('ExitWindowsEx');
end;
これ、おそらくUACにひっかかってダメだと思っていたのですが、すんなり
通ってシャットダウンしました。多分「シャットダウンプロセスに必要な特権
を取得します。」あたりで引っかかると思っていたのに意外でした。
※コード悪用厳禁
|