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 がない場合は、 ObjectTypesNULL に 設定します。

[in] GuidCount

ObjectTypes パラメーターに存在する GUID の数。

[in] IsContainerObject

新しいオブジェクトに他のオブジェクトを含めることができるかどうかを指定します。 TRUE の値は、新しいオブジェクトがコンテナーであることを示します。 FALSE の値は、新しいオブジェクトがコンテナーではないことを示します。

[in] AutoInheritFlags

アクセス制御エントリ (ACE) を ParentDescriptor から継承する方法を制御するビット フラグのセット。 このパラメーターは、次の値と組み合わせて使用できます。

意味
SEF_DACL_AUTO_INHERIT
0x01
新しい 随意アクセス制御リスト (DACL) には、 ParentDescriptor の DACL から継承された ACE と、 CreatorDescriptor の DACL で指定された明示的な ACE が含まれています。 このフラグが設定されていない場合、新しい DACL は ACE を継承しません。
SEF_SACL_AUTO_INHERIT
0x02
新しい システム アクセス制御リスト (SACL) には、 ParentDescriptor の SACL から継承された ACE と、 CreatorDescriptor の SACL で指定された明示的な ACE が含まれています。 このフラグが設定されていない場合、新しい SACL は ACE を継承しません。
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor は、 ObjectTypes で指定されたオブジェクトの型の既定の記述子です。 したがって、ParentDescriptorObjectTypes パラメーターで指定されたオブジェクトの型に対するオブジェクト固有の ACE がある場合、CreatorDescriptor は無視されます。 このような ACE が継承されない場合、 CreatorDescriptor は、このフラグが指定されていないかのように処理されます。
SEF_AVOID_PRIVILEGE_CHECK
0x08
関数は特権チェックを実行しません。 SEF_AVOID_OWNER_CHECK フラグも設定されている場合は、 Token パラメーターに NULL を指定できます。 このフラグは、更新された各子に対する特権のチェックを回避するために、自動継承を実装するときに便利です。
SEF_AVOID_OWNER_CHECK
0x10
関数は、「解説」セクションで説明されているように、結果の NewDescriptor の所有者の有効性をチェックしません。 SEF_AVOID_PRIVILEGE_CHECK フラグも設定されている場合は、 Token パラメーターに NULL を指定できます。
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
NewDescriptor の所有者は、ParentDescriptor の所有者に既定で設定されます。 設定されていない場合、 NewDescriptor の所有者は既定で Token パラメーターで指定されたトークンの所有者になります。 トークンの所有者は、トークン自体で指定されます。 いずれの場合も、 CreatorDescriptor パラメーターが NULL でない場合、 NewDescriptor 所有者は CreatorDescriptor の所有者に設定されます。
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
NewDescriptor のグループは、ParentDescriptor のグループに既定で設定されます。 設定しない場合、 NewDescriptor のグループは、 Token パラメーターで 指定されたトークンのグループに既定で設定されます。 トークンのグループは、トークン自体で指定されます。 どちらの場合も、 CreatorDescriptor パラメーターが NULL でない場合、 NewDescriptor グループは CreatorDescriptor のグループに設定されます。
SEF_MACL_NO_WRITE_UP
0x100
オブジェクトよりも低いレベルの必須レベルのプリンシパルは、オブジェクトに書き込むことができません。
SEF_MACL_NO_READ_UP
0x200
オブジェクトより低いレベルの必須レベルのプリンシパルは、オブジェクトを読み取ることができません。
SEF_MACL_NO_EXECUTE_UP
0x400
オブジェクトよりも低いレベルの必須レベルのプリンシパルは、オブジェクトを実行できません。
SEF_AVOID_OWNER_RESTRICTION
0x1000
呼び出し元が 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 を呼び出します。 拡張エラー コードとその意味を次の表に示します。

リターン コード 説明
ERROR_INVALID_PRIMARY_GROUP
関数は、新しいセキュリティ記述子のプライマリ グループを取得できません。
ERROR_INVALID_OWNER
関数は、新しいセキュリティ記述子の所有者を取得できないか、 セキュリティ識別子 (SID) を所有者として割り当てることができません。 これは、渡されたトークンに対して所有者 SID を検証するときに発生します。
ERROR_NO_TOKEN
関数は、所有者の検証または特権チェック用のトークンの代わりに NULL を受け取った。
ERROR_PRIVILEGE_NOT_HELD
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としてマークされます。
AutoInheritFlags でSEF_SACL_AUTO_INHERIT ビットが指定されている場合、関数は新しい SACL に同様の規則を適用します。

DACL と SACL の両方で、ParentDescriptor と CreatorDescriptor特定の種類の ACE が操作され、場合によっては NewDescriptor の 2 つの ACE に置き換えられます。 具体的には、次のマップ可能な要素の少なくとも 1 つを含む継承可能な ACE では、出力セキュリティ記述子に 2 つの ACE が生成される可能性があります。 マップ可能な要素は次のとおりです。

  • ACCESS_MASKの汎用アクセス権
  • ACE サブジェクト識別子としての Creator Owner SID または Creator Group SID
これらのマップ可能な要素のいずれかを持つ ACE は、 NewDescriptor で次の 2 つの ACE になります。
  • 元ののコピーですが、INHERIT_ONLY フラグが設定されている ACE。 ただし、次の 2 つの条件のいずれかが存在する場合、この ACE は作成されません。
    • IsContainerObject パラメーターは FALSE です。 継承可能な ACE は、非コンテナー オブジェクトでは意味がありません。
    • 元の ACE には、NO_PROPAGATE_INHERIT フラグが含まれています。 元の ACE は、子に対して有効な ACE として継承されることを意図していますが、それらの子の下では継承できません。
  • INHERITED_ACE ビットが有効になり、ジェネリック要素が特定の要素にマップされる有効な ACE。
    • 汎用アクセス権は、入力 GenericMapping で示されている対応する標準および特定のアクセス権に置き換えられます。
    • 作成者所有者 SID は、結果の NewDescriptor の所有者に置き換えられます
    • Creator Group SID は、結果として得られる NewDescriptor のグループに置き換えられます
AutoInheritFlags でSEF_AVOID_OWNER_CHECK ビットが指定されていない場合、所有者の有効性チェックは次の規則に従って実行されます。 結果の NewDescriptor の所有者は、法的な形式の SID である必要があります。また、Token の TokenUser と一致するか、Token の TokenGroups 内のグループと一致する必要があります。 グループの属性:
  • 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

こちらもご覧ください

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL