SetPrivateObjectSecurityEx 関数 (securitybaseapi.h)

SetPrivateObjectSecurityEx 関数は、この関数を呼び出すリソース マネージャーによって管理されるプライベート オブジェクトのセキュリティ記述子を変更します。 SetPrivateObjectSecurityEx 関数には、リソース マネージャーがアクセス制御エントリ (ACE) の自動継承をサポートするかどうかを指定する flags パラメーターがあります。

構文

BOOL SetPrivateObjectSecurityEx(
  [in]           SECURITY_INFORMATION SecurityInformation,
  [in]           PSECURITY_DESCRIPTOR ModificationDescriptor,
  [in, out]      PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  [in]           ULONG                AutoInheritFlags,
  [in]           PGENERIC_MAPPING     GenericMapping,
  [in, optional] HANDLE               Token
);

パラメーター

[in] SecurityInformation

設定するセキュリティ記述子の部分。 この値は、SECURITY_INFORMATION ビット フラグの組み合わせです。

[in] ModificationDescriptor

SECURITY_DESCRIPTOR構造体へのポインター。 SecurityInformation パラメーターによって示されるこのセキュリティ記述子の部分は、ObjectsSecurityDescriptor セキュリティ記述子に適用されます。

[in, out] ObjectsSecurityDescriptor

SECURITY_DESCRIPTOR構造体へのポインターへのポインター。 このセキュリティ記述子は 、自己相対 形式である必要があります。 セキュリティ記述子のメモリは、HeapAlloc 関数を使用してプロセス ヒープ (GetProcessHeap) から割り当てる必要があります。

入力時に、これはプライベート オブジェクトの現在のセキュリティ記述子です。 関数は、新しいセキュリティ記述子を生成するように変更します。 必要に応じて、 SetPrivateObjectSecurityEx 関数は、より大きなセキュリティ記述子を生成するために追加のメモリを割り当てます。

[in] AutoInheritFlags

ACE の自動継承を指定します。 保護されたサーバーが自動継承を実装していない場合は、0 を指定する必要があります。それ以外の場合は、Winnt.h で定義されている次の値の組み合わせを指定できます。

意味
SEF_DACL_AUTO_INHERIT
0x01
新しい 随意アクセス制御リスト (DACL) には、オブジェクトの親の DACL から継承された ACE と、 ModificationDescriptor の DACL で指定された明示的な ACE が含まれます。 このフラグが設定されていない場合、新しい DACL は ACE を継承しません。
SEF_SACL_AUTO_INHERIT
0x02
新しい システム アクセス制御リスト (SACL) には、オブジェクトの親に関連付けられているセキュリティ記述子の SACL から継承された ACE と、 ModificationDescriptor の SACL で指定された明示的な ACE が含まれます。 このフラグが設定されていない場合、新しい SACL は ACE を継承しません。
SEF_AVOID_PRIVILEGE_CHECK
0x08
関数は特権チェックを実行しません。 SEF_AVOID_OWNER_CHECK フラグも設定されている場合は、Token パラメーターに NULL を指定できます。 更新された各子に対する特権をチェックしないように、自動継承を実装する場合は、このフラグを使用します。
SEF_AVOID_OWNER_CHECK
0x10
関数は、「解説」で説明されているように、結果の ObjectsSecurityDescriptor で所有者の有効性をチェックしません。 SEF_AVOID_PRIVILEGE_CHECK フラグも設定されている場合は、Token パラメーターに NULL を指定できます。
SEF_DEFAULT_OWNER_FROM_PARENT
0x20
ObjectsSecurityDescriptor の所有者は、既定でオブジェクトの親の所有者になります。 このフラグが設定されていない場合、 ObjectsSecurityDescriptor の所有者は、既定で Token パラメーターで指定されたトークンの所有者に設定されます。 トークンの所有者は、トークン自体で指定されます。 どちらの場合も、 ModificationDescriptor パラメーターが NULL でない場合、 ObjectsSecurityDescriptor 所有者は ModificationDescriptor の所有者に設定されます。
SEF_DEFAULT_GROUP_FROM_PARENT
0x40
ObjectsSecurityDescriptor のグループは、オブジェクトの親の所有者からのグループに既定で設定されます。 このフラグが設定されていない場合、 ObjectsSecurityDescriptor のグループは、既定で Token パラメーターで指定されたトークンのグループに設定されます。 トークンのグループは、トークン自体で指定されます。 どちらの場合も、 ModificationDescriptor パラメーターが NULL でない場合、 ObjectsSecurityDescriptor グループは ModificationDescriptor のグループに設定されます。
SEF_MACL_NO_WRITE_UP
0x100
オブジェクトより低いレベルの必須レベルを持つプリンシパルは、オブジェクトに書き込むことができません。
SEF_MACL_NO_READ_UP
0x200
オブジェクトよりも低いレベルの必須レベルを持つプリンシパルは、オブジェクトを読み取ることができません。
SEF_MACL_NO_EXECUTE_UP
0x400
オブジェクトより低いレベルの必須レベルを持つプリンシパルは、オブジェクトを実行できません。
SEF_AVOID_OWNER_RESTRICTION
0x1000
ObjectsSecurityDescriptor で DACL を指定する呼び出し元の機能を制限する、オブジェクトの親の所有者によって指定された制限は無視されます。

