当我在ProgramData
文件夹中创建一个文件夹时,说Test
,那么默认情况下,我看到Users
组的文件夹的权限如下,
问题,我可以删除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);
}
答案 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产生各种问题。