継承可能な ACE の自動伝達
SetNamedSecurityInfo 関数と SetSecurityInfo 関数は、継承可能なアクセス制御エントリ (ACE) の自動伝達をサポートします。 たとえば、これらの関数を使用して NTFS 内のディレクトリに継承可能な ACE を追加すると、システムは、既存のサブディレクトリまたはファイルの アクセス制御リスト (ACL) に必要に応じて ACE を適用します。
直接適用された ACE は、継承された ACE よりも優先されます。 システムは、継承された ACE の前に直接適用された ACE を 随意アクセス制御リスト (DACL) に配置することで、この優先順位を実装します。 SetNamedSecurityInfo 関数と SetSecurityInfo 関数を呼び出してオブジェクトのセキュリティ情報を設定すると、システムは、ターゲット オブジェクトの下の階層内のすべてのオブジェクトの ACL に現在の継承モデルを適用します。 現在の継承モデルに変換されたオブジェクトの場合、SE_DACL_AUTO_INHERITEDビットとSE_SACL_AUTO_INHERITEDビットは、オブジェクトの セキュリティ記述子 の制御フィールドに設定されます。
現在の継承モデルを反映する新しいセキュリティ記述子を構築する場合は、セキュリティ記述子のセマンティクスを変更しないように注意してください。 そのため、許可と拒否の ACE は互いに関連して移動されることはありません。 このような移動が必要な場合 (たとえば、すべての非暗号化 ACE を ACL の前面に配置する場合)、ACL はセマンティック変更を防ぐために保護済みとしてマークされます。
継承された ACE を子オブジェクトに反映する場合、システムは次の規則を使用します。
- DACL を持たない子オブジェクトが ACE を継承する場合、その結果は、継承された ACE のみを含む DACL を持つ子オブジェクトになります。
- 空の DACL を持つ子オブジェクトが ACE を継承する場合、その結果は、継承された ACE のみを含む DACL を持つ子オブジェクトになります。
- 親オブジェクトから継承可能な ACE を削除すると、子オブジェクトによって継承された ACE のコピーが自動的に削除されます。
- 自動継承の結果、子オブジェクトの DACL からすべての ACE が削除される場合、子オブジェクトには DACL ではなく空の DACL があります。
これらの規則では、DACL のないオブジェクトを空の DACL を持つオブジェクトに変換すると、予期しない結果が生じる可能性があります。 DACL を持たないオブジェクトはフル アクセスを許可しますが、空の DACL を持つオブジェクトはアクセスを許可しません。 これらの規則で空の DACL を作成する方法の例として、オブジェクトのツリーのルート オブジェクトに継承可能な ACE を追加するとします。 自動継承では、継承可能な ACE がツリー内のすべてのオブジェクトに反映されます。 DACL なしで開始された子オブジェクトに、継承された ACE を持つ DACL が追加されました。 継承可能な ACE をルート オブジェクトから削除すると、変更が子オブジェクトに自動的に反映されます。 DACL なしで開始された子オブジェクト (フル アクセスを許可) に空の DACL (アクセスを許可しない) が追加されました。
DACL のない子オブジェクトが継承可能な ACE の影響を受けないようにするには、オブジェクトのセキュリティ記述子で SE_DACL_PROTECTED フラグを設定します。
DACL を適切に作成する方法については、「 DACL の作成」を参照してください。