私は、サイクリックグループをチェックするスクリプトを持っています。
スクリプトはドメイン内のすべてのグループ(親グループ)を受け取り、それらのグループのメンバシップをチェックし、objectClassが 'group'のメンバを配列(子グループ)に追加します。Powershell try/catch/finallyが正しく実行されていません(または私は完全にホーズしました)
スクリプトは、親が子のメンバーであるかどうかを確認するために子グループをチェックします(これは許可されていますが、それでも良い考えではありません)。
try/catch/finallyブロックを追加したので、PowerShellが返す切り詰められたエラーメッセージの代わりに実際のグループ名を取得できました。
問題は、続行する代わりに最初に見つかったエラーでスクリプトが停止することです。
これは私がやった最初の試み/キャッチですので、私に同行してください。
ここではスクリプトです:
$original_ErrorActionPreference = 'Continue'
$ErrorActionPreference = 'Stop'
Import-Module -Name ActiveDirectory
$domains = @('corp.com', 'dom1.corp.com', 'dom2.corp.com')
foreach($domain in $domains){
Write-Host $domain -ForegroundColor Yellow
$parents = Get-ADGroup -server $domain -Properties name,objectclass -Filter * #get all domain groups
write-host $parents.count
$table = @()
$pGroupCount = @($parents).Count
$record = @{
'Parent' = ''
'Child' = ''
'Nester' = ''
}
foreach($parent in $parents){
Write-Host $parent.name -ForegroundColor Green
スクリプトはこの時点までに動作しますが。
これは、とすぐにスクリプトが問題を持っている最初のグループに当たるとして、これは返されるエラーです
try { #get members in the parent that are groups
$children = Get-ADGroupMember -Identity $parent | Where-Object{$_.ObjectClass -eq 'group'} | Select-Object name,distinguishedName,objectClass
} catch [Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember]{
Write-Host $parent.name ' must be checked manually' -ForegroundColor blue -BackgroundColor Yellow
$parent.distinguishedName | Out-String -Width 4096 | Out-File -FilePath "$env:USERPROFILE\desktop\$domain-manualCheck.txt" -Width 5120 -Append
} finally {
$pGroupCount = $pGroupCount - 1
write-host $children.count ' - ' $children.name -ForegroundColor Gray
Write-Host $pGroupCount ' groups to go' -foregroundColor yellow
foreach($child in $children){ #get members in the children that are groups AND that have the same name as the parent
$nested = Get-ADGroupMember $child.name | Where-Object {$_.objectClass -eq 'group' -and $_.name -eq $parent.name}
$nestedCount = @($nested).count
if ($nestedCount -gt 0){
foreach($nester in $nested){
Write-Host $parent.name -ForegroundColor White
Write-Host $nestedCount -ForegroundColor Magenta
Write-Host $nester.name -ForegroundColor Cyan
$record.'Parent' = $parent.name
$record.'Child' = $child.name
$record.'Nester' = $nester.name
$objRecord = New-Object psobject -Property $record
$table += $objRecord
}
}
}
$table | Export-Csv -Path "$env:USERPROFILE\desktop\$domain-Group-Report.csv" -NoTypeInformation
$error | out-string -width 4096 | Out-File -FilePath "$env:USERPROFILE\desktop\$domain-Errors.txt" -Width 5120 -Append
}
}
}
$ErrorActionPreference = $original_ErrorActionPreference
をfails-部分(#commentsが追加される)である。
PS C:\Users\admin_j\Desktop> .\gtest.ps1
corp.com #current domain
283 #total group count
Exchange Servers #current group
6 - Exchange Install Domain Servers Exchange Install Domain Servers Exchange Install Domain Servers Exchange Install Domain Servers Exchange Install Domain Servers #6 groups within the parent, groups are from sub-domains
Exchange Install Domain Servers
282 groups to go
Get-ADGroupMember : Cannot find an object with identity: 'Exchange Install Domain Servers' under: 'DC=corp,DC=com'.
At C:\Users\admin_j\Desktop\gtest.ps1:46 char:15
+ $nested = Get-ADGroupMember $child.name | Where-Object $_.objectClass -eq ' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Exchange Install Domain Servers:ADGroup) [Get-ADGroupMember], ADIdentityNotFoundException
+ FullyQualifiedErrorId : Cannot find an object with identity: 'Exchange Install Domain Servers' under: 'DC=corp,DC=com'.,Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember
なぜ、不正なグループ(この場合は 'Exchange Install Domain Servers': 'DC = corp、DC = com')をファイルに書き込むのではなく、スクリプトは停止しましたか?グループは確かに存在します。
「オブジェクトが見つかりません」というエラーをキャッチしてそれらをファイルに送信する別のブロックを追加する必要がありますか?
ありがとうございました!
'catch [Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember]' nope。 *捕捉された*オブジェクトはスローされる例外になります。 'GetADGroupMember'は例外ではありません。代わりに 'System.Exception'をキャッチすることで一般化することができます。 catchに型を指定すると、例外がその型でない場合、catchは実行されません。呼び出すコードによって決して投げられないものを指定したので、catchブロックは実行されませんでした。また、タイプを指定するのをスキップして、毎回問題を実行することもできます。 – Will
@ Will-ありがとう、それは助け!私は型を '[Microsoft.ActiveDirectory.Management.ADIdentityNotFound]'に変更しました。 また、[Microsoft.ActiveDirectory.Management.ADException]を使用して一般的なエラーをキャッチする別のブロックを追加しました。何らかの理由で、子配列の最後の要素でコマンドが正常に完了したというエラーが発生しました。 –