无法将项目添加到 Powershell 数组

Cannot add items to Powershell array

我对 Powershell 比较陌生,但无法在线找到答案。

我正在尝试获取 Exchange 2010 中每个禁用用户的电子邮件数量,但还需要从 AD 获取用户的头衔,因为组织使用 AD 中的 Title 属性按类型对用户进行分组

我写了以下内容,但我无法获得我需要的数据,它只是 returns CSV 文件的长度和数字,例如 “长度” “10” “3” “34”

如果我将 $title 排除在 $Disabled+= 的分配之外,用户名和项目计数将添加到 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

听起来您真正想要做的是关联数据以创建一个小报告。您正在处理来自不同命令的数据,因此您需要 属性 才能加入。在这种情况下,我会查看 LegacyExchangeDN AD 属性和由 Get-MailboxStatistics 编辑的 LegacyDN 属性 return。代码可能类似于:

$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 Management Shell 中的 Get-User,但是它没有 LegacyExchangeDN 作为 returned 属性。它确实有 SamAccountName,但使用它会迫使我通过 Get-Mailbox 桥接所有内容。无论如何,这是使用散列 table 来引用不同集合中的相关值的一种非常常见的技术。

我确信需要做一些额外的工作才能使报告恰到好处。

顺便说一句,尽量避免使用 += 运算符来追加数组。获取数组的最佳方法是让 PowerShell 像我上面那样提供它。但是,如果您无法绕过它,最常见的替代方法是 ArrayList。像大多数事情一样,有几种方法可以解决,下面只是 1 个示例。

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

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

Note: Documentation / discussion of += and ArrayList's are easy to find with the Google machine...

更新:

解决最近编辑中注意到的错误:

第一个错误基本不可能。原谅我,但我必须假设你犯了一些错误来产生这个错误。 LegacyExchangeDN 应始终以 '/o=...' 开头,错误引用的密钥是 'ADCDisabledMail' 。此外,LegacyExchangeDN 在 Active Directory 中自然是唯一的,因此您几乎不可能有重复的。因此,我没有做出任何努力,none 是有保证的,以防止这种不太可能发生的错误。

Note: If you are repeatedly testing the code you have to recreate the hash, $DisabledUsers = @{} else the hash will exist from the previous run and duplicate key errors are a certainty...

第二个错误,他们 'key cannot be null' 可能是由于 non-mailbox 在引用的 OU 中启用了 AD 帐户,有效地导致这些用户的 LegacyExchangeDN 属性为空。因此,空键....您可以通过将过滤器修改为仅 return 启用邮件的用户来避免这种情况:

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

Note: For reference, mailNickName is the alias propertry typically returned with Get-Mailbox