[in] GenericMapping

各汎用アクセス権に対応する特定の標準アクセス権を指定する GENERIC_MAPPING構造体への ポインター。

[in, optional] Token

プライベート オブジェクトのセキュリティが変更されているクライアントの アクセス トークン を識別します。 このパラメーターは、クライアントが新しい所有者 セキュリティ識別子 (SID) の正当な値を提供していることを確認するために必要です。 トークンは、TOKEN_QUERYアクセスのために開いている必要があります。

戻り値

関数が成功した場合、関数は 0 以外の値を返します。

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

解説

AutoInheritFlags パラメーターが 0 の場合、SetPrivateObjectSecurityExSetPrivateObjectSecurity 関数と同じです。

この関数は、リソース マネージャーのみが使用することを目的としています。 セキュリティ記述子を更新するための標準の Windows アクセス制御セマンティクスを実装するには、リソース マネージャーが SetPrivateObjectSecurityEx を呼び出す前に、次の条件が満たされていることを確認する必要があります。

  • オブジェクトの所有者が設定されている場合、呼び出し 元のプロセス には、WRITE_OWNERアクセス許可またはオブジェクトの所有者である必要があります。
  • オブジェクトの DACL が設定されている場合、呼び出し元のプロセスには、WRITE_DACアクセス許可またはオブジェクトの所有者である必要があります。
  • オブジェクトの SACL が設定されている場合は、呼び出し元のプロセスに対してSE_SECURITY_NAME特権を有効にする必要があります。
上記の条件が満たされていない場合、この関数の呼び出しは失敗しませんが、標準の Windows アクセス ポリシーは適用されません。

クライアントには通常、基になるトークン操作に必要な適切な特権がないため、この関数を呼び出すプロセスはクライアントを偽装しないでください。

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

  • SE_DACL_PROTECTED フラグが現在のセキュリティ記述子または ModificationDescriptor の制御ビットに設定されていない場合、関数は現在のセキュリティ記述子の継承された ACE と ModificationDescriptor の非継承 ACE から出力セキュリティ記述子を構築します。 つまり、オブジェクトの アクセス制御リスト (ACL) を変更することで、継承された ACE を変更することはできません。 この動作では、親コンテナーから継承された継承された ACE が保持されます。

    ACL エディターでは、継承された ACE が変更されないようにする必要があります。

  • SE_DACL_PROTECTEDが ModificationDescriptor で設定されている場合、現在のセキュリティ記述子は無視されます。 出力セキュリティ記述子は、INHERITED_ACE ビットがオフになっている ModificationDescriptor のコピーとして構築されます。

    ACL エディターでは、オブジェクトの親から継承された ACE がオブジェクトに明示的に設定されていることを呼び出し元に示すINHERITED_ACE ビットをオフにするのが理想的です。

  • SE_DACL_PROTECTEDが ModificationDescriptor ではなく、現在のセキュリティ記述子で設定されている場合、現在のセキュリティ記述子は無視されます。 出力セキュリティ記述子は、 ModificationDescriptor のコピーとしてビルドされます。 正しい ACE でINHERITED_ACE ビットがオンになっていることを確認するのは呼び出し元の責任です。
