删除ProgramData中文件夹的Users组权限

时间:2018-07-11 04:36:43

标签: c#

当我在ProgramData文件夹中创建一个文件夹时,说Test,那么默认情况下,我看到Users组的文件夹的权限如下,

enter image description here

问题,我可以删除Users组的所有权限吗?

我尝试了下面的代码,但没有删除任何权限,

// This gets the "Authenticated Users" group, no matter what it's called
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);

        // Create the rules
        FileSystemAccessRule fullControlRule = new FileSystemAccessRule(sid, FileSystemRights.FullControl, AccessControlType.Allow);

        if (Directory.Exists("C:\\ProgramData\\Test"))
        {
            // Get your file's ACL
            DirectorySecurity fsecurity = Directory.GetAccessControl("C:\\ProgramData\\Test");

            // remove the rule to the ACL
            fsecurity.RemoveAccessRuleAll(fullControlRule);

            // Set the ACL back to the file
            Directory.SetAccessControl("C:\\ProgramData\\Test", fsecurity);
        }

1 个答案:

答案 0 :(得分:1)

首先,应满足您要求的代码(我自己进行了测试):

using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
...
...

var directoryInfo = new DirectoryInfo(@"C:\ProgramData\Test");

// get the ACL of the directory
var dirSec = directoryInfo.GetAccessControl();

// remove inheritance, copying all entries so that they are direct ACEs
dirSec.SetAccessRuleProtection(true, true);

// do the operation on the directory
directoryInfo.SetAccessControl(dirSec);

// reread the ACL
dirSec = directoryInfo.GetAccessControl();

// get the well known SID for "Users"
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);

// loop through every ACE in the ACL
foreach (FileSystemAccessRule rule in dirSec.GetAccessRules(true, false, typeof(SecurityIdentifier)))
{
    // if the current entry is one with the identity of "Users", remove it
    if (rule.IdentityReference == sid)
        dirSec.RemoveAccessRule(rule);
}

// do the operation on the directory
directoryInfo.SetAccessControl(dirSec);

现在要详细说明:

首先,您的主意是使用知名的SID,而不是直接使用字符串。但是 Users 组不是 Authenticated Users ,因此我们必须使用BuiltinUsersSid

然后,我们必须删除继承。在上面的屏幕截图中,条目显示为灰色,因此不能直接更改。首先,我们必须将继承的条目迁移到直接条目,并保留旧条目(否则,ACL随后将为空)。

然后, 用户 可以有多个一个条目(实际上有两个)。我们必须遍历所有条目,并检查它是否具有 Users sid。然后我们将其删除。

一些最后的话:

ACL /许可逻辑非常复杂,尤其是继承会导致许多问题。但是现在越来越好了。

我还记得继承(NT4 => Windows 2000)引入的头几年,当时很多工具(甚至是MS自己的工具)都无法正确处理继承,这会导致无效/损坏的ACL产生各种问题。