PowerShell get-acl 列出文件夹内容与 ReadAndExecute

PowerShell get-acl List folder contents vs ReadAndExecute

这是一个简单的问题,但我无法在 Google 或此处找到答案:

通过使用 PowerShell 或 cmd(没有第三方的东西),我如何以允许我区分 "List Folder Contents" 和 "ReadAndExecute" 的方式检索文件夹权限?

现在,当我在一个文件夹上执行 Get-Acl 时,它 return 的权限级别与组仅授予列表访问权限或读取和执行权限级别相同。如果我右键单击并转到“安全”选项卡,一个组已选中 "List folder contents",另一个已选中 "Read & Execute",但两个 return "ReadAndExecute" 都带有 Get-Acl。

以下图片:

Powershell 只需 returns "ReadAndExecute" 两个:

文件系统权限:读取和执行、同步

访问控制类型:允许

IdentityReference : group1

IsInherited : 假

继承标志:容器继承、对象继承

传播标志:None


文件系统权限:读取和执行、同步

访问控制类型:允许

IdentityReference : group2

IsInherited : 假

继承标志:容器继承

传播标志:None

(get-Acl 'C:\Temp').Access

returns 个 System.Security.AccessControl.FileSystemAccessRule 个对象的集合。

它有一个 FileSystemRights 属性 类型 System.Security.AccessControl.FileSystemRights。这是一个枚举,可以检查个人权限。例如(检查下面的第一个访问规则):

((Get-Acl 'C:\Temp').Access[0].FileSystemRights -band
[System.Security.AccessControl.FileSystemRights]::ExecuteFile) -eq   
[System.Security.AccessControl.FileSystemRights]::ExecuteFile

ListDirectory、ExecuteFile、Read 是您可以检查以了解权限差异的内容。

更多信息: https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemrights(v=vs.110).aspx

一段时间后,我自己找到了可行的解决方案。

即使 PowerShell(或 CMD 或 C#)总是 returns "ReadAndExecute" 对于 ListDirectory 或实际的 ReadAndExecute 权限,"InheritanceFlag" 将始终是 "ContainerInherit" 只有当权限为 "ListDirectory"。因此,检查此标志,您可能会发现哪个组仅授予列表权限而不授予读取和执行权限。

我已经在 PowerShell 中实施了这项检查,到目前为止它适用于所有测试用例:

foreach($access in (Get-Acl 'C:\test').Access) {
    $filerights = $access.FileSystemRights.ToString();
    $inheritanceFlg = $access.InheritanceFlags.ToString();
    if($inheritanceFlg -eq 'ContainerInherit') {
        $filerights = $filerights.replace('ReadAndExecute','ListDirectory');
    }
    $output = $access.IdentityReference.ToString() + ';' + $filerights;
    $output
}

你的回答很好,只是有一点点错误。您在第 3 行的 $inheritanceFlags 变量中得到了错误的参数。以下是正确的:

foreach($access in (Get-Acl 'C:\Test').Access) {
    $filerights = $access.FileSystemRights.ToString();
    $inheritanceFlg = $access.InheritanceFlags.ToString();
    if($inheritanceFlg -eq 'ContainerInherit') {
        $filerights = $filerights.replace('ReadAndExecute','ListDirectory');
    }
    $output = $access.IdentityReference.ToString() + ';' + $filerights;
    $output
}