多个服务器上的 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
的连续调用要简洁得多
我正在尝试创建一个脚本来检查一些服务器上 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