web-dev-qa-db-ja.com

Get-ADGroup使用時のエラーの非表示

新しいグループが存在しない場合にそれを作成するスクリプトに取り組んでいます。 Get-ADGroupを使用して、次のコマンドを使用してグループが存在しないことを確認しています。

$group = get-adgroup $groupName -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue 

しかし、そうすると、次のエラーが発生します(エラーからドメイン固有のデータを削除しました)。

Get-ADGroup : Cannot find an object with identity: '*group name*' under: '*domain*'.
At U:\Scripts\Windows\Create-FolderAccessGroup.ps1:23 char:24
+ $group = get-adgroup <<<< $groupName -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
    + CategoryInfo          : ObjectNotFound: (y:ADGroup) [Get-ADGroup], ADIdentityNot
   FoundException
    + FullyQualifiedErrorId : Cannot find an object with identity: '' under: ''.,Microsoft.ActiveDirectory.Management.Commands.GetADGroup

ErrorActionとWarningActionをSilentlyContinueに設定すると、このエラーが表示されなくなると思いましたが、表示されませんでした。

13
 try {get-adgroup <groupname>}
  catch  {
      <make new group>
     }
18
mjolinor

これが最も効果的であることがわかりました。

$Group = Get-ADGroup -Filter {SamAccountName -eq $GroupName}

フィルタが結果を返さない場合、$ Groupは単に$ nullに設定され、エラーメッセージは生成されません。また、SAMアカウント名はActive Directoryで一意である必要があるため、$ Groupが複数のオブジェクトの配列に設定されるリスクはありません。

Ifステートメントでグループ(またはユーザー)の存在を確認する場合、-Identityではなく-Filterを使用してグループを取得すると非常にうまく機能することがわかりました。例えば:

If (Get-ADGroup -Filter {SamAccountName -eq $GroupName})
{
    Add-ADGroupMember -Identity $GroupName -Members $ListOfUserSamAccountNames
}
Else
{
    Write-Warning "Users could not be added to $GroupName because $GroupName
    does not exist in Active Directory."
}

これは、Get-ADGroupコマンドレットと-Identityパラメーターを使用してmjolinorがtry/catchを提案するよりも、論理的に処理する方がはるかに簡単であることがわかります(グループが存在する場合はユーザーを追加し、存在しない場合はメッセージを表示します)。 -Identityパラメーターを使用して、上記と同じことを行うtry/catchメソッドを検討してください。

Try
{
    Get-ADGroup -Identity $GroupName
    Add-ADGroupMember -Identity $GroupName -Members $ListOfUserSamAccountNames
}
Catch
{
    Write-Warning "Users could not be added to $GroupName because $GroupName
    does not exist in Active Directory."
}

Tryブロック内のコマンドのanyが終了エラーをスローするかどうかを確認します。存在する場合は、グループが存在しないことを意味し、catchブロック内のコマンドに移動して処理します。それは機能しますが、if/elseと比較して、論理的には、ここでのtry/catchも同様に流れるとは思いません。

誤解しないでください。mjolinorはPowerShellの天才です。この場合、彼の解決策が最善であるとは思わないというだけです。

19
Scott

@mjolinorは良い答えを与えますが、いくつかの説明も役立つと思います。

Windows PowerShellには、エラーを報告するための2つのメカニズムがあります。1つはエラーの終了のメカニズムで、もう1つは非終了エラーのメカニズムです。

内部CmdLetsコードは、コマンドレットが入力オブジェクトの処理を続行できない、または許可しないエラーが発生したときに、ThrowTerminatingErrorメソッドを呼び出すことができます。スクリプト作成者は、例外を使用してこれらのエラーをキャッチできます。

内部CmdLetsコードは、コマンドレットが入力オブジェクトの処理を続行できる場合に、WriteErrorメソッドを呼び出して非終了エラーを報告できます。スクリプト作成者は、-ErrorActionオプションを使用してメッセージを非表示にできます。

6
JPBlanc

私はこれが古いことに気づきましたが、私もこの問題を抱えていて、次のように解決しました:

If(Get-ADObject -Filter {objectClass -eq "Group -and samAccountName -eq" groupname "}){//実行する//}

0
atguilmette