C# 文件夹 ACL 不适用

C# Folder ACL's not applying

我最近开始为工作中的一个项目学习 C#,该项目是编写一个更新的用户创建工具来替换我们旧的 vbscript 工具。到目前为止,我已经完成了它的所有 Active Directory 方面,但是在创建配置文件文件夹时我遇到了文件夹 ACL 的一些问题。

我已成功创建删除所有文件夹 ACL 并从头开始的功能,但我将 ACL 添加到文件夹的功能似乎不起作用。 这是函数:

public void CreateFolderACL(string FolderPath, string Account, FileSystemRights Rights, AccessControlType ControlType)
    {
        try
        {
            DirectorySecurity fs = Directory.GetAccessControl(FolderPath);
            AuthorizationRuleCollection rules = fs.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
            fs.AddAccessRule(new FileSystemAccessRule(@"domain\" + Account, Rights, ControlType));
            Directory.SetAccessControl(FolderPath, fs);
        }
        catch(Exception E)
        {
            Console.WriteLine(E);
        }
    }

当我输入类似

的内容时

CreateFolderACL(userData["ProfilePath"] + ".v2", "Domain Admins", FileSystemRights.FullControl, AccessControlType.Allow);

它在文件夹中创建了一个条目但没有设置权限(见下面的屏幕截图)并且它没有设置我尝试与域管理员一起申请的任何其他权限。

http://i.stack.imgur.com/Iul1i.png

我是新手,这是我的第一个真正的程序,但我遇到了障碍,无法弄清楚发生了什么。

具体错误为:System.Security.Principal.IdentityNotMappedException: Some or all identity references could not be translated.

听起来它不喜欢您的 AddAccessRule。看看:Set File access rule 对于类似的东西

感谢您的回复。

只是一个更新,我试了一下,结果 "Some or all identity references could not be translated." 消息实际上是在尝试为刚创建的用户帐户添加权限时,它找不到用户。

一旦我将其注释掉并仅测试添加域管理员权限,它就可以无误地完成执行,但会出现同样的问题。 Domain Admins 已添加为权限,但仅选中 "special permissions",这意味着未应用完全控制。

没有错误消息,我无法弄清楚为什么会这样。我想这可能是因为我在应用新 ACL 之前删除了所有 ACL,所以我尝试创建一个文件夹并添加域管理员权限,而没有先删除所有 ACL,结果发生了同样的事情。

如果我可以创建文件夹并从所述文件夹中清除所有 ACL,那肯定不会是权限问题?

如果我右键单击并尝试手动勾选域管理员的完全控制并点击应用,我会被拒绝访问。我不确定从这里到哪里去。

编辑:如果我不删除 ACL 并在行中添加 InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly,它会很好地应用权限。一旦我首先尝试删除 ACL,它就会以同样的方式失败。这一定是权限问题,或者我没有正确重建 ACL。

最终编辑:我把它全部整理好了。结果我需要添加两个访问规则:

fs.AddAccessRule(new FileSystemAccessRule(new System.Security.Principal.SecurityIdentifier(Account), Rights, ControlType));
            fs.AddAccessRule(new FileSystemAccessRule(new System.Security.Principal.SecurityIdentifier(Account), Rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, ControlType));

感谢您的帮助。