AutoInheritFlags でSEF_SACL_AUTO_INHERIT ビットが指定されている場合、関数は新しい SACL に同様の規則を適用します。

DACL と SACL の両方について、入力 ObjectsSecurityDescriptorModificationDescriptor の特定の種類の ACE は、出力 ObjectsSecurityDescriptor の 2 つの ACE に置き換えられます。 具体的には、次のマップ可能な要素の少なくとも 1 つを含む継承可能な ACE では、出力 ObjectsSecurityDescriptor に 2 つの ACE が生成されます。 マップ可能な要素は次のとおりです。

  • ACCESS_MASK構造体の汎用アクセス権
  • ACE サブジェクト識別子としての作成者所有者 SID または作成者グループ SID
これらのマップ可能な要素のいずれかを持つ ACE では、出力 ObjectsSecurityDescriptor に次の 2 つの ACE が生成されます。
  • 元ののコピーですが、INHERIT_ONLY フラグが設定されている ACE
  • INHERITED_ACE ビットがオンになり、ジェネリック要素が特定の要素にマップされる ACE。
    • 汎用アクセス権は、入力 GenericMapping で示されている対応する標準および特定のアクセス権に置き換えられます。
    • 作成者所有者 SID は、出力 SecurityDescriptor の所有者に置き換えられます
    • Creator Group SID は、出力 SecurityDescriptor のグループに置き換えられます
AutoInheritFlags でSEF_AVOID_PRIVILEGE_CHECK ビットが指定されていない場合は、次の規則に従って所有者の有効性チェックが実行されます。 ModificationDescriptor の所有者:
  • 法的な形式の SID である必要があります
  • Token 内の TokenUser と一致する必要があります
または
  • トークン内の TokenGroups 内のグループと一致する必要があります 。このグループ の属性は次のとおりです。
    • SE_GROUP_OWNERを含める
    • SE_GROUP_USE_FOR_DENY_ONLYを含める
オブジェクトのサブツリーで Owner を設定しているリソース マネージャーは、冗長な所有者の有効性チェックのオーバーヘッドを回避できます。 ModificationDescriptorToken の所有者がこの関数の反復呼び出しで同じままの場合、所有者の有効性チェックが実行される最初の呼び出しの後の呼び出しに対して、SEF_AVOID_PRIVILEGE_CHECK ビットを AutoInheritFlags に設定できます。 最終的に所有者を設定するクライアントのトークンにアクセスできない呼び出し元も、所有者の検証チェックをスキップすることを選択する必要があります。
メモSetPrivateObjectSecurityEx 関数で使用されるSEF_AVOID_PRIVILEGE_CHECK ビットは、CreatePrivateObjectSecurityEx 関数で使用されるSEF_AVOID_OWNER_CHECK ビットと同じです。
 

要件

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

こちらもご覧ください

ACCESS_MASK

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

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

CreatePrivateObjectSecurityEx

DestroyPrivateObjectSecurity

GENERIC_MAPPING

GetPrivateObjectSecurity

SECURITY_DESCRIPTOR

SECURITY_INFORMATION

SetFileSecurity

SetKernelObjectSecurity

SetPrivateObjectSecurity

SetUserObjectSecurity