这是一个简单的问题但我在谷歌或此处找不到答案:
通过使用PowerShell或cmd(没有第三方内容),如何以允许我在“列出文件夹内容”和“ReadAndExecute”之间区别的方式检索文件夹权限?
现在,当我在文件夹上执行Get-Acl时,当组仅授予列表访问权限或读取并执行时,它将返回相同的权限级别。如果我右键单击并转到“安全”选项卡,则一个组选中“列表文件夹内容”,另一个组选中“读取和执行”,但两者都返回“ReadAndExecute”和Get-Acl。
以下图片:
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:无
答案 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是您可以检查以捕获权限差异的内容。
答案 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
}