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

时间:2015-12-22 11:06:28

标签: powershell permissions ntfs

这是一个简单的问题但我在谷歌或此处找不到答案:

通过使用PowerShell或cmd(没有第三方内容),如何以允许我在“列出文件夹内容”和“ReadAndExecute”之间区别的方式检索文件夹权限?

现在,当我在文件夹上执行Get-Acl时,当组仅授予列表访问权限或读取并执行时,它将返回相同的权限级别。如果我右键单击并转到“安全”选项卡,则一个组选中“列表文件夹内容”,另一个组选中“读取和执行”,但两者都返回“ReadAndExecute”和Get-Acl。

以下图片:

group 1

group 2

Powershell只为两者返回“ReadAndExecute”:

FileSystemRights:ReadAndExecute,Synchronize

AccessControlType:允许

IdentityReference:group1

IsInherited:False

InheritanceFlags:ContainerInherit,ObjectInherit

PropagationFlags:无

FileSystemRights:ReadAndExecute,Synchronize

AccessControlType:允许

IdentityReference:group2

IsInherited:False

InheritanceFlags:ContainerInherit

PropagationFlags:无

3 个答案:

答案 0 :(得分:1)

你的答案很棒,但只是犯了一点错误。您在第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
}

答案 1 :(得分:0)

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

返回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

答案 2 :(得分:0)

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

即使PowerShell(或CMD或C#)总是为ListDirectory或实际的ReadAndExecute权限返回“ReadAndExecute”,但只有当权限为“ListDirectory”时,“InheritanceFlag”才会始终为“ContainerInherit”。因此,检查此标志,您可以找出哪个组仅授予列表权限而不是读取和执行。

我已经在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
}