【发布时间】:2016-07-02 10:20:09
【问题描述】:
DirectorySecurity fs;
string FolderPath = "C:/Program Files";
fs = Directory.GetAccessControl(FolderPath, AccessControlSections.All);
foreach (FileSystemAccessRule fileSystemAccessRule in fs.GetAccessRules(true,true,typeof(System.Security.Principal.NTAccount)))
{
userNameDomain = fileSystemAccessRule.IdentityReference.Value;
userRights = fileSystemAccessRule.FileSystemRights.ToString();
string[] row = { userNameDomain, userRights };
var listViewItem = new ListViewItem(row);
lv_perm.Items.Add(listViewItem);
}
在“常规”文件和文件夹(例如:C:/Users/Julien/Desktop/New folder)上执行此操作时,一切似乎都很好:
列表视图:
但是,当我对具有“特殊”权限的文件夹(例如:C:/Program Files)执行此操作时,我得到了重复的 IdentityReference.Value 与权限的奇怪数字相关联:
列表视图不好:
当我在C:/Program Files 属性中打开“权限”选项卡时,我没有那么多带有奇怪数字的权限条目。
也许我做错了什么?
编辑:从该页面Here:
使用 .NET,您可能认为确定哪些权限是 分配给目录/文件应该很容易,因为有 FileSystemRights Enum 定义的似乎包含所有可能的 文件/目录可以拥有和调用的权限 AccessRule.FileSystemRights 返回这些值的组合。 但是,您很快就会遇到一些权限,其中的值 此属性与 FileSystemRights 中的任何值都不匹配 枚举(我希望他们不会用相同的名称命名某些属性 作为一个类型,但是嘿)。
这样做的最终结果是,对于某些文件/目录,您只需 无法确定分配给他们的权限。如果你这样做 AccessRule.FileSystemRights.ToString 然后对于这些值你看到 是一个数字而不是描述(例如 Modify、Delete、FullControl ETC)。您可能会看到的常见数字是:
-1610612736、–536805376 和 268435456
要弄清楚这些权限实际上是什么,您需要查看 当您将该数字视为 32 个单独的位时设置了哪些位 而不是整数(因为整数是 32 位长),然后比较 他们到这个图: msdn.microsoft.com/en-us/library/aa374896(v=vs.85).aspx
例如,-1610612736 设置了第一位和第三位, 这意味着它是 GENERIC_READ 结合 GENERIC_EXECUTE。所以现在 您可以将这些通用权限转换为特定文件 它们对应的系统权限。
您可以在此处查看每个通用权限映射到哪些权限: msdn.microsoft.com/en-us/library/aa364399.aspx。请注意 即 STANDARD_RIGHTS_READ、STANDARD_RIGHTS_EXECUTE 和 STANDARD_RIGHTS_WRITE 都是一回事(不知道为什么,似乎 对我来说很奇怪)实际上都等于 FileSystemRights.ReadPermissions 值。
所以我认为,因为GetAccessRules 无法为 ex 分组:
NT SERVICE\TrustedInstaller FullControl
和
NT SERVICE\TrustedInstaller 268435456
他创建了 2 个不同的条目。
我必须更正 FileSystemRights 以使其适合枚举。
268435456 - 完全控制
-536805376 - 修改、同步
-1610612736 - 读取并执行,同步
这个问题自 2014 年以来就存在。今天仍然存在。
【问题讨论】:
-
我认为有些是继承的,有些是显式的。
-
实际上,对于
C:/Program Files(在他的属性中),所有条目都是显式的(没有继承)。我这里有 8 个条目,我的代码有 11 个条目。 -
我更改了
fs.GetAccessRules(true, false, typeof(System.Security.Principal.NTAccount)),这只会返回显式条目,同样的事情:11 个条目。
标签: c# directoryservices