Powershell 配列に項目を追加できません

okwaves2024-01-25  7

私は Powershell をあまり使用したことがありませんが、オンラインで答えを見つけることができませんでした。

Exchange 2010 で無効になっているユーザーごとのメール数を取得しようとしていますが、組織では AD の Title 属性を使用してタイプごとにユーザーをグループ化しているため、AD からユーザーのタイトルも取得する必要があります。

次のように記述しましたが、必要なデータを取得できません。単に長さと数値を CSV ファイルに返すだけです。 「長さ」 「10」 「3」 「34」

$Disabled+= の割り当てから $title を省略した場合、ユーザーの名前と項目数が CSV ファイルに追加されますが、タイトルも本当に必要です。誰か私のどこが間違っているのか指摘してもらえませんか。

Import-Module ActiveDirectory

$i=0

$disUsers = Get-ADUser -Filter * -SearchBase "ou=User Disabled Accounts,dc=test,dc=com" -Properties SamAccountName,Title

$Disabled = @()

$disUsers | Foreach-Object{      
    $sam = $_.SamAccountName
    $title = $_.Title
    $mailDetail=Get-MailboxStatistics $sam | Select -Property DisplayName,ItemCount
    $Disabled += $title, $mailDetail
    $i++;   
 }


$Disabled | Export-Csv -Path $env:userprofile\desktop\DisabledADUserTitlewithMailbox.csv -NoTypeInformation

Steve が提供したコードを使用すると、残念ながら次のエラーが発生します。

Exception calling "Add" with "2" argument(s): "Item has already been added. Key in dictionary: 'ADCDisabledMail'  Key being added: 'ADCDisabledMail'" ...     

Exception calling "Add" with "2" argument(s): "Key cannot be null. Parameter name: key"...

編集 Steven の助けにより、次のようにしてこれを機能させることができました。

'Import-Module ActiveDirectory' 

$i=0

$disUsers=Get-ADUser -Filter {mailNickName -like '*'} -SearchBase "ou=User Disabled Accounts,dc=test,dc=com" -Properties SamAccountName,Title 

$dis2 = $disUsers.count

$DisabledUser = @()

$disUsers | Foreach-Object{

Write-Host "Processing record $i of $dis2"

                $sam = $_.SamAccountName

                $title = $_.Title

$mailDetail=Get-MailboxStatistics $sam | Select-Object DisplayName, @{ Name = 'Title'; Expression = {$title}}, ItemCount  

                                $DisabledUser+= $mailDetail
  $i++;   

}

$DisabledUser | Export-Csv -Path $env:userprofile\desktop\DisabledADUserTitlewithMailbox.csv -NoTypeInformation

文字列のみを Export-Csv に送信するため、CSV には長さのみが含まれます。 Export-Csv はパイプライン内の最初のオブジェクトを調べ、そのプロパティを CSV ファイルのヘッダーとして取得します。次に、各プロパティの値を取得し、オブジェクトごとに出力します (1 行に 1 つのオブジェクト)。文字列には Length プロパティのみがあります。したがって、表示されている結果は予期されたものです。

– Things の管理者

2020 年 9 月 4 日 21:48

@AdminOfThings の説明に感謝します。

– NewExAdmin

2020 年 9 月 5 日 16:34



------------------------

実際にやろうとしているのは、データを関連付けて小さなレポートを作成することのようですね。さまざまなコマンドからのデータを処理しているため、結合するプロパティが必要です。この場合、LegacyExchangeDN AD 属性と返された LegacyDN プロパティを確認します。Get-MailboxStatistics による。コードは次のようになります。

$DisabledUsers = @{}

Get-ADUser -SearchBase 'ou=User Disabled Accounts,dc=test,dc=com' -Filter * -Properties 'Title','legacyExchangeDN' |
ForEach-Object{ $DisabledUsers.Add( $_.legacyExchangeDN, $_ ) }

$DisabledUsers.Values.SamAccountName | 
Get-MailboxStatistics |
Select-Object DisplayName, ItemCount, @{ Name = 'Title'; Expression = { $DisabledUsers[$_.LegacyDN].Title } }

これにより、次のような出力が表示されます。

DisplayName   ItemCount Title
-----------   --------- -----
Mr. Smith        113576 Executives

CSV ファイルに直接移動したい場合は、以下のように、Select-Object コマンドの後に Export-CSV コマンドを追加するだけです。

$DisabledUsers = @{}

Get-ADUser -SearchBase 'ou=User Disabled Accounts,dc=test,dc=com' -Filter * -Properties 'Title','legacyExchangeDN' |
ForEach-Object{ $DisabledUsers.Add( $_.legacyExchangeDN, $_ ) }

