设置目录和子文件夹的权限
Set permissions for directory and also child folders
我的 C# 代码创建了一个用户,创建了共享文件夹并设置了该文件夹的用户权限,
现在如果我有这样的文件夹:
A
|_B
|_C
|_D
然后如果我为文件夹 A 创建共享,那么它只共享 A 而不会共享 B、C、D。
我的问题:如何启用继承?我的意思是让 B、C、D 也共享。
我找到了 this 代码的和平,但它什么都不做。
这是我的完整代码:
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);
共享整个目录树,如果共享父文件夹,则共享所有后代文件夹。
但共享和文件夹 ACL 仍然适用。
如果您无法通过共享看到 A
的子项,请检查共享和文件夹权限。特别是用于访问共享的身份需要对共享和 A
的读取权限才能查看 A
.
的内容
理查德对问题的评论是正确的,也是最重要的信息。通常您不需要单独共享子文件夹(仅在非常特殊的情况下)。
此外,他的回答对 "check both share and folder permission"
代码有问题。共享入口点的 NTFS-ACL 可能设置不正确或至少是非标准的,并且可能不是 RTException 想要的。
使用 InheritanceFlags.ContainerInherit , PropagationFlags.InheritOnly
(如在原始代码中)导致:
- NO 允许用户访问入口文件夹(因为 ACL 仅继承)
- 只有子目录会继承此 ACE,文件不会
如果删除了通常的 "User" / "Authenticated User" 权限,新用户将收到拒绝访问错误,因为他甚至无法访问入口目录。
使用
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None
通向 "default" 权限。
这和问题link中提到的一模一样
Windows ACL/继承是一个非常复杂的话题,也很容易出错。有些细节可能会导致意想不到的结果。
我的 C# 代码创建了一个用户,创建了共享文件夹并设置了该文件夹的用户权限,
现在如果我有这样的文件夹:
A
|_B
|_C
|_D
然后如果我为文件夹 A 创建共享,那么它只共享 A 而不会共享 B、C、D。
我的问题:如何启用继承?我的意思是让 B、C、D 也共享。
我找到了 this 代码的和平,但它什么都不做。
这是我的完整代码:
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);
共享整个目录树,如果共享父文件夹,则共享所有后代文件夹。
但共享和文件夹 ACL 仍然适用。
如果您无法通过共享看到 A
的子项,请检查共享和文件夹权限。特别是用于访问共享的身份需要对共享和 A
的读取权限才能查看 A
.
理查德对问题的评论是正确的,也是最重要的信息。通常您不需要单独共享子文件夹(仅在非常特殊的情况下)。
此外,他的回答对 "check both share and folder permission"
代码有问题。共享入口点的 NTFS-ACL 可能设置不正确或至少是非标准的,并且可能不是 RTException 想要的。
使用 InheritanceFlags.ContainerInherit , PropagationFlags.InheritOnly
(如在原始代码中)导致:
- NO 允许用户访问入口文件夹(因为 ACL 仅继承)
- 只有子目录会继承此 ACE,文件不会
如果删除了通常的 "User" / "Authenticated User" 权限,新用户将收到拒绝访问错误,因为他甚至无法访问入口目录。
使用
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None
通向 "default" 权限。
这和问题link中提到的一模一样
Windows ACL/继承是一个非常复杂的话题,也很容易出错。有些细节可能会导致意想不到的结果。