Powershell 2: Como encontrar um objeto arbitrário no AD com um endereço de e-mail específico?

1

Tenho de 3 a 4 semanas para usar o PowerShell e usá-lo para interagir com o Active Directory / Exchange. (Ambos eu também sou muito novo para.)

Eu tentei ler esta página: link mas estou um pouco sobrecarregado por todas as informações, provavelmente porque estou esgotado.

Aqui está o que estou tentando fazer. Em meu código, desejo usar um endereço de email como uma string de entrada e criar um contato de email (New-MailContact) com o parâmetro -ExternalEmailAddress definido para essa string. Isso é trivialmente fácil. MAS, se um objeto no AD já existir com esse endereço, ele não me permitirá criar o contato de email. Portanto, antes da tentativa de criação, preciso determinar se a chamada para create-mailcontact produzirá um erro. (O motivo pelo qual preciso detectar isso é porque, se essa condição estiver ocorrendo, preciso executar vários outros comandos e lógica.)

O que tenho tentado fazer é coletar todas as propriedades 'WindowsEmailAddress' dos objetos retornados por essas chamadas:

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

Eu, então, observo esses resultados (eu os converto em uma boa tabela de hash na memória onde as chaves são as cadeias de caracteres de endereço de e-mail em minúsculas) para ver se o endereço de e-mail para o qual já estou configurando um contato já existe. Para a maioria dos endereços de e-mail que são usuários em nosso domínio do AD, isso funciona muito bem.

Infelizmente, há alguns que não aparecem em nenhuma dessas listas, mas ainda não consigo criar o contato de e-mail porque ele diz que o endereço já existe:

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

Estou com um pouco de medo de percorrer a lista retornada por get-recipient ... é isso que preciso fazer? Eu estava pensando que provavelmente há uma maneira fácil de conseguir isso, eu ainda não descobri.

Nota importante: existem cerca de 20 a 30 endereços, todos devolvendo este tipo de erro. No entanto, quando você olha acima e vê 'Exchange Contacts' no erro, bem, essa parte da string é completamente diferente de um endereço de email defeituoso para o próximo. Não tenho certeza se isso é relevante. Por favor, sinta-se à vontade para me colocar diretamente em qualquer coisa que eu não esteja entendendo. Obrigado!

    
por Larold 22.09.2011 / 08:35

2 respostas

1

Observe que o atributo "mail" não é o único lugar em que um endereço de e-mail pode estar localizado. Há também um atributo de valores múltiplos "proxyAddresses", onde endereços de e-mail adicionais podem ser atribuídos a um objeto.

Alguém criou um script aqui: (requer o cmdlet gratuito do Quest AD)

link

    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
    
por 22.09.2011 / 11:18
0

tente

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

retornará resultados para qualquer objeto habilitado para email em seu ambiente de troca. Isso incluirá contatos, usuários habilitados para email e caixas de correio. Minha experiência é que ele também deve percorrer os campos de endereço do proxy.

$FindExistingRecipient = get-recipient "[email protected]" -ea silentlycontinue
if ($FindExistingRecipient -eq $null) {
         new-mailcontact ....
}
    
por 11.08.2017 / 21:49