$DisabledUsers.Values.SamAccountName | 
Get-MailboxStatistics |
Select-Object DisplayName, ItemCount, @{ Name = 'Title'; Expression = { $DisabledUsers[$_.LegacyDN].Title } } |
Export-CSV -Path $env:userprofile\desktop\DisabledADUserTitlewithMailbox.csv -NoTypeInformation

Exchange 管理シェルから Get-User を使用することもできましたが、返されるプロパティとして LegacyExchangeDN がありません。 SamAccountName はありますが、これを使用すると、Get-Mailbox を介してすべてをブリッジする必要があります。いずれにしても、これは、ハッシュ テーブルを使用して、別のコレクション内の関連する値を参照する非常に一般的な手法です。

レポートを適切に作成するには、追加の作業が必要になると思います。

余談ですが、配列の追加に += 演算子を使用することは避けてください。を入手する最良の方法array は、上で行ったように PowerShell に提供させることです。ただし、それを回避できない場合、最も一般的な代替手段は ArrayList です。ほとんどのことと同様、いくつかの方法があります。以下はほんの 1 つの例です。

# To create:
$ArrList = [Collections.ArrayList]@()

#To Add a value:
[Void]$ArrList.Add( 'ValueOrObjectHere' )

注: += と ArrayList のドキュメント/ディスカッションは簡単です。 Google マシンで検索...

更新:

最新の編集で指摘されたエラーへの対処:

最初のエラーは基本的に不可能です。申し訳ありませんが、このエラーが発生したのは何らかの間違いだったと思われます。 LegacyExchangeDN は常に '/o=...' で始まる必要があり、エラーで引用されたキーは 'ADCDisabledMail' でした。また、LegacyExchangeDN は Active Directory 内で当然一意であるため、重複する可能性はほとんどありません。そのため、私は何も努力しませんでしたし、何も保証されませんでした。o このようなありそうもないエラーを防ぎます。

注: コードを繰り返しテストする場合は、コードを再作成する必要があります。 ハッシュ、$DisabledUsers = @{} それ以外の場合、ハッシュは 前回の実行と重複キーのエラーは確実です...

2 番目のエラー「キーを null にすることはできません」は、参照された OU 内のメールボックスが有効になっていない AD アカウントが原因で、それらのユーザーの LegacyExchangeDN 属性が実質的に null になっていることが原因である可能性があります。したがって、null キー.... メールが有効なユーザーのみを返すようにフィルタを変更することで、これを回避できます。

$disUsers = Get-ADUser -Filter  { mailNickName -like '*' } -SearchBase "ou=User Disabled Accounts,dc=test,dc=com" -Properties SamAccountName,Title

注: 参考までに、通常、mailNickName はエイリアス プロパティです。 Get-Mailbox で返されました

5

ご協力ありがとうございます。解決策を試しましたが、次のエラーがスローされ、結果の CSV は空です。コメント セクションでは完全なエラーが表示されないため、最初の投稿に編集としてエラーを追加しました。

– NewExAdmin

2020 年 9 月 5 日 16:28

@Steven に感謝します。コードは提供されたとおりに実行され、エラーが返されました。 2 番目のエラーはメールが有効なユーザーではない可能性があることを理解しています。私はこの組織に初めて参加したため、通知を受けましたすべてメールが有効になっていることを確認しました。

– NewExAdmin

2020 年 9 月 5 日 17:53

教えていただいたことには感謝していますが、フィルターを無効にすることで簡単に確認できます。 -Filter { mailNickName -notlike '*' }。これにより、指定された OU にメールボックス以外のユーザーがいるかどうかがわかります。注: LegacyExchangeDN は、Exchange 環境では必須のプロパティです。本当に null だった場合は、他のあらゆる種類の問題が発生することになります。何か理解できない点はありますか。 Office 365 を使用していますか?ハッシュ テーブルに追加せずにクエリを実行してみてもらえますか?否定フィルターも実行します説明どおりに実行し、何が戻ってくるかを教えてください。注: コードは私の環境では正常に動作しています...

– スティーブン

2020 年 9 月 5 日 20:28

こんにちは @Steven 遅れて申し訳ありませんが、別の問題に巻き込まれていました。この組織は Exchange のみのオンプレミス組織ですが、Outlook やその他のオフィス アプリケーションには Office 365 を使用しています。コードを正常に実行できませんでしたが、アイデアを取り入れて、必要なものを得るために元のコードを修正することができました。質問の編集に含めました。大変感謝しています。 LegacyExchangeDN の ADCDisabledMail 値に関しては、これを調べてみると、Exchange の以前のアップグレードによるものである可能性があります。またすぐにアップグレードする予定なので、必ず確認してみます。

– NewExAdmin

2020 年 9 月 6 日 15:00

うまくいってよかったです!この教訓は、私の特定のコードがあなたの環境で機能するかどうかよりも重要です。

– スティーブン

2020 年 9 月 6 日 15:29

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。