Crear contactos habilitados para correo válido sin usar cmdlets específicos de Exchange

2

He escrito un script de PowerShell para procesar e importar rutinariamente una gran cantidad (más de 70k) de contactos en un entorno de Exchange. El script funciona bien, pero me gustaría acelerarlo si es posible. Las partes que consumen más tiempo solían ser importar y exportar los datos.

Pude reducir mucho el tiempo de procesamiento al eliminar la mayoría de las dependencias de los cmdlets de Exchange 2013. Por ejemplo, al usar el cmdlet "nativo" Get-ADObject para extraer los datos en lugar de una combinación de Get-MailContact y Get-Contact específicos de Exchange, pude reducir el tiempo de procesamiento en un factor de 10.

El comando se ve así:

$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} }

Ahora me gustaría poder hacer lo contrario, crear los contactos. Es decir, cree un contacto habilitado para correo sin usar cmdlets específicos de Exchange. Logré crear un contacto 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

Sin embargo, aunque el objeto aparentemente se creó correctamente, no aparece entre los contactos en Exchange. Hasta ahora, la única forma en que he podido lograr esto es ejecutar el cmdlet "Enable-MailContact" en el objeto después de la creación, lo que anula el propósito de no usar cmdlets de Exchange en el proceso.

Entonces, mi pregunta es, ¿alguien sabe si hay una manera de crear un contacto habilitado para correo funcional usando solo el cmdlet New-ADObject y sin depender de cmdlets específicos de Exchange?

Gracias.

Pennino
fuente

Respuestas:

2

Resultó que el elemento crucial que faltaba era la propiedad "showinaddressbook".

Este artículo explica cómo funciona: https://support.microsoft.com/en-us/kb/253828

El atributo showInAddressBook tiene dos propósitos. El primero es permitir que las personas vean la entrada que figura en la lista de direcciones mediante el cliente de la Interfaz de programación de aplicaciones de mensajería (MAPI), como Microsoft Outlook. El segundo propósito es permitir a los usuarios "resolver un nombre" en un cliente MAPI.

Aunque el artículo hace referencia al Servicio de actualización de destinatarios (RUS) que ya no existe desde Exchange 2007, supongo que el proceso subyacente para el correo que habilita un objeto sigue siendo el mismo.

Básicamente, para crear un contacto habilitado para correo sin usar los cmdlets de Exchange 2013, hice algo como esto:

$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

El objeto resultante aún no tiene el LegacyExchangeDNvalor y tiene un valor peculiar, ExchangeVersionpero la AddressListMembershippropiedad ahora está poblada.

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}
Pennino
fuente
1

Supongo que le falta el atributo proxyAddresses. Puede verificarlo Usuarios y equipos de AD para ver los atributos que agregó el atributo Enable-MailContact.

Greg Askew
fuente
Gracias por la sugerencia, agregué el proxyAddressesatributo y podría estar en el camino correcto, pero todavía no tengo cigarro. Mediante la comparación de dos contactos creados uno con los cmdlets de Exchange y uno con el New-AdObjectcmdlet, noto que los siguientes atributos están vacíos en el segundo caso: AddressListMembership, LegacyExchangeDN, UMDtmfMap. Además, el atributo ExchangeVersionestá configurado 0.1 (8.0.535.0)para contactos creados por el propio Exchange y 0.0 (6.5.6500.0)para contactos creados por New-AdObject. Haré algunas pruebas más.
Pennino
Parece que también necesitaría legacyExchangeDN y msExchRecipientDisplayType = 6 (RemoteMailUser).
Greg Askew