无法将项目添加到Powershell阵列

问题描述

我对Powershell相对较新,但无法在线找到答案。

我正在尝试获取Exchange 2010中每个禁用用户的电子邮件数量,但是由于组织使用AD中的Title属性按类型对用户进行分组,因此还需要获取用户标题表格AD

我写了以下内容,但我无法获取所需的数据,它只是将长度和数字返回给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

不幸的是,使用史蒂夫提供的代码会出现以下错误

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,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

解决方法

听起来,您真正想做的是将数据关联以创建小型报告。您正在处理来自不同命令的数据,因此需要一个属性来进行连接。在这种情况下,我将查看Get-MailboxStatistics返回的LegacyExchangeDN AD属性和LegacyDN属性。该代码可能类似于:

$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文件,只需在Export-CSV命令之后添加Select-Object命令,如下所示:

$DisabledUsers = @{}

Get-ADUser -SearchBase 'ou=User Disabled Accounts,@{ Name = 'Title'; Expression = { $DisabledUsers[$_.LegacyDN].Title } } |
Export-CSV -Path $env:userprofile\desktop\DisabledADUserTitlewithMailbox.csv -NoTypeInformation

我会从Exchange命令行管理程序中使用Get-User,但是它没有LegacyExchangeDN作为返回的属性。它确实具有SamAccountName,但是使用它会迫使我通过Get-Mailbox桥接所有内容。无论如何,这是使用哈希表来引用不同集合中相关值的一种非常常见的技术。

我确定需要做一些额外的工作才能使报告正确无误。

此外,请尝试避免使用+=运算符来追加数组。获取数组的最佳方法是像上面那样让PowerShell提供它。但是,如果无法解决,最常见的选择是ArrayList。像大多数事情一样,有几种解决方法,下面只是一个示例。

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

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

注意:+=和ArrayList的文档/讨论很容易 在Google机器上查找...

更新

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

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

注意:如果您反复测试代码,则必须重新创建 哈希,$DisabledUsers = @{},否则哈希将存在于 以前的运行和重复的关键错误是可以肯定的...

第二个错误,它们“键不能为空”可能是由于引用的OU中未启用邮箱的AD帐户导致这些用户的LegacyExchangeDN属性实际上为空。因此,请使用null键。...您可以通过修改过滤器以仅返回启用了邮件的用户来避免这种情况:

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

注意:作为参考,mailNickName通常是别名属性 Get-Mailbox

返回