Назад | Перейти на главную страницу

Powershell 2: как найти произвольный объект в AD, имеющий определенный адрес электронной почты?

Я уже 3-4 недели знаком с PowerShell и использую его для взаимодействия с 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:xxxx@xxxx.org" is already being used by
"our.domain.org/Exchange Contacts/Some User Name". Please choose another proxy
address.
  + CategoryInfo          : NotSpecified: (our.domai...xx@xxxx.org:ADObjectId) [New-MailContact], ProxyAddressExistsException
  + FullyQualifiedErrorId : 6580586A,Microsoft.Exchange.Management.Recipient Tasks.NewMailContact

Я немного боюсь перебирать список, возвращаемый get-recipient ... это то, что мне нужно сделать? Я думал, что, вероятно, есть простой способ сделать это, я еще не понял.

Важное примечание: существует около 20-30 адресов, все из которых возвращают этот тип ошибки. ОДНАКО, если вы посмотрите выше и увидите в сообщении об ошибке «Обмен контактами», ну, эта часть строки полностью отличается от одного ошибочного адреса электронной почты к другому. Не уверен, что это актуально. Пожалуйста, не стесняйтесь объяснять мне все, чего я не понимаю. Спасибо!

Обратите внимание, что атрибут «mail» - не единственное место, где может находиться адрес электронной почты. Существует также многозначный атрибут proxyAddresses, с помощью которого объекту могут быть назначены дополнительные адреса электронной почты.

Кто-то создал здесь сценарий: (требуется бесплатный командлет Quest AD)

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 "xxxx@xxxx.org"  -ea silentlycontinue

вернет результаты для любого объекта с поддержкой почты в вашей среде обмена. Это будут контакты, пользователи с включенной поддержкой почты и почтовые ящики. По моему опыту, он также должен просматривать поля адреса прокси.

$FindExistingRecipient = get-recipient "xxxx@xxxxx.org" -ea silentlycontinue
if ($FindExistingRecipient -eq $null) {
         new-mailcontact ....
}