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 で定義されている次の値の組み合わせを指定できます。
値 | 意味 |
---|---|
|
新しい 随意アクセス制御リスト (DACL) には、オブジェクトの親の DACL から継承された ACE と、 ModificationDescriptor の DACL で指定された明示的な ACE が含まれます。 このフラグが設定されていない場合、新しい DACL は ACE を継承しません。 |
|
新しい システム アクセス制御リスト (SACL) には、オブジェクトの親に関連付けられているセキュリティ記述子の SACL から継承された ACE と、 ModificationDescriptor の SACL で指定された明示的な ACE が含まれます。 このフラグが設定されていない場合、新しい SACL は ACE を継承しません。 |
|
関数は特権チェックを実行しません。 SEF_AVOID_OWNER_CHECK フラグも設定されている場合は、Token パラメーターに NULL を指定できます。 更新された各子に対する特権をチェックしないように、自動継承を実装する場合は、このフラグを使用します。 |
|
関数は、「解説」で説明されているように、結果の ObjectsSecurityDescriptor で所有者の有効性をチェックしません。 SEF_AVOID_PRIVILEGE_CHECK フラグも設定されている場合は、Token パラメーターに NULL を指定できます。 |
|
ObjectsSecurityDescriptor の所有者は、既定でオブジェクトの親の所有者になります。 このフラグが設定されていない場合、 ObjectsSecurityDescriptor の所有者は、既定で Token パラメーターで指定されたトークンの所有者に設定されます。 トークンの所有者は、トークン自体で指定されます。 どちらの場合も、 ModificationDescriptor パラメーターが NULL でない場合、 ObjectsSecurityDescriptor 所有者は ModificationDescriptor の所有者に設定されます。 |
|
ObjectsSecurityDescriptor のグループは、オブジェクトの親の所有者からのグループに既定で設定されます。 このフラグが設定されていない場合、 ObjectsSecurityDescriptor のグループは、既定で Token パラメーターで指定されたトークンのグループに設定されます。 トークンのグループは、トークン自体で指定されます。 どちらの場合も、 ModificationDescriptor パラメーターが NULL でない場合、 ObjectsSecurityDescriptor グループは ModificationDescriptor のグループに設定されます。 |
|
オブジェクトより低いレベルの必須レベルを持つプリンシパルは、オブジェクトに書き込むことができません。 |
|
オブジェクトよりも低いレベルの必須レベルを持つプリンシパルは、オブジェクトを読み取ることができません。 |
|
オブジェクトより低いレベルの必須レベルを持つプリンシパルは、オブジェクトを実行できません。 |
|
ObjectsSecurityDescriptor で DACL を指定する呼び出し元の機能を制限する、オブジェクトの親の所有者によって指定された制限は無視されます。 |
[in] GenericMapping
各汎用アクセス権に対応する特定の標準アクセス権を指定する GENERIC_MAPPING構造体への ポインター。
[in, optional] Token
プライベート オブジェクトのセキュリティが変更されているクライアントの アクセス トークン を識別します。 このパラメーターは、クライアントが新しい所有者 セキュリティ識別子 (SID) の正当な値を提供していることを確認するために必要です。 トークンは、TOKEN_QUERYアクセスのために開いている必要があります。
戻り値
関数が成功した場合、関数は 0 以外の値を返します。
関数が失敗すると、0 が返されます。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
AutoInheritFlags パラメーターが 0 の場合、SetPrivateObjectSecurityEx は SetPrivateObjectSecurity 関数と同じです。
この関数は、リソース マネージャーのみが使用することを目的としています。 セキュリティ記述子を更新するための標準の Windows アクセス制御セマンティクスを実装するには、リソース マネージャーが SetPrivateObjectSecurityEx を呼び出す前に、次の条件が満たされていることを確認する必要があります。
- オブジェクトの所有者が設定されている場合、呼び出し 元のプロセス には、WRITE_OWNERアクセス許可またはオブジェクトの所有者である必要があります。
- オブジェクトの DACL が設定されている場合、呼び出し元のプロセスには、WRITE_DACアクセス許可またはオブジェクトの所有者である必要があります。
- オブジェクトの SACL が設定されている場合は、呼び出し元のプロセスに対してSE_SECURITY_NAME特権を有効にする必要があります。
クライアントには通常、基になるトークン操作に必要な適切な特権がないため、この関数を呼び出すプロセスはクライアントを偽装しないでください。
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 ビットがオンになっていることを確認するのは呼び出し元の責任です。
DACL と SACL の両方について、入力 ObjectsSecurityDescriptor と ModificationDescriptor の特定の種類の ACE は、出力 ObjectsSecurityDescriptor の 2 つの ACE に置き換えられます。 具体的には、次のマップ可能な要素の少なくとも 1 つを含む継承可能な ACE では、出力 ObjectsSecurityDescriptor に 2 つの ACE が生成されます。 マップ可能な要素は次のとおりです。
- ACCESS_MASK構造体の汎用アクセス権
- ACE サブジェクト識別子としての作成者所有者 SID または作成者グループ SID
- 元ののコピーですが、INHERIT_ONLY フラグが設定されている ACE
- INHERITED_ACE ビットがオンになり、ジェネリック要素が特定の要素にマップされる ACE。
- 汎用アクセス権は、入力 GenericMapping で示されている対応する標準および特定のアクセス権に置き換えられます。
- 作成者所有者 SID は、出力 SecurityDescriptor の所有者に置き換えられます
- Creator Group SID は、出力 SecurityDescriptor のグループに置き換えられます
- 法的な形式の SID である必要があります
- Token 内の TokenUser と一致する必要があります
- トークン内の TokenGroups 内のグループと一致する必要があります 。このグループ の属性は次のとおりです。
- SE_GROUP_OWNERを含める
- SE_GROUP_USE_FOR_DENY_ONLYを含める
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | securitybaseapi.h (Windows.h を含む) |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |