Directory.SetAccessControl 设置不必要的权限

Directory.SetAccessControl set unnecessary permissions

我正在尝试将程序的安装文件夹权限设置为仅限管理员。

有两种情况:文件夹需要创建和文件夹已经存在。

这是我的代码:

    public static void CreatePrivateFolder(string path)
    {
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
        DirectorySecurity securityRules = new DirectorySecurity();
        FileSystemAccessRule fsRule =
            new FileSystemAccessRule(sid, FileSystemRights.FullControl,
            InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
            PropagationFlags.None, AccessControlType.Allow);

        securityRules.SetAccessRule(fsRule);

        if (Directory.Exists(path))
        {
            Directory.SetAccessControl(path, securityRules);
        }
        else
        {
            Directory.CreateDirectory(path, securityRules);
        }                
    }

当需要创建文件夹时,CreateDirectory 工作正常,文件夹的权限仅限于管理员。

奇怪的是,当我重新 运行 这段代码并流向 SetAccessControl - 文件夹的权限被重置为没有访问限制的常规文件夹。

我做错了什么?

文件夹安全结果(针对路径 c:\folderCheck):

更新 anrei 回答我的问题。 但是,它似乎以不同的方式出现了同样的问题: 如果该文件夹已经存在且权限不受限制,则 anrei 的代码似乎不起作用。 该文件夹的权限保持不受限制。

谢谢!

用这个代替你的 if (Directory.Exists(path)) 块。

// what is
var existingACL = Directory.GetAccessControl(path);
// remove everything from what is
foreach (FileSystemAccessRule rule in existingACL.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
        existingACL.RemoveAccessRuleAll(rule);
// add yours to what is           
existingACL.AddAccessRule (fsRule);
// set again
Directory.SetAccessControl(path, existingACL);