首页 > 解决方案 > 使用 powershell 查找全局可写文件

问题描述

我可以在我的 Win10 机器上使用这个命令来发现每个人都可以写的文件(在当前目录层次结构中):

get-childitem -recurse | get-acl | out-string -stream | select-string -pattern "everyone"

这工作正常,但在我的 Win7 机器上out-string -stream似乎截断了select-string失败的输出。

有没有办法在win7上找到文件?

标签: powershell

解决方案


检查适当的属性,而不是将Get-Acl输出转换为字符串。这适用于所有 Windows 版本:

Get-ChildItem -Recurse -Force | Where-Object {
    $acl = Get-Acl $_.FullName
    $acl.Access | Where-Object { $_.IdentityReference -eq 'Everyone' }
}

您可以扩展检查以实际检测允许对“Everyone”进行写访问的 ACE(上面将检测到“Everyone”的任何ACE):

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 ⇒ 拒绝访问

推荐阅读