現在のユーザーをログオフさせるか、システムをシャットダウンさせるか、システムをシャットダウンさせて再起動させるか、いずれかを行い
関数定義
Private Declare Function
ExitWindowsEx Lib "user32.dll" (ByVal uFlags As Long,
ByVal dwReserved As Long) As Long
関数の仕様
現在のユーザーをログオフ/シャットダウン/再起動の、いずれかを行う。
この関数は、指定により全てのアプリケーションへ WM_QUERYENDSESSION メッセージを送信して、それらのアプリケーションを終了できるかどうかを判断
入力パラメータ
uFlags:シャットダウンのタイプ(次の値のいずれか)を指定
EWX_LOGOFF: 現在のユーザーをログオフ
EWX_POWEROFF: システムをシャットダウンした後、電源を切る
EWX_REBOOT: システムを再起動
EWX_SHUTDOWN: システムをシャットダウンして、電源を切っても安全な状態にする
EWX_FORCE: 強制終了。上記の値と組み合わせて使用する(論理和)
現在実行されているアプリケーションへ WM_QUERYENDSESSION や WM_ENDSESSION メッセージを送信しない。
プロセスを強制的に終了する結果、アプリケーションがデータを失う可能性もあるので、緊急時にのみ指定。
dwReserved:未使用
戻り値
関数が成功すると、0 以外の値、失敗すると、0 が返る
現在のプロセスに対応する疑似ハンドルを取得
関数定義
Private Declare Function GetCurrentProcess Lib "KERNEL32.DLL" () As Long
入力パラメータ
無し
戻り値
現在のプロセスの疑似ハンドルが返る
解説
疑似ハンドルとは、現在のプロセスのハンドルと解釈される特別な定数のこと。
呼び出し側プロセスがプロセスハンドルを 必要とする関数を呼び出す場合、この疑似ハンドルを使ってそのプロセス自身を指定できる。
子プロセスは、擬似ハンドルを継承 しない。
擬似ハンドルには、プロセスオブジェクトに対するアクセス権として、可能な範囲で最大の権利が割り当てられる。
プロセスに関連付けられているアクセストークンを開く
関数定義
Private Declare Function OpenProcessToken Lib "advapi32.dll" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As
Long, TokenHandle As Long) As Long
入力パラメータ
ProcessHandle:開くアクセストークンを保持するプロセスを識別するハンドル
DesiredAccess:アクセストークンの要求アクセス
タイプを指定するアクセスマスクを指定。これらの要求アクセスタイプをトークンの
DACL(随意アクセス制御リスト)と比較して、どのアクセスが許可され、どのアクセスが拒否されるかを決定する。
TokenHandle:この関数から制御が戻ったときに、新しく開かれたアクセストークンを識別するハンドルへのポインタを指定。
戻り値
関数が成功すると、0 以外の値が返る。
指定したアクセストークン内の特権を有効または無効にする。
TOKEN_ADJUST_PRIVILEGES アクセス権が必要
関数定義
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" _
(ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Long, _
PreviousState As TOKEN_PRIVILEGES, _
ReturnLength As Long) As Long
入力パラメータ
TonHandle更したい特権を保持するアクセストークンを指定。
このハンドルは、トークンに対する TOKEN_ADJUST_PRIVILEGES
アクセス権を備えていなければならない。PreviousState パラメータが NULL
ではない場合、このハンドルは TOKEN_QUERY アクセス権も必要。
DisableAllPrivilegesトークンのすべての特権を無効にするかどうかを指定。
この値が TRUE の場合、関数はすべての特権を無効にし、NewState パラメータを無視する。FALSE
の場合、この関数は NewState パラメータが指す情報に基づいて特権に変更を加える。
NewState:特権とその属性からなる配列をTOKEN_PRIVILEGES 構造体へのポインタを指定。
DisableAllPrivileges パラメータが FALSEの場合、AdjustTokenPrivileges
関数は配列内の値に従って、トークンの特権を有効または無効にする。ある特権の SE_PRIVILEGE_ENABLED
属性をセットしておくと、その特権が有効になります。属性をクリアしておくと、特権が無効になる。
DisableAllPrivileges が TRUE の場合、関数はこのパラメータを無視します。
BufferLength:PreviousState
パラメータが指すバッファのサイズをバイト単位で指定。
PreviousState パラメータが NULL の場合、このパラメータは 0 でもかまわない。
PreviousState:この関数の変更対象となる特権
の、従来の状態を保持する TOKEN_PRIVILEGES
構造体を受け取るバッファへのポインタを指定。このパラメータは、NULL でもかまわない。
指定したバッファが小さすぎて、変更後の特権の完全なリストを受け取れない場合、関数は失敗し、どの特権も調整されない。そ
の場合、ReturnLength
パラメータが指す変数の値は、変更後の特権の完全なリストを保持するために必要なバイト数に設定。
ReturnLength:PreviousStateパラメータが指すバッファが必要とするバイト数を受け取る変数へのポインタを指定。
PreviousState が NULL の場合、このパラメータは NULL でもかまわない。
戻り値
関数が成功すると、0 以外の値が返る。
補足
・アクセストークン:Access Tokenとは、Windows2003(WindowsNT系)ネットワークで使用されるユーザーのセキュリティ識別情報
・NT系のシャットダウンの手順:
通常のプロセスの場合、シャットダウンの権限が無いので、自分自身にその特権を付与する。
そのためには、自分自身のプロセスハンドルを取得し、そのハンドルのアクセストークンに対してシャットダウンの特権を付与す る。