特権
特権 は、システムのシャットダウン、デバイス ドライバーの読み込み、システム時刻の変更など、ローカル コンピューターでさまざまなシステム関連の操作を実行する、ユーザーまたはグループ アカウントなどのアカウントの権限です。 特権は、次の 2 つの方法でアクセス権とは異なります。
- 特権はシステム リソースとシステム関連のタスクへのアクセスを制御しますが、アクセス権はセキュリティ保護可能なオブジェクトへのアクセス 制御。
- システム管理者はユーザー アカウントとグループ アカウントに特権を割り当てますが、システムはオブジェクトの DACL の ACE で付与されたアクセス権に基づいてセキュリティ保護可能なオブジェクトへのアクセスを許可または拒否します。
各システムには、ユーザー アカウントとグループ アカウントによって保持される特権を格納するアカウント データベースがあります。 ユーザーがログオンすると、システムは、ユーザーまたはユーザーが属するグループに付与されたものを含む、ユーザーの特権の一覧を含む アクセス トークン を生成します。 特権はローカル コンピューターにのみ適用されることに注意してください。ドメイン アカウントには、異なるコンピューターで異なる権限を持つことができます。
ユーザーが特権操作を実行しようとすると、システムはユーザーのアクセス トークンをチェックして、ユーザーが必要な特権を保持しているかどうかを判断し、その場合は特権が有効になっているかどうかを確認します。 ユーザーがこれらのテストに失敗した場合、システムは操作を実行しません。
アクセス トークンに保持されている特権を確認するには、GetTokenInformation 関数を呼び出します。この関数は、有効になっている特権も示します。 ほとんどの特権は既定で無効になっています。
Windows API は、さまざまな特権を識別するために、SE_ASSIGNPRIMARYTOKEN_NAMEなどの文字列定数のセットを定義します。 これらの定数はすべてのシステムで同じであり、Winnt.h で定義されています。 Windows で定義されている特権の表については、「Privilege Constants」を参照してください。 ただし、アクセス トークン内の特権を取得および調整する関数は、LUID の種類を使用して特権を識別します。 特権の LUID 値は、コンピューター間で異なる場合があり、同じコンピューター上のブート間で異なる場合があります。 文字列定数のいずれかに対応する現在の LUID を取得するには、LookupPrivilegeValue 関数を使用します。 LookupPrivilegeName 関数を使用して、LUID を対応する文字列定数に変換します。
システムは、各特権を記述する一連の表示名を提供します。 これらは、ユーザーに権限の説明を表示する必要がある場合に便利です。 LookupPrivilegeDisplayName 関数を使用して、特権の文字列定数に対応する説明文字列を取得します。 たとえば、米国英語を使用するシステムでは、SE_SYSTEMTIME_NAME特権の表示名は "システム時刻の変更" です。
PrivilegeCheck 関数を使用して、アクセス トークンが指定した権限セットを保持しているかどうかを判断できます。 これは主に、クライアントを偽装しているサーバー アプリケーションに役立ちます。
システム管理者は、ユーザー マネージャーなどの管理ツールを使用して、ユーザー アカウントとグループ アカウントの権限を追加または削除できます。 管理者は、Local Security Authority (LSA) 関数をプログラムで使用して特権を操作できます。 LsaAddAccountRights と LsaRemoveAccountRights 関数は、アカウントの権限を追加または削除します。 LsaEnumerateAccountRights 関数は、指定されたアカウントによって保持されている特権を列挙します。 LsaEnumerateAccountsWithUserRight 関数は、指定された特権を保持するアカウントを列挙します。
関連トピック