使用Powershell查找世界可写文件

时间:2018-12-14 12:34:05

标签: powershell

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

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

那很好,但是在我的Win7机器上,out-string -stream似乎截断了select-string的输出。

是否可以在Win7上找到文件?

2 个答案:

答案 0 :(得分:2)

如何?

Get-ChildItem -Recurse |
    Get-Acl | 
        Where-Object { $_.AccessToString -match 'everyone' } | 
            Select-Object Path, Owner, @{Name='Access'; Expression={$_.AccessToString}} | 
                Format-List

(您可以将它写成单行,但是为了便于阅读。)

答案 1 :(得分:2)

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

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

您可以展开检查,以实际检测到允许对“每个人”进行写访问的ACE(上面的代码将为“每个人”检测到 any 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授予写访问权限,“每个人”实际上也可能没有写访问权限。

  • 没有拒绝ACE的ALLOW ACE⇒允许访问(显然)
  • 没有允许ACE的拒绝ACE⇒拒绝访问(显然)
  • 继承了ALLOW ACE并继承了DENY ACE⇒访问被拒绝
  • 显式允许ACE并继承了DENY ACE⇒允许访问
  • 继承了ALLOW ACE和明确的DENY ACE⇒拒绝访问
  • 显式的ALLOW ACE和明确的DENY ACE⇒访问被拒绝