C# - 查找目录权限(奇怪的权限条目)

时间:2016-07-02 10:20:10

标签: c# directoryservices

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)上执行此操作时,一切似乎都很好:

的ListView:

enter image description here

但是,当我在具有“特殊”权限的文件夹(例如C:/Program Files)上执行此操作时,我得到了与权限的奇怪数字相关联的重复IdentityReference.Value

Listview不好:

enter image description here

当我打开C:/Program Files属性中的权限标签时,我没有那么多带有奇怪数字的权限条目。

也许我做得不好?感谢。

编辑:从该页面Here

  

使用.NET,您可能会认为确定哪些权限   分配给目录/文件应该很容易,因为有一个   FileSystemRights枚举定义似乎包含所有可能的   文件/目录可以拥有和调用的权限   AccessRule.FileSystemRights返回这些值的组合。   但是,您很快就会遇到一些权限   此属性与FileSystemRights中的任何值都不匹配   枚举(我希望他们不会将一些具有相同名称的属性命名为   作为一个类型,但嘿)。

     

这样做的最终结果是对于某些文件/目录而言   无法确定为其分配了哪些权限。如果你这样做   然后,您可以看到AccessRule.FileSystemRights.ToString这些值   是一个数字而不是一个描述(例如Modify,Delete,FullControl   等等)。您可能会看到的常见数字是:

     

-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 - FullControl

     

-536805376 - 修改,同步

     

-1610612736 - ReadAndExecute,Synchronize

此问题自2014年起存在。至今仍然存在...> _<

1 个答案:

答案 0 :(得分:0)

你没有做坏事。 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 框架可以理解的形式。