VC++ SE_INC_BASE_PRIORITY_NAME特権の取得 【やってみた】


OpenProcessToken

この関数は、MSDNによると

プロセスに関連付けられているアクセストークンを開きます。

とのことである。アクセストークンというのが何かはよくわからないが、ユーザーのセキュリティに関する情報であることは確かである。ここでは、TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGESという特権を取得してみた。

スポンサーリンク
これらは、ここのシャットダウンに関する説明を元にすると

この時に特権を変更できるアクセス(TOKEN_ADJUST_PRIVILEGES)と、情報を取得するためのアクセス(TOKEN_QUERY)を指定しています。

とのことである。TOKEN_QUERYをはずすと後のAdjustTokenPrivilegesで引っかかる(FALSE)が帰ってきたりする。ちなみに、3番目の引数は関数が成功した場合トークンのハンドルが返ってくるが必要なくなった時に当然CloseHandleする必要がある。

LookupPrivilegeValue

この関数は、MSDNによると

指定されたシステムで使われているローカル一意識別子(LUID)を取得し、指定された特権名をローカルで表現します。

とのことである。今回は、SE_INC_BASE_PRIORITY_NAMEのLUIDを取得するということでこれを使っている。実際関数を使ってみると

Luid {LowPart=14 HighPart=0 } _LUID

このような値が返ってきた。

AdjustTokenPrivileges

最後に使うこの関数は、MSDNによると

指定したアクセストークン内の特権を有効または無効にします。TOKEN_ADJUST_PRIVILEGES アクセス権が必要です。

とのことである。TOKEN_ADJUST_PRIVILEGESは、先に指定しているので問題ないだろう。今回の場合特権を得るため、 BOOL DisableAllPrivilegesはFALSEにしておく必要がある。NewStateで新しい特権を設定しPreviousStateで元の状態を受け取る。元の状態が特にいらない場合は特に設定しなくてもよいとのこと。

コード

最終的にはこのような流れになる。チェックは各自作っていただければ。

一連の流れは、ExitWindowsEx( EWX_SHUTDOWN, 0 );を使う場合にも応用できる。

スポンサーリンク
カテゴリー: やってみた   パーマリンク

VC++ SE_INC_BASE_PRIORITY_NAME特権の取得 への1件のコメント

  1. ピンバック: VC++ Get&SetProcessWorkingSetSizeの使い方 | 豆知識