ACL の作成または変更
Windows では、アクセス 制御リスト (ACL) を作成したり、既存の ACL の アクセス制御エントリ (ACE) を変更したりする一連の関数がサポートされています。
SetEntriesInAcl 関数は、新しい ACL を作成します。 SetEntriesInAcl では、ACL に対してまったく新しい ACE のセットを指定することも、1 つ以上の新しい ACE を既存の ACL の ACE とマージすることもできます。 SetEntriesInAcl 関数は、EXPLICIT_ACCESS構造体の配列を使用して、新しい ACE の情報を指定します。 各 EXPLICIT_ACCESS 構造体には、1 つの ACE を記述する情報が含まれています。 この情報には、アクセス権、ACE の種類、ACE 継承を制御するフラグ、トラスティを識別する トラスティ 構造体が含まれます。
既存の ACL に新しい ACE を追加するには
- GetSecurityInfo 関数または GetNamedSecurityInfo 関数を使用して、オブジェクトのセキュリティ記述子から既存の DACL または SACL を取得します。
- 新しい ACE ごとに BuildExplicitAccessWithName 関数を呼び出して、ACE を記述する情報 をEXPLICIT_ACCESS 構造体に入力します。
- SetEntriesInAcl を呼び出し、既存の ACL と、新しい ACE のEXPLICIT_ACCESS構造体の配列を指定します。 SetEntriesInAcl 関数は、ACL とその ACE を割り当てて初期化します。
- SetSecurityInfo 関数または SetNamedSecurityInfo 関数を呼び出して、新しい ACL をオブジェクトのセキュリティ記述子にアタッチします。
呼び出し元が既存の ACL を指定した場合、 SetEntriesInAcl は新しい ACE 情報を ACL 内の既存の ACE とマージします。 たとえば、既存の ACL が指定したトラスティへのアクセスを許可し、 EXPLICIT_ACCESS 構造体が同じトラスティへのアクセスを拒否する場合を考えてみましょう。 この場合、 SetEntriesInAcl はトラスティに対して新しいアクセス拒否 ACE を追加し、トラスティの既存のアクセス許可 ACE を削除または変更します。
新しい ACE を既存の ACL にマージするサンプル コードについては、「 C++ でのオブジェクトの ACL の変更」を参照してください。