我可以在Win10机器上使用此命令来发现每个人都可以写的文件(在当前目录层次结构中(:
get-childitem -recurse | get-acl | out-string -stream | select-string -pattern "everyone"
这很好,但在我的Win7机器上,out-string -stream
似乎截断了select-string
失败时的输出。
有办法在Win7上找到这些文件吗?
检查适当的属性,而不是将Get-Acl
输出转换为字符串。这适用于所有Windows版本:
Get-ChildItem -Recurse -Force | Where-Object {
$acl = Get-Acl $_.FullName
$acl.Access | Where-Object { $_.IdentityReference -eq 'Everyone' }
}
您可以扩展检查以实际检测允许对"Everyone"进行写访问的ACE(以上将检测任何ACE用于"Everyon"(:
Get-ChildItem -Recurse -Force | Where-Object {
$acl = Get-Acl $_.FullName
$acl.Access | Where-Object {
$_.IdentityReference -eq 'Everyone' -and
$_.AccessControlType -eq 'Allow' -and
$_.FileSystemRights -band 278
}
}
但是,请注意,DENY ACL优先于ALLOW ACL,显式ACL优先于继承的ACL,因此即使有授予写访问权限的ACE,"每个人"实际上也可能有写访问权限,也可能没有。
- ALLOW ACE without DENY ACE⇒允许访问(显然(
- 不带ALLOW ACE的DENY ACE;访问被拒绝(显然(
- 继承ALLOW ACE和继承DENY ACE;访问被拒绝
- 显式ALLOW ACE和继承的DENY ACE;允许访问
- 继承ALLOW ACE和显式DENY ACE;访问被拒绝
- 显式ALLOW ACE和显式DENY ACE;访问被拒绝
这个怎么样:
Get-ChildItem -Recurse |
Get-Acl |
Where-Object { $_.AccessToString -match 'everyone' } |
Select-Object Path, Owner, @{Name='Access'; Expression={$_.AccessToString}} |
Format-List
(你可以把它写成一行,但为了可读性。(