【问题标题】:Find directory rights (weird rights entries)查找目录权限(奇怪的权限条目)
【发布时间】: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


【解决方案1】:

你没有做坏事。 access mask 实际上在内部(和文件系统上)表示为 int,但枚举 FileSystemRights 不完整。

因此,将FileSystemRights 值转换为字符串的可视化工具和那些函数将不知所措,只会给您数值(但作为string)。

这意味着为了理解它们,您必须检查 WinNT.h(来自 Windows SDK)并查找所有可能的访问掩码值 - 包括通用值 - 并提供一种手动转换数字的方法表示为更易读的字符串。

您遇到的是两个不同的 ACE,它们似乎具有不同(但语义上等效)的访问掩码。这很好,并且发生在野外(正如您的屏幕截图所证明的那样!)。然而,.NET 框架选择忽略这个问题。

如果您使用 Powershell 的 Get-Aclicacls(自 Windows 2000 以来一直在使用的工具)查看 ACL,您会发现单个 ACE 在继承或向下传播方面存在潜在差异文件系统层次结构。

另一种选择是调用MapGenericMask() 并让它执行映射。所以当你给它GENERIC_ALL(== 0x10000000)时,它会返回0x001f01ff,它对应于FileSystemRights.FullControl。通过这种方式,您可以将通用访问掩码“弯曲”成 .NET 框架可以理解的形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多