Установить разрешения для каталога, а также дочерних папок
Мой код C# создает пользователя, создает общую папку и устанавливает разрешение пользователя для этой папки,
на данный момент, если у меня есть такие папки, как:
A
|_B
|_C
|_D
Затем, если я создаю общий ресурс для папки A, то он разделяет только A без общего доступа B,C,D.
Мой вопрос: как включить наследование? Я имею в виду сделать так, чтобы 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 ответа
Общие ресурсы относятся ко всему дереву каталогов, если родительский ресурс является общим, то же самое относится и ко всем дочерним папкам.
Но ACL для общих папок и папок все еще применяются.
Если вы не можете видеть детей A
через общий ресурс, затем проверьте разрешения для общего ресурса и папки. В частности, для идентификации, используемой для доступа к общему ресурсу, необходим доступ на чтение как к общему ресурсу, так и к A
чтобы увидеть содержание A
,
Комментарий Ричарда к вопросу верен и является самой важной информацией. Обычно вам не нужны отдельные папки для подпапок (только в особых случаях).
Кроме того, его ответ также подходит для проверки прав доступа к общим папкам и папкам.
В коде есть проблема. NTFS-ACL точки входа общего ресурса, вероятно, установлен неправильно или, по крайней мере, нестандартно и, вероятно, не соответствует требованиям RTException.
С помощью InheritanceFlags.ContainerInherit , PropagationFlags.InheritOnly
(как в оригинальном коде) приводит к:
- НЕТ доступа пользователя к папке ввода (так как ACL наследуется только)
- только подкаталоги наследуют этот ACE, а не файлы
Если обычное разрешение "Пользователь" / "Аутентифицированный пользователь" удалено, новый пользователь получает ошибку отказа в доступе, поскольку он не может получить доступ даже к каталогу записи.
с помощью
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None
приводит к разрешению "по умолчанию".
И это точно так же, как упомянуто в ссылке в вопросе.
Списки ACL / наследование Windows - очень сложная тема, а также подверженная ошибкам. Есть некоторые тонкости, которые могут привести к неожиданным результатам.