1

そのため、特に、Exchange 配布グループに属しているかどうかを確認し、必要に応じて追加する powershell スクリプトを作成しています。

厄介な問題の 1 つは、スクリプトが「信頼できない」ソースからデータを取得していることです。つまり、チェックするユーザー名さえ持っているとは保証できません。

そのため、空の文字列の場合にチェックする必要があります。ユーザー名$tempUserNameを単なる文字列の変数に格納し、配布リストの名前を に格納してい$DefaultMobileDLます。他の理由については触れませんが、ステートメントは実行できませんif {} else {}。if ステートメントしか実行できません。それは非常に愚かです、私は知っています。

OK、ここに私が持っているものがあります:

if (-not [string]::IsNullOrEmpty($tempUsername)) { 
    $MembersOfDLDefault = Get-DistributionGroupMember "$DefaultMobileDL" -ResultSize Unlimited |
        Select -Expand sAMAccountName | 
        Select-String -pattern "$tempUsername" -SimpleMatch -Quiet 
}
if ([string]::IsNullOrEmpty($tempUsername)) { $MembersOfDLDefault = $false }

# bug testing...
Write-Host "username: `"$tempUsername`" , MembersOfDLDefault: `"$MembersOfDLDefault`""

if ($MembersOfDLDefault -eq $false) {
  # User is not a member of $DefaultMobileDL, try adding them
  # ... more code here ...
}
if ($MembersOfDLDefault -eq $true) {
  # User is already a member of the $DefaultMobileDL
  # ... again, more code ...
}

そのコード ブロックは foreach ループ内にあり、反復ごとに渡される変数値に問題があったため、コードの最後でいくつかの変数をクリアしましたが、この例で重要な 1 行は次のとおりです。

Clear-Variable MembersOfDLDefault

ドキュメントを正しく読んでSelect-String -Quietいれば、アイテムが見つかった場合は True を返し、見つからなかった場合は False を返す必要があります。

しかし、それは私が得ている結果ではありません。コードを実行すると、次のようになります (この実行では、たまたまテストしている 3 つのユーザー名があり、そのうちの 1 つ (3 つ目) は空の文字列です)。

username: "smithj" , MembersOfDLDefault: ""
username: "doej" , MembersOfDLDefault: "True"
username: "" , MembersOfDLDefault: "False"

ご覧のとおり、コードを初めて実行したときは$MembersOfDLDefault何も設定されていません。

何かばかげたことを見逃していることはわかっていますが、このコードを長い間見つめていたので、新しい目で見る必要があります。私が行方不明または見落としている明らかなものはありますか?

前もって感謝します。

技術的には、Powershell から直接ではなく、Exchange 管理シェルからこれを実行していますが、それは問題ではないと思います

4

1 に答える 1

3

ドキュメントに書かれて-quietいることと実際に行っていることは違うようです。一致しない場合にSelect-String -quite戻る動作のようです。$nullこれを確認するには、次を試してください。

# ~> "xxxHELLOaaa" | Select-String "HELLO" -SimpleMatch -Quiet
True

# ~> "xxxHELLOaaa" | Select-String "HaLLO" -SimpleMatch -Quiet

実装が正しくないか、ドキュメントが間違っています (どちらの方法でも確認できません)。簡単な回避策は、結果をブール値にキャストすることです。

if (-not [string]::IsNullOrEmpty($tempUsername)) { 
    $MembersOfDLDefault = [bool] (Get-DistributionGroupMember "$DefaultMobileDL" -ResultSize Unlimited |
        Select -Expand sAMAccountName | 
        Select-String -pattern "$tempUsername" -SimpleMatch -Quiet )
}
于 2014-05-23T17:19:02.317 に答える