前回のFAQ で Windows 9x 系でのログオフ、シャットダウンや再起動の方法を書きましたが、本日はNTのコマンドプロンプトから動作するサンプルプログラムを。以下のコードをShutdown.dprとして保存し、コンパイルしてください。
システムをシャットダウンまたは再起動させるために、 WxitWindowsEx 関数を呼び出すプロセスは AdjustTokenPrivileges 関数を呼び出して、SE_SHUTDOWN_NAME 特権を得ています。
program Shutdown; {$APPTYPE CONSOLE} uses SysUtils, Windows; 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.
ExitWindowsExの1番目の引数部分を、先日ご紹介したように以下のように変更することで、ログオフなどを行うことができます。 また、EWX_FORCE を指定することで強制的に処理を進められます。
// ログオフ ExitWindowsEx(EWX_LOGOFF, 0); // シャットダウン ExitWindowsEx(EWX_SHUTDOWN, 0); // 再起動 ExitWindowsEx(EWX_REBOOT, 0); // POWER OFF ExitWindowsEx(EWX_POWEROFF, 0);
コメント (0件)