Powershell 2:如何在AD中find具有特定电子邮件地址的任意对象?

我是3到4个星期新的PowerShell,并使用它来与Active Directory / Exchange交互。 (这两个我也很新。)

我试过阅读这个页面: http : //technet.microsoft.com/en-us/library/ff730967.aspx,但我有点淹没的所有信息,可能是因为我筋疲力尽。

这是我想要做的。 在我的代码中,我想将一个电子邮件地址作为inputstring,并创build一个邮件联系人(New-MailContact),并将-ExternalEmailAddress参数设置为此string。 这非常简单。 但是,如果AD中的一个对象已经存在这个地址,它不会让我创build邮件联系人。 所以,在创build尝试之前,我需要确定对create-mailcontact的调用是否会产生错误。 (我需要检测的原因是因为如果发生这种情况,我需要运行一大堆其他命令和逻辑。)

我一直在试图做的是从这些调用返回的对象收集所有'WindowsEmailAddress'属性:

get-user -resultSize unlimited get-mailcontact -resultSize unlimited 

然后,我看看这些结果(我将它们转换为一个很好的内存中哈希表,其中的键是小写的电子邮件地址string),看看我要build立一个联系人的电子邮件地址已经存在。 对于我们AD域中的大多数用户来说,这个工作很好。

不幸的是,有一些不出现在这些列表中的任何一个,但是我仍然不能创build邮件联系人,因为它表示地址已经存在:

 The proxy address "SMTP:[email protected]" is already being used by "our.domain.org/Exchange Contacts/Some User Name". Please choose another proxy address. + CategoryInfo : NotSpecified: ([email protected]:ADObjectId) [New-MailContact], ProxyAddressExistsException + FullyQualifiedErrorId : 6580586A,Microsoft.Exchange.Management.Recipient Tasks.NewMailContact 

我有点害怕迭代获取收件人返回的列表…是我需要做什么? 我想这可能是一个简单的方法来完成这个我还没有想出来。

重要提示:大约有20-30个地址,都会返回这种types的错误。 但是,当你看到上面的错误,看到“交换联系人”,那么该string的部分是完全不同的一个错误的电子邮件地址到下一个。 不知道这是否相关。 请随时把我直接的任何我不明白的东西。 谢谢!

请注意,“邮件”属性不是电子邮件地址的唯一位置。 还有一个多值属性“proxyAddresses”,其中可以将其他电子邮件地址分配给一个对象。

有人在这里创build了一个脚本:(需要免费的Quest AD cmdlet)

http://poshcode.org/1594

  Param ( [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, HelpMessage="Enter SMTP address to search for in Active-Directory." )] [string]$objSMTP ) Function Get-ProxyAddresses ([string]$Address){ $objAD = $null $objAD = Get-QADObject -LdapFilter "(proxyAddresses=*$Address*)" -IncludeAllProperties -SizeLimit 0 -ErrorAction SilentlyContinue Write-Output $objAD }#Close Function #Validate Quest PSSnapin is loaded Add-PSSnapin -Name Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue #Run Function to search AD for SMTP address $Results = $null $Results = Get-ProxyAddresses -Address $objSMTP | Select-Object Name,DisplayName,ObjectClass,Email,AccountisDisabled,AccountisLockedOut,MailNickName,LegacyExchangeDN -ErrorAction SilentlyContinue IF($Results -eq $null){ Write-Host "" Write-Host "No Object Found with .attribute[proxyAddress] containing $objSMTP."} Else{$Results | Format-List *} #End 

尝试

 get-recipient "[email protected]" -ea silentlycontinue 

将返回交换环境中任何启用邮件的对象的结果。 这将包括联系人,启用邮件的用户和邮箱。 我的经验是,它也应该浏览代理地址字段。

 $FindExistingRecipient = get-recipient "[email protected]" -ea silentlycontinue if ($FindExistingRecipient -eq $null) { new-mailcontact .... }