Как дать разрешения для папок в c #? - PullRequest
9 голосов
/ 23 мая 2011

Мне нужно дать папке «Temporary ASP.NET Files» разрешение на запись с использованием c # ... и я использую этот код, чтобы дать ей доступ

DirectoryInfo d1 = new DirectoryInfo(Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "Temporary ASP.NET Files"));
            DirectorySecurity md1 = d1.GetAccessControl();


            string user_1 = fa.TextGuestDomain + "\\" + fa.TextGuestUser;
            md1.AddAccessRule(new FileSystemAccessRule(user_1, FileSystemRights.FullControl,InheritanceFlags.ObjectInherit,PropagationFlags.InheritOnly, AccessControlType.Allow));

            d1.SetAccessControl(md1);

Когда я проверил свойства безопасности для папки «Временные файлы ASP.NET» после реализации кода, он не установил флажок «запись», вместо этого он установил флажок «специальные разрешения». ... Я заметил, что даже когда я изменил доступ с записи на полный контроль или чтение, он проверил "специальные разрешения" один ....

Это не проблема :), проблема в том, что он не дает права доступа, который я ему даю ... когда я даю ему запись, он не действует, как если бы я дал ему разрешение на запись. Я не знаю почему !! Я делаю это неправильно ??

Примечание: когда я делаю это ручным способом, это работает, в то время как при использовании способа кодирования. это не работает ...

Надеюсь, вы поможете мне с этим ...

Большое спасибо

Ответы [ 2 ]

9 голосов
/ 23 мая 2011

Я знаю вашу боль - ACL файловой системы - это боль, которую нужно модифицировать, и даже если кажется, что она работает, она может сломаться при некоторых обстоятельствах.К счастью, в вашем случае есть простое решение.

Проблема заключается в PropagationFlags.InheritOnly.Это означает, что это разрешение только применяется к элементам, которые наследуют разрешения - например, вы предоставляете права только для файлов в этом каталоге, а не в каких-либо подкаталогах .

Чтобы предоставить права на каталоги, которые наследуются «нормально» (т.е. распространяются на подкаталоги и все файлы), используйте следующие значения для InheritanceFlags и PropagationFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit и PropagationFlags.None.

2 голосов
/ 02 августа 2016
  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);

        }

Приведенный выше код устанавливает права доступа к папке на полный контроль / чтение-запись для каждого пользователя (каждого).

...