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:
但是,当我在具有“特殊”权限的文件夹(例如C:/Program Files
)上执行此操作时,我得到了与权限的奇怪数字相关联的重复IdentityReference.Value
:
Listview不好:
当我打开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年起存在。至今仍然存在...> _<
答案 0 :(得分:0)
你没有做坏事。 access mask 实际上在内部(以及在文件系统上)表示为 int
,但枚举 FileSystemRights
不完整。
因此,可视化工具和那些将 FileSystemRights
值转换为字符串的函数将不知所措,只会为您提供数值(但作为 string
)。
这意味着为了理解它们,您必须检查 WinNT.h
(来自 Windows SDK)并查找所有可能的访问掩码值 - 包括通用值 - 并提供手动转换方式将数字表示成更易读的字符串。
您遇到的是两个不同的 ACE,它们的访问掩码不同(但在语义上是等效的)。这完全没问题,并且发生在野外(正如您的屏幕截图所证明的那样!)。然而,.NET 框架选择忽略这个问题。
如果您使用 Powershell 的 Get-Acl
或 icacls
(自 Windows 2000 开始使用的工具)查看 ACL,您会发现各个 ACE 的潜在差异沿文件系统层次结构继承或传播。
另一种替代方法是调用 MapGenericMask()
并让它执行映射。因此,当您给它 GENERIC_ALL
(== 0x10000000) 时,它会返回 0x001f01ff,它对应于 FileSystemRights.FullControl
。通过这种方式,您可以将通用访问掩码“弯曲”为 .NET 框架可以理解的形式。