CreateRestrictedToken 関数 (securitybaseapi.h)

CreateRestrictedToken 関数は、既存のアクセス トークンの制限付きバージョンである新しいアクセス トークンを作成します。 制限付きトークンには、 セキュリティ識別子 (SID)、削除された特権、および制限 SID の一覧を含めることができます。 詳細については、「 制限付きトークン」を参照してください。

構文

BOOL CreateRestrictedToken(
  [in]           HANDLE               ExistingTokenHandle,
  [in]           DWORD                Flags,
  [in]           DWORD                DisableSidCount,
  [in, optional] PSID_AND_ATTRIBUTES  SidsToDisable,
  [in]           DWORD                DeletePrivilegeCount,
  [in, optional] PLUID_AND_ATTRIBUTES PrivilegesToDelete,
  [in]           DWORD                RestrictedSidCount,
  [in, optional] PSID_AND_ATTRIBUTES  SidsToRestrict,
  [out]          PHANDLE              NewTokenHandle
);

パラメーター

[in] ExistingTokenHandle

プライマリ トークンまたは偽装トークンへのハンドル。 トークンは、制限付きトークンにすることもできます。 ハンドルには、トークンへのTOKEN_DUPLICATEアクセス権が必要です。

[in] Flags

追加の特権オプションを指定します。 このパラメーターには、0 または次の値の組み合わせを指定できます。

意味
DISABLE_MAX_PRIVILEGE
0x1
SeChangeNotifyPrivilege 特権を除く、新しいトークン内のすべての特権を無効にします。 この値を指定すると、 DeletePrivilegeCount パラメーターと PrivilegesToDelete パラメーターは無視されます。
SANDBOX_INERT
0x2
この値を使用すると、システムは AppLocker 規則をチェックしたり、ソフトウェア制限ポリシーを適用したりしません。 AppLocker の場合、このフラグは、実行可能ファイル、Windows インストーラー、スクリプト、DLL の 4 つのルール コレクションすべてについてチェックを無効にします。

インストール時に抽出された DLL を実行する必要があるセットアップ プログラムを作成する場合は、SaferComputeTokenFromLevel 関数のフラグ SAFER_TOKEN_MAKE_INERTを使用します。

トークンは、 GetTokenInformation を使用して、このフラグの存在を照会できます。

Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: KB2532445がインストールされているシステムでは、呼び出し元が LocalSystem または TrustedInstaller として実行されている必要があります。または、システムはこのフラグを無視します。 詳細については、 のヘルプおよびサポート サポート 技術情報 http://support.microsoft.com/kb/2532445の「Windows 7 または Windows Server 2008 R2 を実行しているコンピューターで Office マクロを使用して AppLocker ルールを回避できます」を参照してください。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: AppLocker はサポートされていません。 AppLocker は、Windows 7 および Windows Server 2008 R2 で導入されました。

LUA_TOKEN
0x4
新しいトークンは LUA トークンです。

Windows Server 2003 および Windows XP: この値はサポートされていません。

WRITE_RESTRICTED
0x8
新しいトークンには、書き込みアクセスの評価時にのみ考慮される制限 SID が含まれています。

SP2 以降の Windows XP: この定数の値は0x4。 アプリケーションが SP2 以降のオペレーティング システムと Windows XP と互換性を持つようにするには、 GetVersionEx 関数を呼び出してオペレーティング システムに対してクエリを実行し、使用する値を決定する必要があります。

Windows Server 2003 および Windows XP SP1 以前: この値はサポートされていません。

[in] DisableSidCount

SidsToDisable 配列内のエントリの数を指定します。

[in, optional] SidsToDisable

制限付きトークン内の拒否専用 SID を指定する SID_AND_ATTRIBUTES 構造体の配列へのポインター。 システムは、セキュリティ保護可能なオブジェクトへのアクセスを拒否するために、拒否専用 SID を使用します。 拒否専用 SID がない場合、アクセスは許可されません。

SID を無効にすると、SE_GROUP_USE_FOR_DENY_ONLYが有効になり、SE_GROUP_ENABLEDとSE_GROUP_ENABLED_BY_DEFAULTがオフになります。 他のすべての属性は無視されます。

