CreatePrivateObjectSecurityWithMultipleInheritance 関数 (securitybaseapi.h)
CreatePrivateObjectSecurityWithMultipleInheritance 関数は、この関数を呼び出すリソース マネージャーによって作成された新しいプライベート オブジェクトの自己相対セキュリティ記述子を割り当てて初期化します。 この関数は、複数のオブジェクト型またはクラスで構成されるプライベート オブジェクト (アタッチされた補助クラスを持つディレクトリ サービス オブジェクトなど) をサポートします。
構文
BOOL CreatePrivateObjectSecurityWithMultipleInheritance(
[in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
[in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
[out] PSECURITY_DESCRIPTOR *NewDescriptor,
[in, optional] GUID **ObjectTypes,
[in] ULONG GuidCount,
[in] BOOL IsContainerObject,
[in] ULONG AutoInheritFlags,
[in, optional] HANDLE Token,
[in] PGENERIC_MAPPING GenericMapping
);
パラメーター
[in, optional] ParentDescriptor
オブジェクトの親コンテナーの セキュリティ記述子 へのポインター。 親コンテナーがない場合、このパラメーターは NULL です。
[in, optional] CreatorDescriptor
オブジェクトの作成者によって提供されるセキュリティ記述子へのポインター。 オブジェクトの作成者が新しいオブジェクトのセキュリティ情報を明示的に渡さない場合、このパラメーターは NULL にすることができます。 または、このパラメーターは既定のセキュリティ記述子を指すことができます。
[out] NewDescriptor
新しく割り当てられた自己相対セキュリティ記述子へのポインターを受け取る変数へのポインター。 セキュリティ記述子の使用が完了したら、 を呼び出して解放します。
DestroyPrivateObjectSecurity 関数。
[in, optional] ObjectTypes
NewDescriptor に関連付けられているオブジェクトのオブジェクト型またはクラスを識別する GUID 構造体へのポインターの配列。 Active Directory オブジェクトの場合、この配列には、オブジェクトの構造クラスおよびアタッチされているすべての補助クラスのクラス GUID へのポインターが含まれます。 オブジェクトに GUID がない場合は、 ObjectTypes を NULL に 設定します。
[in] GuidCount
ObjectTypes パラメーターに存在する GUID の数。
[in] IsContainerObject
新しいオブジェクトに他のオブジェクトを含めることができるかどうかを指定します。 TRUE の値は、新しいオブジェクトがコンテナーであることを示します。 FALSE の値は、新しいオブジェクトがコンテナーではないことを示します。
[in] AutoInheritFlags
アクセス制御エントリ (ACE) を ParentDescriptor から継承する方法を制御するビット フラグのセット。 このパラメーターは、次の値と組み合わせて使用できます。
値 | 意味 |
---|---|
|
新しい 随意アクセス制御リスト (DACL) には、 ParentDescriptor の DACL から継承された ACE と、 CreatorDescriptor の DACL で指定された明示的な ACE が含まれています。 このフラグが設定されていない場合、新しい DACL は ACE を継承しません。 |
|
新しい システム アクセス制御リスト (SACL) には、 ParentDescriptor の SACL から継承された ACE と、 CreatorDescriptor の SACL で指定された明示的な ACE が含まれています。 このフラグが設定されていない場合、新しい SACL は ACE を継承しません。 |
|
CreatorDescriptor は、 ObjectTypes で指定されたオブジェクトの型の既定の記述子です。 したがって、ParentDescriptor に ObjectTypes パラメーターで指定されたオブジェクトの型に対するオブジェクト固有の ACE がある場合、CreatorDescriptor は無視されます。 このような ACE が継承されない場合、 CreatorDescriptor は、このフラグが指定されていないかのように処理されます。 |
|
関数は特権チェックを実行しません。 SEF_AVOID_OWNER_CHECK フラグも設定されている場合は、 Token パラメーターに NULL を指定できます。 このフラグは、更新された各子に対する特権のチェックを回避するために、自動継承を実装するときに便利です。 |
|
関数は、「解説」セクションで説明されているように、結果の NewDescriptor の所有者の有効性をチェックしません。 SEF_AVOID_PRIVILEGE_CHECK フラグも設定されている場合は、 Token パラメーターに NULL を指定できます。 |
|
NewDescriptor の所有者は、ParentDescriptor の所有者に既定で設定されます。 設定されていない場合、 NewDescriptor の所有者は既定で Token パラメーターで指定されたトークンの所有者になります。 トークンの所有者は、トークン自体で指定されます。 いずれの場合も、 CreatorDescriptor パラメーターが NULL でない場合、 NewDescriptor 所有者は CreatorDescriptor の所有者に設定されます。 |
|
NewDescriptor のグループは、ParentDescriptor のグループに既定で設定されます。 設定しない場合、 NewDescriptor のグループは、 Token パラメーターで 指定されたトークンのグループに既定で設定されます。 トークンのグループは、トークン自体で指定されます。 どちらの場合も、 CreatorDescriptor パラメーターが NULL でない場合、 NewDescriptor グループは CreatorDescriptor のグループに設定されます。 |
|
オブジェクトよりも低いレベルの必須レベルのプリンシパルは、オブジェクトに書き込むことができません。 |
|
オブジェクトより低いレベルの必須レベルのプリンシパルは、オブジェクトを読み取ることができません。 |
|
オブジェクトよりも低いレベルの必須レベルのプリンシパルは、オブジェクトを実行できません。 |
|
呼び出し元が CreatorDescriptor で DACL を指定する機能を制限する ParentDescriptor パラメーターで指定された制限は無視されます。 |
[in, optional] Token
オブジェクトを作成するクライアント プロセスのアクセス トークンへのハンドル。 偽装 トークンの場合は、SecurityIdentification レベル以上である必要があります。 SecurityIdentification 偽装レベルの完全な説明については、 列挙型SECURITY_IMPERSONATION_LEVEL 参照してください。
クライアント トークンには、既定の所有者、プライマリ グループ、DACL などの既定のセキュリティ情報が含まれています。 この関数は、情報が入力セキュリティ記述子にない場合に、これらの既定値を使用します。 TOKEN_QUERY アクセスするには 、トークンを開く必要があります。
次の条件がすべて当てはまる場合は、TOKEN_QUERYアクセスに加えて 、TOKEN_DUPLICATE アクセスのためにハンドル を 開く必要があります。
- トークン ハンドルは、プライマリ トークンを参照します。
- トークンのセキュリティ記述子には、 OwnerRights SID を持つ 1 つ以上の ACE が含まれています。
- CreatorDescriptor パラメーターにセキュリティ記述子が指定されています。
- この関数の呼び出し元は、AutoInheritFlags パラメーターにSEF_AVOID_OWNER_RESTRICTION フラグを設定しません。
[in] GenericMapping
各汎用権限からオブジェクトの特定の権限へのマッピングを指定する GENERIC_MAPPING構造体への ポインター。
戻り値
関数が成功した場合、関数は 0 以外の値を返します。
関数が失敗すると、0 が返されます。 拡張エラー情報については 、GetLastError を呼び出します。 拡張エラー コードとその意味を次の表に示します。
リターン コード | 説明 |
---|---|
|
関数は、新しいセキュリティ記述子のプライマリ グループを取得できません。 |
|
関数は、新しいセキュリティ記述子の所有者を取得できないか、 セキュリティ識別子 (SID) を所有者として割り当てることができません。 これは、渡されたトークンに対して所有者 SID を検証するときに発生します。 |
|
関数は、所有者の検証または特権チェック用のトークンの代わりに NULL を受け取った。 |
|
SACL が設定され、SEF_AVOID_PRIVILEGE_CHECKが渡されず、渡されたトークンが有効になっていないSE_SECURITY_NAME。 |
注釈
CreatePrivateObjectSecurityEx 関数は、ObjectTypes で単一の GUID を使用して CreatePrivateObjectSecurityWithMultipleInheritance 関数を呼び出すことと同じです。
AutoInheritFlags は、SECURITY_DESCRIPTOR構造体の Control メンバー内の同じような名前のビットとは異なります。 制御ビットの詳細については、「 SECURITY_DESCRIPTOR_CONTROL」を参照してください。
AutoInheritFlags でSEF_DACL_AUTO_INHERIT ビットが指定されている場合、関数は新しいセキュリティ記述子の DACL に次の規則を適用します。
- SE_DACL_AUTO_INHERITED フラグは、新しいセキュリティ記述子の Control メンバーで設定されます。
- 新しいセキュリティ記述子の DACL は、 CreatorDescriptor が既定のセキュリティ記述子であるか、作成者によって明示的に指定されたかに関係なく、 ParentDescriptor から ACE を継承します。 新しい DACL は、継承の規則によって定義される親と作成者の DACL の組み合わせです。 具体的には、すべての子オブジェクトまたは ObjectTypes にリストされている任意のオブジェクト クラスに継承可能な ParentDescriptor の ACE は、新しい DACL に適用されます。
- 継承された ACE は、INHERITED_ACEとしてマークされます。
DACL と SACL の両方で、ParentDescriptor と CreatorDescriptor の特定の種類の ACE が操作され、場合によっては NewDescriptor の 2 つの ACE に置き換えられます。 具体的には、次のマップ可能な要素の少なくとも 1 つを含む継承可能な ACE では、出力セキュリティ記述子に 2 つの ACE が生成される可能性があります。 マップ可能な要素は次のとおりです。
- ACCESS_MASKの汎用アクセス権
- ACE サブジェクト識別子としての Creator Owner SID または Creator Group SID
- 元ののコピーですが、INHERIT_ONLY フラグが設定されている ACE。 ただし、次の 2 つの条件のいずれかが存在する場合、この ACE は作成されません。
- IsContainerObject パラメーターは FALSE です。 継承可能な ACE は、非コンテナー オブジェクトでは意味がありません。
- 元の ACE には、NO_PROPAGATE_INHERIT フラグが含まれています。 元の ACE は、子に対して有効な ACE として継承されることを意図していますが、それらの子の下では継承できません。
- INHERITED_ACE ビットが有効になり、ジェネリック要素が特定の要素にマップされる有効な ACE。
- 汎用アクセス権は、入力 GenericMapping で示されている対応する標準および特定のアクセス権に置き換えられます。
- 作成者所有者 SID は、結果の NewDescriptor の所有者に置き換えられます
- Creator Group SID は、結果として得られる NewDescriptor のグループに置き換えられます
- SE_GROUP_OWNERを含める必要があります
- SE_GROUP_USE_FOR_DENY_ONLYを含めてはなりません
新しいオブジェクトのセキュリティ記述子を作成するには、 CreatePrivateObjectSecurityWithMultipleInheritance を呼び出し、 ParentDescriptor を親コンテナーのセキュリティ記述子に設定し、 CreatorDescriptor をオブジェクトの作成者によって提案されたセキュリティ記述子に設定します。
オブジェクトの現在のセキュリティ記述子を確認するには、 CreatePrivateObjectSecurityWithMultipleInheritance を呼び出し、 ParentDescriptor を親コンテナーのセキュリティ記述子に設定し、 CreatorDescriptor をオブジェクトの現在のセキュリティ記述子に設定します。 この呼び出しにより、ACE が親から子のセキュリティ記述子に適切に継承されます。
CreatorDescriptor セキュリティ記述子に SACL が含まれている場合は、トークンにSE_SECURITY_NAME特権が有効になっているか、呼び出し元が AutoInheritFlags でSEF_AVOID_PRIVILEGE_CHECK フラグを指定する必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | securitybaseapi.h (Windows.h を含む) |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |