CreatePrivateObjectSecurityEx 関数 (securitybaseapi.h)

CreatePrivateObjectSecurityEx 関数は、この関数を呼び出すリソース マネージャーによって作成された新しいプライベート オブジェクトの自己相対セキュリティ記述子を割り当てて初期化します。

構文

BOOL CreatePrivateObjectSecurityEx(
  [in, optional] PSECURITY_DESCRIPTOR ParentDescriptor,
  [in, optional] PSECURITY_DESCRIPTOR CreatorDescriptor,
  [out]          PSECURITY_DESCRIPTOR *NewDescriptor,
  [in, optional] GUID                 *ObjectType,
  [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] ObjectType

NewDescriptor に関連付けられているオブジェクトの種類を識別する GUID 構造体へのポインター。 オブジェクトに GUID がない場合は、 ObjectType を NULL に設定 します

[in] IsContainerObject

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

[in] AutoInheritFlags

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

意味
SEF_AVOID_OWNER_CHECK
0x10
関数は、次の「備考」で説明するように、結果として得られる NewDescriptor の所有者の有効性をチェックしません。 SEF_AVOID_PRIVILEGE_CHECK フラグも設定されている場合は、 Token パラメーターに NULL を指定できます。
SEF_AVOID_OWNER_RESTRICTION
0x1000
CreatorDescriptor で DACL を指定する呼び出し元の機能を制限する ParentDescriptor によって指定された制限は無視されます。
SEF_AVOID_PRIVILEGE_CHECK
0x08
関数は特権チェックを実行しません。 SEF_AVOID_OWNER_CHECK フラグも設定されている場合は、 Token パラメーターに NULL を指定できます。 このフラグは、更新された各子に対する特権をチェックしないように、自動継承を実装するときに便利です。
SEF_DACL_AUTO_INHERIT
0x01
新しい 随意アクセス制御リスト (DACL) には、 ParentDescriptor の DACL から継承された ACE と、 CreatorDescriptor の DACL で指定された明示的な ACE が含まれます。 このフラグが設定されていない場合、新しい DACL は ACE を継承しません。
SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT
0x04
CreatorDescriptor は、 ObjectType で指定されたオブジェクトの型の既定の記述子です。 したがって、ParentDescriptorObjectType パラメーターで指定されたオブジェクトの型に対してオブジェクト固有の ACE がある場合、CreatorDescriptor は無視されます。 このような ACE が継承されない場合、 CreatorDescriptor は、このフラグが指定されていないかのように処理されます。
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
NewDescriptor のグループは、ParentDescriptor のグループに既定で設定されます。 設定されていない場合、 NewDescriptor のグループは既定で Token パラメーターで 指定されたトークンのグループになります。 トークンのグループは、トークン自体で指定されます。 どちらの場合も、 CreatorDescriptor パラメーターが NULL でない場合、 NewDescriptor グループは CreatorDescriptor のグループに設定されます。
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
NewDescriptor の所有者は、ParentDescriptor の所有者に既定で設定されます。 設定されていない場合、 NewDescriptor の所有者は既定で Token パラメーターで 指定されたトークンの所有者になります。 トークンの所有者は、トークン自体で指定されます。 どちらの場合も、 CreatorDescriptor パラメーターが NULL でない場合、 NewDescriptor 所有者は CreatorDescriptor の所有者に設定されます。
SEF_MACL_NO_EXECUTE_UP
0x400
このフラグが設定されている場合、 CreatorDescriptor の必須ラベル ACE は 、NewDescriptor で必須ラベル ACE を作成するために使用されません。 代わりに、SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UPのアクセス マスクとトークンの整合性 SID からの SID を持つ新しいSYSTEM_MANDATORY_LABEL_ACEが NewDescriptor に追加されます。
SEF_MACL_NO_READ_UP
0x200
このフラグが設定されている場合、 CreatorDescriptor の必須ラベル ACE は 、NewDescriptor で必須ラベル ACE を作成するために使用されません。 代わりに、SYSTEM_MANDATORY_LABEL_NO_READ_UPのアクセス マスクとトークンの整合性 SID からの SID を持つ新しいSYSTEM_MANDATORY_LABEL_ACEが NewDescriptor に追加されます。
SEF_MACL_NO_WRITE_UP
0x100
このフラグが設定されている場合、 CreatorDescriptor の必須ラベル ACE は 、NewDescriptor で必須ラベル ACE を作成するために使用されません。 代わりに、SYSTEM_MANDATORY_LABEL_NO_WRITE_UPのアクセス マスクとトークンの整合性 SID からの SID を持つ新しいSYSTEM_MANDATORY_LABEL_ACEが NewDescriptor に追加されます。
SEF_SACL_AUTO_INHERIT
0x02
新しい システム アクセス制御リスト (SACL) には、 ParentDescriptor の SACL から継承された ACE と、 CreatorDescriptor の SACL で指定された明示的な ACE が含まれています。 このフラグが設定されていない場合、新しい SACL は ACE を継承しません。

[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_OWNER
関数は、新しいセキュリティ記述子の所有者を取得できないか、SID を所有者として割り当てることができません。 これは、渡されたトークンに対して所有者 SID を検証するときに発生します。
ERROR_INVALID_PRIMARY_GROUP
関数は、新しいセキュリティ記述子のプライマリ グループを取得できません。
ERROR_NO_TOKEN
関数は、所有者の検証または特権チェック用のトークンの代わりに NULL を 受け取ります。
ERROR_PRIVILEGE_NOT_HELD
SACL が設定され、SEF_AVOID_PRIVILEGE_CHECKが渡されず、渡されたトークンが有効になっていないSE_SECURITY_NAME。

注釈

CreatePrivateObjectSecurity 関数は、ObjectTypeNULL に設定され、AutoInheritFlags が 0 に設定された CreatePrivateObjectSecurityEx 関数の呼び出しと同じです。

AutoInheritFlags パラメーターは、SECURITY_DESCRIPTOR構造体の Control メンバー内の類似した名前付きビットとは異なります。 制御ビットの詳細については、「 SECURITY_DESCRIPTOR_CONTROL」を参照してください。

AutoInheritFlags でSEF_DACL_AUTO_INHERIT ビットが指定されている場合、関数は新しいセキュリティ記述子の DACL に次の規則を適用します。

  • SE_DACL_AUTO_INHERITED フラグは、新しいセキュリティ記述子の Control メンバーで設定されます。
  • 新しいセキュリティ記述子の DACL は、 CreatorDescriptor が既定のセキュリティ記述子であるか、作成者によって明示的に指定されたかに関係なく、 ParentDescriptor から ACE を継承します。 新しい DACL は、継承の規則によって定義される親と作成者の DACL の組み合わせです。
  • 継承された ACE は、INHERITED_ACEとしてマークされます。
AutoInheritFlags でSEF_SACL_AUTO_INHERIT ビットが指定されている場合、関数は新しい SACL に同様の規則を適用します。

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

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

最終的に所有者を設定するクライアントのトークンにアクセスできない呼び出し元は、所有者の検証チェックをスキップすることを選択できます。

新しいオブジェクトのセキュリティ記述子を作成するには、親コンテナーのセキュリティ記述子に ParentDescriptor が設定された CreatePrivateObjectSecurityEx を呼び出し、CreatorDescriptor をオブジェクトの作成者によって提案されたセキュリティ記述子に設定します。

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

こちらもご覧ください

クライアント/サーバー Access Control関数

クライアント/サーバー Access Controlの概要

CreatePrivateObjectSecurity

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GUID

GetTokenInformation

OpenProcessToken

SECURITY_DESCRIPTOR

SECURITY_DESCRIPTOR_CONTROL

SECURITY_IMPERSONATION_LEVEL

SetPrivateObjectSecurityEx