我正在嘗試創建一個腳本來檢查幾個服務器上的 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 回圈的情況下解決這個問題?
任何想法或提示?
uj5u.com熱心網友回復:
在這里遵循的一個好模式是:
- 解決單機本地執行的全部問題
- 用于
Invoke-Command跨多個遠程主機重復
因此,讓我們首先撰寫一個函式/腳本來解決本地問題:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313709.html
