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 是您可以检查以了解权限差异的内容。
一段时间后,我自己找到了可行的解决方案。
即使 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
}
这是一个简单的问题,但我无法在 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 是您可以检查以了解权限差异的内容。
一段时间后,我自己找到了可行的解决方案。
即使 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
}