C# Directory.SetAccessControl设置不必要的权限

C# Directory.SetAccessControl设置不必要的权限,c#,directory,file-permissions,acl,C#,Directory,File Permissions,Acl,我正在尝试设置仅限于管理员的程序安装文件夹权限 有两种情况:文件夹需要创建,并且文件夹已经存在 这是我的密码: public static void CreatePrivateFolder(string path) { SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); DirectorySecurity

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

有两种情况:文件夹需要创建,并且文件夹已经存在

这是我的密码:

    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的代码似乎无法正常工作。 文件夹的权限保持不受限制


谢谢

如果(Directory.Exists(path))块存在,请使用此命令代替
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);

@安丽,谢谢你的回答。当文件夹已存在且具有限制权限时,您的解决方案将起作用。但是,如果文件夹存在时没有限制权限,则代码不会覆盖这些规则,并且文件夹仍然可以访问。