<p>前回のFAQ で Windows 9x 系でのログオフ、シャットダウンや再起動の方法を書きましたが、本日はNTのコマンドプロンプトから動作するサンプルプログラムを。以下のコードをShutdown.dprとして保存し、コンパイルしてください。<br />
システムをシャットダウンまたは再起動させるために､ WxitWindowsEx 関数を呼び出すプロセスは <em>AdjustTokenPrivileges</em> 関数を呼び出して、<em>SE_SHUTDOWN_NAME</em> 特権を得ています。</p>
<pre class="brush: delphi">
program Shutdown;

{&#36;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 &lt;&gt; ERROR_SUCCESS) then
    Writeln('AdjustTokenPrivileges');

  // 強制的にアプリケーションを終了させながら、シャットダウンします。
  if (not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)) then
    Writeln('ExitWindowsEx');
end.
</pre>
<p>ExitWindowsExの1番目の引数部分を、先日ご紹介したように以下のように変更することで、ログオフなどを行うことができます。 また、EWX_FORCE を指定することで強制的に処理を進められます。</p>
<pre class="brush: delphi">
// ログオフ
ExitWindowsEx(<em>EWX_LOGOFF</em>, 0);
// シャットダウン
ExitWindowsEx(<em>EWX_SHUTDOWN</em>, 0);
// 再起動
ExitWindowsEx(<em>EWX_REBOOT</em>, 0); 
// POWER OFF
ExitWindowsEx(<em>EWX_POWEROFF</em>, 0);
</pre>