C# 文件夹 ACL 不适用

本文关键字:不适用 ACL 文件夹 | 更新日期: 2023-09-27 17:57:14

我最近开始为一个项目学习C#,该项目是编写一个更新的用户创建工具来替换我们旧的vbscript工具。到目前为止,我已经完成了它的所有活动目录端,但是在创建配置文件文件夹时,文件夹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);

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

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

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

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

C# 文件夹 ACL 不适用

听起来它不喜欢你的AddAccessRule。查看:设置文件访问规则对于类似的东西

感谢您的回复。

只是一个更新,我玩了一下,结果发现"部分或所有身份引用无法翻译"消息实际上是在尝试为刚刚创建的用户帐户添加权限时,它找不到用户。

一旦我将其注释掉并仅测试添加域管理员权限,它就会完成执行而没有错误,但会出现同样的问题。域管理员被添加为权限,但仅选中"特殊权限",这意味着不应用完全控制。

如果没有错误消息,我无法弄清楚为什么会发生这种情况。我认为这可能是因为我在应用新 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));

感谢您的帮助。