问题描述
我对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