web-dev-qa-db-ja.com

C#.NETを使用してフォルダーに「全員」権限を追加します

以下のコードを使用して、フォルダへの全員のアクセスを許可しました。

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ユーザーがフォルダーに追加されますが、権限は割り当てられていません。すべての読み取り、書き込み、実行などのチェックボックスはチェックされていません。

69

最初にお伝えしたいのは、このソリューションをどのように見つけたかです。ファイルのアクセス許可を取得するのは難しいため、これはおそらく答えよりも重要です。

最初にしたことは、Windowsのダイアログとチェックボックスを使用して、必要なアクセス許可を設定することでした。 「全員」のルールを追加し、「フルコントロール」以外のすべてのボックスにチェックを入れました。

次に、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セキュリティダイアログのチェックボックスが、テストディレクトリに既に設定されているものと一致します。

119
Yoshi

以下のコードは、フォルダーの存在を確認し、作成されていない場合は作成します。そして、そのフォルダのすべてのユーザー許可を完全な許可(読み取りと書き込み)に設定します。

string file = @"D:\Richi";     
private static void GrantAccess(string file)
            {
                bool exists = System.IO.Directory.Exists(file);
                if (!exists)
                {
                    DirectoryInfo di = System.IO.Directory.CreateDirectory(file);
                    Console.WriteLine("The Folder is created Sucessfully");
                }
                else
                {
                    Console.WriteLine("The Folder already exists");
                }
                DirectoryInfo dInfo = new DirectoryInfo(file);
                DirectorySecurity dSecurity = dInfo.GetAccessControl();
                dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
                dInfo.SetAccessControl(dSecurity);

            }
12

つかいます FileSystemRights.FullControl の代わりに FileSystemRights.Modifyすべてのアクション(ACL)を許可する場合。

5
Simon Smeets