Migrar contactos de correo a cuentas de invitado de Azure AD
¿Son las cuentas de invitado de Azure AD la mejor opción?
Una discusión sobre la eliminación de cuentas obsoletas de invitados de Azure AD con discusiones no canjeadas llevó a una afirmación (no mía) de que las organizaciones de Microsoft 365 estarían mejor si reemplazan los objetos de contacto de correo utilizados por Exchange Online con cuentas de invitados. La lógica es que Microsoft pone mucho esfuerzo de ingeniería en desarrollar y mantener cuentas de invitados como parte de las identidades externas de Azure AD. Los inquilinos se benefician de las mejoras que Microsoft realiza en la funcionalidad y la administración del ciclo de vida de las identidades externas en lugar de aceptar contactos de correo por los objetos simples que son (comparo los objetos de correo y las cuentas de invitados en otro artículo).
Si acepta la propuesta de que las cuentas de invitado son la mejor opción, la siguiente pregunta es cómo migrar contactos de correo a cuentas de invitado. Microsoft no ofrece una opción de migración y no puedo encontrar una utilidad adecuada en ningún otro lugar, por lo que la única opción es crear la suya propia con PowerShell.
Conceptualmente, el trabajo no es difícil. El script debe encontrar contactos de correo para procesar y utilizar los datos para crear nuevas cuentas de invitados. Esto es lo que hice.
Migración bajo demanda
Migre todas sus cargas de trabajo y Active Directory con una solución integral de migración de inquilino a inquilino de Office 365.
Encontrar datos de contacto
Puede utilizar el cmdlet Get-MailContact para buscar contactos de correo (la opción lógica), pero el cmdlet Get-ExoRecipient devuelve información organizacional adicional que ayuda a desarrollar las propiedades de la cuenta de invitado. Esto puede resultar confuso, pero se explica por:
- Tanto Exchange Online como Azure AD almacenan objetos de contacto. Exchange y Azure AD sincronizan la configuración de objetos.
- El cmdlet Get-MailContact devuelve propiedades del contacto de Exchange.
- El cmdlet Get-ExoRecipient devuelve propiedades del contacto de Azure AD junto con algunas propiedades de correo electrónico.
La interfaz de usuario del centro de administración de Microsoft 365 y del centro de administración de Exchange oculta el hecho de que existen dos objetos diferentes. La Figura 1 muestra un ejemplo de un contacto mostrado por el centro de administración de Microsoft 365. La pestaña Configuración permite al administrador actualizar las propiedades de correo electrónico del objeto de Exchange, mientras que la pestaña general permite el acceso a la información organizacional almacenada en Azure AD.
Creación de cuentas de invitado de Azure AD
Después de encontrar contactos, el script recorre el conjunto para crear cuentas de invitados. Primero, verifica si la dirección de correo electrónico utilizada por el contacto de correo ya existe para una cuenta de invitado. Normalmente, Exchange Online no permite que varios destinatarios habilitados para correo compartan la misma dirección de correo electrónico. Las cuentas de invitado son una excepción porque Exchange Online crea objetos de usuario de correo especiales para cuentas de invitado (consulte este artículo para obtener más detalles).
A continuación, el script reúne las propiedades de la nueva cuenta de invitado. Tenga en cuenta que los cmdlets del SDK de Microsoft Graph PowerShell tienen algunas debilidades interesantes (algunos dirían errores inexplicables) que necesitan consideración. Por ejemplo, no puede usar la variable $Null de PowerShell como un valor vacío para escribir en una propiedad porque los cmdlets del SDK solo aceptan caracteres de espacio.
Las cuentas de invitado tienen contraseñas, por lo que el script necesita crear una contraseña (incluso si nadie inicia sesión en la cuenta de invitado). Utilizo una rutina similar a la explicada en este artículo sobre la creación de nuevas cuentas de usuario de Azure AD.
Para crear la nueva cuenta de invitado, el script ejecuta el cmdlet New-MgUser y pasa la tabla hash de propiedades completadas desde el contacto de correo de origen. Luego ejecuta el cmdlet Update-MgUser para asegurarse de que la cuenta de invitado (o más bien, el usuario de correo de invitado creado por Exchange Online para la cuenta de invitado) aparezca en las listas de direcciones de Exchange como OAB y GAL. El script coloca el contacto de correo de origen en un estado no utilizado asignándole una dirección de correo electrónico ficticia y ocultándolo de las listas de direcciones de Exchange. También marca el contacto como migrado.
# Populate hash table with properties for the new account
$NewUserProperties = @{
UserType = "Guest"
GivenName = $FirstName
Surname = $LastName
DisplayName = $DisplayName
JobTitle = $JobTitle
Department = $Department
MailNickname = $NickName
Mail = $Contact.PrimarySmtpAddress
UserPrincipalName = $UPN
Country = $Country
City = $City
PostalCode = $PostalCode
OfficeLocation = $Office
Company = $Company
UsageLocation = $UsageLocation
PasswordProfile = $NewPasswordProfile
AccountEnabled = $true }
# Try to create new guest account
Try {
$NewGuestAccount = New-MgUser @NewUserProperties }
Catch {
Write-Host ("Couldn't create new Guest account using these properties")
Write-Host $NewUserProperties
Break }
# Let the new guest appear in Exchange address lists
Update-MgUser -UserId $NewGuestAccount.Id -ShowInAddressList
# Hide the mail contact and keep a record of the old email address (that the guest account now has
Set-MailContact -Identity $Contact.Alias -HiddenFromAddressListsEnabled $True -CustomAttribute1 $Contact.PrimarySmtpAddress -CustomAttribute2 "Migrated"
Pasa aproximadamente un día antes de que la nueva cuenta de invitado aparezca en la OAB. Esto se debe a que Exchange debe generar archivos de cambios para que los clientes los procesen para que los cambios sean visibles. Después de que esto suceda, la cuenta de invitado creada a partir del contacto migrado se parece a cualquier otro contacto cuando se ve a través de Outlook (Figura 1) u OWA (que muestra fotos cuando están disponibles).
Actualización de listas de distribución con cuentas de invitado de Azure AD
Muchos contactos de correo son miembros de listas de distribución. Para reemplazar los contactos en una lista de membresía, el script busca el conjunto de listas de distribución al que pertenece cada contacto de correo y escribe esta información en una lista. Sería bueno actualizar las listas de distribución inmediatamente, pero esto requiere el objeto de usuario invitado especial creado por Exchange Online para una cuenta de invitado. Exchange Online reconoce al usuario de correo invitado como un destinatario de correo electrónico válido, por eso es el objeto agregado a las listas de distribución.
Sin embargo, la creación del objeto de usuario de correo invitado no es inmediata. Depende de un proceso en segundo plano que puede tardar hasta cinco minutos. Es por eso que el script escribe la información sobre la membresía en una lista:
$DN = $Contact.DistinguishedName
[array]$DLs = Get-ExoRecipient -ResultSize Unlimited -Filter "Members -eq '$DN'" -RecipientTypeDetails MailUniversalDistributionGroup -ErrorAction SilentlyContinue
If ($DLs) {
Write-Host ("User is a member of {0} groups" -f $DLs.count)
ForEach ($DL in $DLs) {
$DataLine = [PSCustomObject] @{
DLName = $DL.DisplayName
DLAlias = $DL.Alias
DLId = $DL.ExternalDirectoryObjectId
DLOldMember = $DN
DLNewMember = $NewGuestAccount.Id }
$DLUpdates.Add($Dataline) }
} #End If $DLs
Después de procesar todos los contactos, el script escribe las actualizaciones de la lista de distribución en un archivo CSV. Posteriormente, un script independiente puede importar los detalles del archivo CSV y procesar las actualizaciones eliminando los contactos de origen de las listas de distribución y reemplazándolos con los usuarios de correo invitados:
[array]$DLUpdatesToProcess = Import-CSV c:\temp\DLUpdateToProcess.csv
ForEach ($Update in $DLUpdatesToProcess) {
Remove-DistributionGroupMember -Identity $Update.DLAlias -Member $Update.DLOldMember -Confirm:$False
Add-DistributionGroupMember -Identity $Update.DLAlias -Member $Update.DLNewMember
}
Contacto Limpieza
Más adelante, deberíamos limpiar eliminando los contactos migrados; no menos importante, es mejor tener una instancia del contacto para administrar. Como se muestra en la Figura 3, si no lo hace, el centro de administración de Exchange y otras interfaces de administración incluirán tanto el contacto de correo de origen antiguo como el nuevo objeto de usuario de correo invitado al ver los contactos.
Mantenimiento y cuidado de cuentas de invitados
Estoy seguro de que he olvidado algunos pasos que el script podría realizar, pero los enumerados anteriormente son suficientes para crear cuentas de invitado y demostrar que pueden cumplir el mismo propósito que los contactos de correo. Es importante darse cuenta de que una vez que realiza el cambio a cuentas de invitado, el centro de administración de Microsoft Entra se convierte en el punto de apoyo para el mantenimiento futuro de sus contactos. El centro de administración de Exchange puede mostrar objetos de usuario de correo invitado, pero no puede actualizarlos.
La Figura 4 muestra una cuenta de invitado creada a partir de un contacto migrado. Agregué una foto a la cuenta. Este es un valor agregado que obtienes de las cuentas de invitado, ya que Exchange Online no te permite agregar fotos a los contactos de correo.
Un problema inmediato que debe abordar si reemplaza el contacto de correo con cuentas de invitado es que el centro de administración de Azure AD no puede crear cuentas de invitado sin enviar una invitación a la dirección de correo electrónico del invitado. Esto es natural y por diseño. El centro de administración admite la colaboración B2B de Azure y el canje de invitaciones es el mecanismo para que los invitados demuestren su identidad y obtengan acceso a los recursos de los inquilinos almacenados en Teams, SharePoint Online y OneDrive for Business.
Pero si estoy creando una nueva cuenta de invitado en lugar de un contacto de correo, no necesariamente quiero enviar una invitación si la cuenta de invitado sirve como indicador para la colaboración por correo electrónico en lugar del tipo admitido por Teams y SharePoint Online. . Si el huésped recibe una invitación, puede responder para canjear la invitación, pero no podrá acceder a ningún recurso del inquilino, por lo que es una especie de no operación. Sería bueno si el centro de administración de Azure AD admitiera la creación de cuentas de invitado básicas sin invitaciones, ya que dudo que todos estén felices de ejecutar el cmdlet New-MgUser para crear nuevas cuentas de invitado.
Planificación y consolidación de la migración de la plataforma Microsoft
Simplifique la planificación de la migración, supere los desafíos de la migración y finalice los proyectos más rápido mientras minimiza los costos, los riesgos y las interrupciones para los usuarios.
Pasar a cuentas de invitado
Es posible pasar de contactos de correo a cuentas de invitados (puedes descargar un script de GitHub para ver cómo lo hice). Es un proceso manual que no es difícil pero necesita algunos cuidados. No poder crear cuentas de invitado sin invitaciones a través del centro de administración es una pequeña molestia, y es evidencia de que Microsoft aún no ha hecho el trabajo para preparar la infraestructura que permita a las organizaciones pasar de los contactos de correo centrados en el correo electrónico a un objeto que sea más en sintonía con el ecosistema de Microsoft 365. Quizás ese trabajo llegue con el tiempo.



