使用powershell查找世界可写文件



我可以在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

(你可以把它写成一行,但为了可读性。(

最新更新