2

MSDN の記事「C++での特権の有効化と無効化」では、アクセス トークンで特権を有効または無効にする方法を示すコード例が提供されています。

問題の部分を引用します。

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
    tp.Privileges[0].Attributes = 0;


Attributesメンバーのゼロ値の意味は何ですか?

TOKEN_PRIVILEGES構造のドキュメントによると、特権の属性は次の値の組み合わせにすることができます。

  • SE_PRIVILEGE_ENABLED  ( では0x00000002LですWinNT.h)
  • SE_PRIVILEGE_ENABLED_BY_DEFAULT  ( では0x00000001LですWinNT.h)
  • SE_PRIVILEGE_REMOVED  ( では0x00000004LですWinNT.h)
  • SE_PRIVILEGE_USED_FOR_ACCESS  ( では0x80000000LですWinNT.h)

したがって、値がゼロの有効な定数はありません。ゼロは に等しいと思いSE_PRIVILEGE_REMOVEDます。

繰り返しますが、ゼロがすべての権限を無効にすることを意味する場合、 AdjustTokenPrivileges()DisableAllPrivilegesパラメーターを に設定するだけですべての権限を無効にできるので、私はそれを疑っています。TRUE

ゼロ値が実際に何をするのか説明できる人 はいますか?

4

2 に答える 2

4

権限を無効にして後で再度有効にすることと、トークンから権限を削除することには違いがあります。権限を削除すると、後で再度有効にすることはできなくなります。

ゼロを渡すと、SE_PRIVILEGE_ENABLEDビットが設定されていないことを意味するため、その特権は無効になります。

トークンには、作成時に多くの特権が含まれています。ローカル セキュリティ ポリシー/グループ ポリシーのSeChangeNotifyPrivilege[ユーザー権利の割り当て] セクションで「走査チェックのバイパス」と呼ばれる は、既定で常に有効になっており、無効にすることはできません (詳細については、 KB823659を​​参照してください)。したがって、このDisableAllPrivilegesパラメーターは実際には役に立ちません。

ユーザー アカウント制御 (Windows Vista 以降) は、生のログオン トークンを取得して複製し、SE_PRIVILEGE_REMOVEDフラグを使用して、シェルの起動に使用される「フィルター処理されたトークン」を作成します。生のトークンは、「管理者として実行」機能がそれを使用してプログラムを開始できるように隠されます。

Sysinternals Process Explorerを使用して、プロセス トークンで有効になっている特権を確認できます。

于 2014-02-19T16:47:24.753 に答える
1

If SE_PRIVILEGE_REMOVEDゼロと同等であり、そのように定義されます。そこにある定義を考えると、ゼロの値は、権限が有効になっていないこと、またはその後に使用/削除されたことがないことを意味することをお勧めします。

于 2012-10-26T05:07:58.520 に答える