拒否のみの属性は、SE_GROUP_MANDATORY属性を持つユーザー SID やグループ SID など、既存のトークンの SID の任意の組み合わせに適用されます。 既存のトークンに関連付けられている SID を取得するには、TokenUser フラグと TokenGroups フラグと共に GetTokenInformation 関数を使用します。 この関数は、既存のトークンにも見つからない配列内の SID を無視します。

関数は、SID_AND_ATTRIBUTES構造体の Attributes メンバーを無視します。

無効にする SID がない場合、このパラメーターは NULL にすることができます。

[in] DeletePrivilegeCount

PrivilegesToDelete 配列内のエントリの数を指定します。

[in, optional] PrivilegesToDelete

制限付きトークンで削除する特権を指定する LUID_AND_ATTRIBUTES 構造体の配列へのポインター。

GetTokenInformation 関数を TokenPrivileges フラグと共に使用して、既存のトークンによって保持されている特権を取得できます。 関数は、既存のトークンによって保持されていない配列内の特権を無視します。

関数は、LUID_AND_ATTRIBUTES構造体の Attributes メンバーを無視します。

特権を削除しない場合は、このパラメーターを NULL にすることができます。

呼び出し元のプログラムがこの配列で渡す特権が多すぎる場合、 CreateRestrictedToken はERROR_INVALID_PARAMETERを返します。

[in] RestrictedSidCount

SidsToRestrict 配列内のエントリの数を指定します。

[in, optional] SidsToRestrict

新しいトークンの制限 SID の一覧を指定する SID_AND_ATTRIBUTES 構造体の配列へのポインター。 既存のトークンが制限付きトークンの場合、新しいトークンの SID を制限するリストは、この配列と既存のトークンの制限 SID の一覧の共通部分です。 SidsToRestrict パラメーターに配置された重複する SID を削除するためのチェックは実行されません。 重複する SID を使用すると、制限付きトークンに制限付き SID リストに冗長な情報を含めることができるようになります。

SID_AND_ATTRIBUTES構造体の Attributes メンバーは 0 である必要があります。 SID の制限は、常にアクセス チェックに対して有効になります。

制限する SID を指定しない場合は、このパラメーターを NULL にすることができます。

[out] NewTokenHandle

新しい制限付きトークンへのハンドルを受け取る変数へのポインター。 このハンドルには、 ExistingTokenHandle と同じアクセス権があります。 新しいトークンは、既存のトークンと同じ型 ( プライマリ または 偽装) です。 NewTokenHandle で返されるハンドルは複製できます。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

CreateRestrictedToken 関数は、次の方法でトークンを制限できます。

  • トークン内の SID に deny-only 属性を適用して、セキュリティで保護されたオブジェクトへのアクセスに使用できないようにします。 拒否専用属性の詳細については、「 アクセス トークンの SID 属性」を参照してください。
  • トークンから 特権を 削除します。
  • セキュリティ保護可能なオブジェクトへのトークンのアクセスをチェックするときにシステムが使用する制限 SID の一覧を指定します。 システムは 2 つのアクセス チェックを実行します。1 つはトークンが有効な SID を使用し、もう 1 つは制限 SID の一覧を使用します。 両方のアクセス チェックで要求されたアクセス権が許可されている場合にのみ、アクセスが許可されます。
CreateProcessAsUser 関数の制限付きトークンを使用して、アクセス権と特権が制限されたプロセスを作成できます。 プロセスが独自のトークンの制限付きバージョンを使用して CreateProcessAsUser を 呼び出す場合、呼び出し元のプロセスはSE_ASSIGNPRIMARYTOKEN_NAME特権を持つ必要はありません。

制限付きトークンは 、ImpersonateLoggedOnUser 関数で使用できます。

注意 制限付きトークンを使用するアプリケーションでは、既定のデスクトップ以外のデスクトップで制限付きアプリケーションを実行する必要があります。 これは、 SendMessage または PostMessage を使用して、既定のデスクトップ上の無制限のアプリケーションに対する制限付きアプリケーションによる攻撃を防ぐために必要です。 必要に応じて、アプリケーションの目的でデスクトップを切り替えます。
 

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー securitybaseapi.h (Windows.h を含む)
Library Advapi32.lib
[DLL] Advapi32.dll

こちらもご覧ください

アクセス制御の概要

基本的なAccess Control関数

CreateProcessAsUser

GetTokenInformation

ImpersonateLoggedOnUser

IsTokenRestricted

LUID_AND_ATTRIBUTES

SID_AND_ATTRIBUTES