既存の ACL ルールに加えて、いくつかの新しい ACL ルールを追加したいと考えています。SetAccessRule
新しいルールを追加しても古いルールが保持されることを期待して、私は現在 を使用しています。のドキュメントにSetAccessRule
よると、
SetAccessRule メソッドは、指定されたアクセス制御リスト (ACL) 規則を追加するか、規則パラメーターの FileSystemRights 値と一致する同一の ACL 規則を上書きします。たとえば、ルール パラメータが Read 値を指定し、SetAccessRule メソッドが Read 値を指定する同一の ACL ルールを検出した場合、同一のルールは上書きされます。SetAccessRule メソッドが Write 値を指定する同一の ACL ルールを検出した場合、同一のルールは上書きされません。
ただし、実際には、新しいルールを追加すると、実際には以前のルールが上書きされることがわかりました (同じユーザー/SID に属していますか?)。これは、ドキュメントの内容と矛盾しているようです。
私の現在の意図は、読み取りと書き込みの両方のアクセス許可を割り当てることですが、別々の呼び出しで行います。残念ながら、後者の権限は最初の権限を上書きします。以下のコード例では、結果として、読み取りアクセス許可のみが割り当てられます。そのブロックをコメントアウトすると、書き込み権限のみが割り当てられます。これは、両方のアクセス許可を割り当てる追加の条件で修正できますがif
、ディレクトリの既存のアクセス許可が上書きされるため、望ましくありません。
DirectoryInfo directory = new DirectoryInfo(abspath);
DirectorySecurity security = directory.GetAccessControl();
security.SetAccessRuleProtection(false, true);
if (perm.Contains("write"))
{
security.SetAccessRule(new FileSystemAccessRule(user, FileSystemRights.Write, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
}
if (perm.Contains("read"))
{
security.SetAccessRule(new FileSystemAccessRule(user, FileSystemRights.ReadAndExecute | FileSystemRights.Traverse, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
}
directory.SetAccessControl(security);
既存のルールを維持しながら新しいルールを追加するにはどうすればよいですか? また、ドキュメントが間違っているのでしょうか、解釈が間違っているのでしょうか、それとも私のコードが間違っているのでしょうか?