多个服务器上的 SMB 共享权限

SMBShare Persmission on multiple Servers

我正在尝试创建一个脚本来检查一些服务器上 SmbShares 的权限。 目标是检查是否有任何共享具有“所有人”权限。但是我试图找到一个比这个混乱更优雅的解决方案:

$ADComputer = Get-ADComputer -Filter 'Name -like "Test-Server-*' | Where-Object { $excludeList -notcontains $_.name }

foreach ($server in $ADComputer) {
    $shares = Invoke-Command -ComputerName $server -ScriptBlock { Get-SmbShare }

    foreach ($share in $shares) {
        $permissions = Invoke-Command -ComputerName $server -ScriptBlock { Get-SmbShareAccess -Name $share.name }
        
        foreach ($permission in $permissions) {
            if ( $permission ) ...
        }
    }
}

我无法解决这个问题。如何在不使用这么多嵌套 for 循环的情况下解决这个问题?

有什么想法或提示吗?

这里要遵循的一个很好的模式是:

  • 单机本地执行全部解决
  • 使用Invoke-Command跨多个远程主机重复

那我们就先写一个function/script本地解决问题吧:

function Find-SmbShareEveryoneGrant {
  # We can pipe the output from one cmdlet to the next, and solve the problem in a single pipeline
  Get-SmbShare |Get-SmbShareAccess |Where-Object { $_.AccessControlType -eq 'Allow' -and $_.AccountName -eq 'Everyone'}
}

现在您有了一个可以在任何地方重复的函数,它就像针对所有服务器调用 Invoke-Command 一样简单 - -ComputerName 参数接受一个数组,因此显式循环 $ADComputers 没有必要:

Invoke-Command -ComputerName $ADComputer -ScriptBlock ${function:Find-SmbShareEveryoneGrant} |Select PSComputerName,Name,ScopeName,AccessRight

总共 4-5 行代码,比所有那些嵌套循环和对 Invoke-Command

的连续调用要简洁得多