2017-07-11 3 views
2

私は、サイクリックグループをチェックするスクリプトを持っています。
スクリプトはドメイン内のすべてのグループ(親グループ)を受け取り、それらのグループのメンバシップをチェックし、objectClassが 'group'のメンバを配列(子グループ)に追加します。Powershell tr​​y/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')をファイルに書き込むのではなく、スクリプトは停止しましたか?グループは確かに存在します。

「オブジェクトが見つかりません」というエラーをキャッチしてそれらをファイルに送信する別のブロックを追加する必要がありますか?

ありがとうございました!

+2

'catch [Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember]' nope。 *捕捉された*オブジェクトはスローされる例外になります。 'GetADGroupMember'は例外ではありません。代わりに 'System.Exception'をキャッチすることで一般化することができます。 catchに型を指定すると、例外がその型でない場合、catchは実行されません。呼び出すコードによって決して投げられないものを指定したので、catchブロックは実行されませんでした。また、タイプを指定するのをスキップして、毎回問題を実行することもできます。 – Will

+0

@ Will-ありがとう、それは助け!私は型を '[Microsoft.ActiveDirectory.Management.ADIdentityNotFound]'に変更しました。 また、[Microsoft.ActiveDirectory.Management.ADException]を使用して一般的なエラーをキャッチする別のブロックを追加しました。何らかの理由で、子配列の最後の要素でコマンドが正常に完了したというエラーが発生しました。 –

答えて

3

Will's comment implies実際にスローされると予想される例外と一致しない型リテラルを指定することで、catch節をホークしました。 [catch-type-list]は、関連する文ブロックは、例外ハンドラとして機能する例外タイプのオプションのリストがある

catch [catch-type-list] <statement block> 

を次のように

catch句の一般的な構文は次のとおりです。 - これは、もちろんではありません例外の型、およびその関連するステートメントのブロックは決して

catch [Microsoft.ActiveDirectory.Management.Commands.GetADGroupMem‌​ber] { 
    # ... 
} 

しかタイプ[Microsoft.ActiveDirectory.Management.Commands.GetADGroupMem‌​ber]の例外によるエラーを処理する:このcatch句があること、を意味

実行する。

try{ 
    Get-ADGroupMember -Identity $parent 
} 
catch [Microsoft.ActiveDirectory.Management.ADServerDownException]{ 
    # DC is unreachable, abort 
} 
catch [Microsoft.ActiveDirectory.Management.ADIdentityResolutionException]{ 
    # Group identity not resolved, add to list and continue 
} 
catch { 
    # Something else, completely unforeseen, happened, you might want to re-throw and return from your function 
} 

最後catch句、タイプリストは一般的なキャッチとして知られ、省略された:このコンテキストで意味を作るためにあなたのcatch句は、関連する例外の型を指定するためには

文節を返し、でない例外が上記のcatch句のいずれかと一致すると処理します。

+0

マティアスに感謝します。私はWillの提案に基づいてtry/catchの作業を行うことができました。私はあなたが読んだ記事のいくつかよりも私に怒りの答えを返すと言うでしょう。再度、感謝します! –

+0

@ Joe-L_177ハッピーな感じがしました^ _ ^ –

関連する問題