Установить разрешения для каталога, а также дочерних папок - PullRequest
0 голосов
/ 02 июля 2018

Мой код c # создает пользователя, создает общую папку и устанавливает разрешение пользователя для этой папки,

на данный момент, если у меня есть такие папки, как:

A
|_B
|_C
|_D

Тогда Если я создаю общий ресурс для папки A, то он разделяет только A без общего доступа B, C, D.

enter image description here

enter image description here

Моя очередь: как включить наследование? Я имею в виду, чтобы B, C, D также были общими.

Я нашел этот код, но он ничего не делает.

вот мой полный код:

string uName = "myusername";
string pass = "Rr1234567#";
string path = @"C:\Users\danielf\Desktop\A";
string shareName = "MyShare";
string description = "some description";


PrincipalContext ctx = new PrincipalContext(ContextType.Machine);
UserPrincipal user = new UserPrincipal(ctx ,uName  ,pass  , true);
user.PasswordNeverExpires = true;
user.Save();


DirectoryInfo dInfo = new DirectoryInfo(path);
WindowsIdentity id = WindowsIdentity.GetCurrent();
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(uName , FileSystemRights.FullControl , InheritanceFlags.ContainerInherit , PropagationFlags.InheritOnly , AccessControlType.Allow));
        dInfo.SetAccessControl(dSecurity);

        //Gets User SID for share permissions **NotSecurty**
        NTAccount account = new NTAccount(System.Environment.MachineName , uName);
        SecurityIdentifier sid = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
        byte[] sidArray = new byte[sid.BinaryLength];
        sid.GetBinaryForm(sidArray , 0);

        ManagementObject Trustee = new ManagementClass("root\\CIMV2" , "Win32_Trustee" , null);
        Trustee["Domain"] = ".";
        Trustee["Name"] = uName;
        Trustee["SID"] = sidArray;

        ManagementBaseObject AdminACE = new ManagementClass(new ManagementPath("Win32_Ace") , null);

        // Add the input parameters.
        AdminACE["AccessMask"] = 2032127;
        AdminACE["AceFlags"] = 3;
        AdminACE["AceType"] = 0;
        AdminACE["Trustee"] = Trustee;

        //Security Descriptor For Share creation Parameter
        ManagementObject secDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor") , null);
        secDescriptor["ControlFlags"] = 4;
        secDescriptor["DACL"] = new object[] { AdminACE };

        ManagementClass classInstance = new ManagementClass("root\\CIMV2" , "Win32_Share" , null);

        // Obtain in-parameters for the method
        ManagementBaseObject inParams = classInstance.GetMethodParameters("Create");

        // Add the input parameters.
        inParams["Name"] = shareName; 
        inParams["Path"] = path;
        inParams["Type"] = 0;
        inParams["Description"] = description;
        inParams["Access"] = secDescriptor;
        inParams["MaximumAllowed"] = null;

        // Execute the method and obtain the return values.
        ManagementBaseObject outParams = classInstance.InvokeMethod("Create" , inParams , null);

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Комментарий Ричарда к вопросу правильный и самая важная информация. Обычно вам не нужны отдельные папки для подпапок (только в особых случаях).

Кроме того, его ответ также подходит для проверки прав доступа к общей папке и папке

В коде есть проблема. NTFS-ACL точки входа в общий ресурс, вероятно, установлен неправильно или, по крайней мере, нестандартно и, вероятно, не соответствует требованиям RTException.

Использование InheritanceFlags.ContainerInherit , PropagationFlags.InheritOnly (как в исходном коде) приводит к:

  • НЕТ доступ пользователя к папке ввода (поскольку ACL-файл наследуется только)
  • только подкаталоги наследуют этот ACE, а не файлы

Если обычное разрешение «Пользователь» / «Аутентифицированный пользователь» удалено, новый пользователь получает ошибку «Отказано в доступе», поскольку он не может получить доступ даже к каталогу ввода.

используя

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None

приводит к разрешению «по умолчанию».

И это точно так же, как упомянуто в ссылке в вопросе.

Windows ACL / наследование является очень сложной темой и также подвержено ошибкам. Есть некоторые тонкости, которые могут привести к неожиданным результатам.

0 голосов
/ 02 июля 2018

Общие ресурсы принадлежат всему дереву каталогов, если родительский ресурс является общим, то же самое относится и ко всем дочерним папкам.

Но списки ACL для общих папок и папок по-прежнему применяются.

Если вы не видите дочерних элементов A через общий ресурс, проверьте разрешения для общего ресурса и папки. В частности, учетная запись, используемая для доступа к общему ресурсу, должна иметь доступ на чтение как к общему ресурсу, так и к A, чтобы увидеть содержимое A.

...