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

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

我刚接触 powershell 有 3 到 4 周的时间,并使用它与 Active Directory / Exchange 进行交互。(我对这两者也都很陌生。)

我试过阅读这个页面:http://technet.microsoft.com/en-us/library/ff730967.aspx但我对所有的信息有点不知所措,可能是因为我太累了。

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

我一直在尝试从这些调用返回的对象中收集所有“WindowsEmailAddress”属性:

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

然后,我查看这些结果(我将它们转换为一个不错的内存哈希表,其中的键是小写的电子邮件地址字符串),以查看我要为其设置联系人的电子邮件地址是否已经存在。对于我们 AD 域中的大多数电子邮件地址用户来说,这种方法非常有效。

不幸的是,有几个没有出现在这两个列表中,但我仍然无法创建邮件联系人,因为它说地址已经存在:

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

我有点害怕遍历 get-recipient 返回的列表...这是我需要做的吗?我在想可能有一种简单的方法可以实现这一点,但我还没有想出来。

重要提示:大约有 20-30 个地址都返回了这种类型的错误。但是,当您查看上面的错误并看到“Exchange 联系人”时,您会发现,字符串的这一部分对于不同的错误电子邮件地址完全不同。不确定这是否相关。如果我不明白,请随时纠正我。谢谢!

答案1

请注意,“mail”属性并不是唯一可以存放电子邮件地址的地方。还有一个多值属性“proxyAddresses”,其中可以向对象分配其他电子邮件地址。

有人在这里创建了一个脚本:(需要免费的 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

答案2

尝试

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

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

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

相关内容