Criando contatos habilitados para email válidos sem usar cmdlets específicos do Exchange

2

Eu escrevi um script powershell para processar e importar rotineiramente uma quantidade grande (acima de 70k) de contatos em um ambiente do Exchange. O script funciona bem, mas eu gostaria de acelerá-lo, se possível. As partes mais demoradas costumavam importar e exportar os dados.

Consegui reduzir muito do tempo de processamento removendo a maioria das dependências dos cmdlets do Exchange 2013. Por exemplo, usando o cmdlet Get-ADObject "nativo" para extrair os dados em vez de uma combinação de Get-MailContact e Get-Contact específicos do Exchange, consegui reduzir o tempo de processamento por um fator de 10.

O comando é assim:

$result = Get-ADObject -LDAPFilter "(objectClass=contact)" -searchBase "$OU"  -ResultPageSize 100 -property GivenName, SN, DisplayName, Department, physicalDeliveryOfficeName , telephoneNumber, mailnickname, targetaddress |  select @{ label="Email"; Expression={ ($_.targetaddress -replace "^SMTP:","").tostring().Tolower().Trim() }}, @{ N="Alias"; E={ $_.mailnickname} }, @{ N="FirstName"; E={ $_.GivenName} }, @{ N="LastName"; E={ $_.SN} }, DisplayName,  @{ N="Office"; E={ $_.physicalDeliveryOfficeName} } , Department, @{ N="Phone"; E={ $_.telephoneNumber} }

Agora eu gostaria de poder fazer o oposto, para criar os contatos. Ou seja, crie um contato habilitado para email sem usar cmdlets específicos do Exchange. Consegui criar um contato usando este comando:

$Attributes = @{'displayName' = $displayname; 'GivenName' = $first; 'SN' = $last; 'Department' = $department; 'physicalDeliveryOfficeName' = $office; 'telephoneNumber' = $phone; 'mail' = $email; 'mailnickname' = $alias; 'targetaddress' = $email}

New-AdObject -Type Contact -Name $displayname -Path $OU -OtherAttributes $Attributes -whatif

No entanto, embora o objeto aparentemente tenha sido criado corretamente, ele não aparece entre os contatos no Exchange. A única maneira de conseguir isso é executar o cmdlet "Enable-MailContact" no objeto após a criação, o que anula o propósito de não usar os cmdlets do Exchange no processo.

Portanto, minha pergunta é: alguém sabe se existe uma maneira de criar um contato funcional habilitado para email usando apenas o cmdlet New-ADObject e sem depender de cmdlets específicos do Exchange?

Obrigado.

    
por Pennino 22.12.2015 / 08:48

2 respostas

1

Descobrimos que o item crucial faltante era a propriedade "showinaddressbook".

Este artigo explica como funciona: link

The showInAddressBook attribute has two purposes. The first is to let people see the entry listed in the address list by means of Messaging Application Programming Interface (MAPI) client, such as Microsoft Outlook. The second purpose is to allow users to "resolve a name" on a MAPI client.

Embora o artigo se refira ao RUS (Serviço de Atualização de Destinatário), que não existe mais desde o Exchange 2007, acho que o processo subjacente para o correio que habilita um objeto ainda é o mesmo.

Então, basicamente, para criar um contato habilitado para email sem usar os cmdlets do Exchange 2013, fiz algo assim:

$alias = "ADDR-00001"
$email = "[email protected]"
$first = "Joe"
$last = "Doe"
$displayname = "DOE Joe"
$department = "My Dept."
$office = "My Office"
$phone = "55554448934"
$proxyAddresses = "SMTP:[email protected]"
$DestinationOU = "OU=contact,OU=example,DC=corp,DC=example,DC=com"
$AddressBook = "CN=Default Global Address List,CN=All Global Address Lists,CN=Address Lists Container,CN=Example-Org,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=example,DC=com","CN=All Contacts,CN=All Address Lists,CN=Address Lists Container,CN=Example-Org,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=example,DC=com"

$Attributes = @{'displayName' = $displayname; 'GivenName' = $first; 'SN' = $last; 'Department' = $department; 'physicalDeliveryOfficeName' = $office; 'telephoneNumber' = $phone; 'mail' = $email; 'mailnickname' = $alias; 'targetaddress' = $email; 'proxyAddresses' = $proxyAddresses; 'showinaddressbook' = $AddressBook;}

New-AdObject -Type Contact -Name $displayname -Path $DestinationOU -OtherAttributes $Attributes

O objeto resultante ainda não tem o valor LegacyExchangeDN e tem um peculiar ExchangeVersion , mas a propriedade AddressListMembership agora está preenchida.

Get-Mailcontact "[email protected]" | select displayName, RecipientType, LegacyExchangeDN, ExchangeVersion, AddressListMembership| fl

DisplayName           : DOE Joe
RecipientType         : MailContact
LegacyExchangeDN      :
ExchangeVersion       : 0.0 (6.5.6500.0)
AddressListMembership : {\All Contacts, \Default Global Address List}
    
por 27.12.2015 / 21:41
1

Meu palpite seria que faltava o atributo proxyAddresses. Você pode verificar os Usuários e Computadores do AD para ver os atributos que foram adicionados pelo atributo Enable-MailContact.

    
por 23.12.2015 / 19:34