特権

特権は、システムのシャットダウン、デバイス ドライバーの読み込み、システム時刻の変更など、ローカル コンピューター上でさまざまなシステム関連の操作を実行する、ユーザーまたはグループ アカウントなどのアカウントの権限です。 特権は、次の 2 つの方法でアクセス権とは異なります。

  • 特権はシステム リソースとシステム関連のタスクへのアクセスを制御しますが、アクセス権は セキュリティ保護可能なオブジェクトへのアクセスを制御します。
  • システム管理者はユーザーおよびグループ アカウントに特権を割り当てますが、システムは、オブジェクトの DACL の ACE で付与されたアクセス権に基づいて、セキュリティ保護可能なオブジェクトへのアクセスを許可または拒否します。

各システムには、ユーザー アカウントとグループ アカウントが保持する特権を格納するアカウント データベースがあります。 ユーザーがログオンすると、システムは、ユーザーまたはユーザーが属するグループに付与されたものを含む、ユーザーの特権の一覧を含む アクセス トークン を生成します。 特権はローカル コンピューターにのみ適用されることに注意してください。ドメイン アカウントには、異なるコンピューターで異なる特権を持つことができます。

ユーザーが特権操作を実行しようとすると、システムはユーザーのアクセス トークンをチェックして、ユーザーが必要な特権を保持しているかどうかを判断し、その場合は特権が有効になっているかどうかを確認します。 ユーザーがこれらのテストに失敗した場合、システムは操作を実行しません。

アクセス トークンに保持されている特権を確認するには、 GetTokenInformation 関数を呼び出します。この関数は、有効になっている特権も示します。 ほとんどの特権は既定で無効になっています。

Windows API は、さまざまな特権を識別するために、SE_ASSIGNPRIMARYTOKEN_NAMEなどの文字列定数のセットを定義します。 これらの定数はすべてのシステムで同じであり、Winnt.h で定義されます。 Windows で定義されている特権のテーブルについては、「 Privilege Constants」を参照してください。 ただし、アクセス トークンの特権を取得および調整する関数では、 LUID 型を使用して特権を識別します。 特権の LUID 値は、あるコンピューターと別のコンピューター、および同じコンピューター上のブート間で異なる場合があります。 文字列定数のいずれかに対応する現在の LUID を取得するには、 LookupPrivilegeValue 関数を使用します。 LUID を対応する文字列定数に変換するには、LookupPrivilegeName 関数を使用します。

システムは、各特権を記述する一連の表示名を提供します。 これらは、ユーザーに特権の説明を表示する必要がある場合に便利です。 LookupPrivilegeDisplayName 関数を使用して、特権の文字列定数に対応する説明文字列を取得します。 たとえば、米国英語を使用するシステムでは、SE_SYSTEMTIME_NAME特権の表示名は "システム時刻の変更" です。

PrivilegeCheck 関数を使用して、アクセス トークンが指定した特権セットを保持しているかどうかを判断できます。 これは主に、クライアントを偽装しているサーバー アプリケーションに役立ちます。

システム管理者は、ユーザー マネージャーなどの管理ツールを使用して、ユーザー アカウントとグループ アカウントの特権を追加または削除できます。 管理者は、 ローカル セキュリティ機関 (LSA) 関数をプログラムで使用して特権を操作できます。 LsaAddAccountRights 関数と LsaRemoveAccountRights 関数は、アカウントの特権を追加または削除します。 LsaEnumerateAccountRights 関数は、指定されたアカウントによって保持されている特権を列挙します。 LsaEnumerateAccountsWithUserRight 関数は、指定された特権を保持するアカウントを列挙します。

承認定数

C++ での特権の有効化と無効化