1. ホーム
  2. c#

C#.NETを使用してフォルダに「Everyone」権限を追加する

2023-08-26 08:35:22

質問

あるフォルダにEveryoneがアクセスできるようにするために、以下のコードを使用しました。

System.Security.AccessControl.DirectorySecurity sec =
    System.IO.Directory.GetAccessControl(directory, AccessControlSections.All);
FileSystemAccessRule accRule = new FileSystemAccessRule("Everyone",
                                       FileSystemRights.Modify,
                                       AccessControlType.Allow);
sec.AddAccessRule(accRule);    // setACL
sec.ResetAccessRule(accRule);

ここで、Everyoneユーザーがフォルダに追加されましたが、何の権利も割り当てられていません。すべての読み取り、書き込み、実行などのチェックボックスはチェックされていません。

どのように解決するのですか?

最初にお伝えしたいのは、私がどうやってこの解決策を見つけたかということです。 ファイルのパーミッションを正しく取得するのは難しいので、これはおそらく答えよりも重要なことです。

私が最初に行ったことは、Windows のダイアログとチェックボックスを使用して、必要なパーミッションを設定することでした。 私は、Everyone のルールを追加し、フル コントロール以外のすべてのボックスにチェックを入れました。

それから、Windows の設定を複製するために必要なパラメータを正確に伝えるために、この C# コードを書きました。

string path = @"C:\Users\you\Desktop\perms"; // path to directory whose settings you have already correctly configured
DirectorySecurity sec = Directory.GetAccessControl(path);
foreach (FileSystemAccessRule acr in sec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) {
    Console.WriteLine("{0} | {1} | {2} | {3} | {4}", acr.IdentityReference.Value, acr.FileSystemRights, acr.InheritanceFlags, acr.PropagationFlags, acr.AccessControlType);
}

これによって、次のような行が出力されました。

Everyone | Modify, Synchronize | ContainerInherit, ObjectInherit | None | Allow

というわけで、解決策は簡単です(でも、何を探せばいいのかわからないと、正しく理解するのは難しい!)。

DirectorySecurity sec = Directory.GetAccessControl(path);
// Using this instead of the "Everyone" string means we work on non-English systems.
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
Directory.SetAccessControl(path, sec);

これにより、Windowsセキュリティダイアログのチェックボックスが、テストディレクトリに既に設定されているものと一致するようになります。