Creación de contactos personales en buzones de usuario con PowerShell y Graph
Aprovechando lo que pasó antes
“La imitación es la forma más sincera de adulación que la mediocridad puede ofrecer a la grandeza”, dijo Oscar Wilde. Dejando de lado cualquier noción de mediocridad, me gustó la idea que Sean McAvinue explicó en su artículo sobre la creación de contactos organizacionales en los buzones de correo de los usuarios utilizando la API Microsoft Graph. Es un concepto simple: todas las organizaciones tienen contactos, como Recursos Humanos, el Departamento de Viajes y Seguridad, a quienes los usuarios deberían poder contactar en caso de emergencia u otros motivos. Siempre pueden buscar el GAL, pero crear contactos personales en los buzones de correo de los usuarios significa que los dispositivos móviles también pueden sincronizar la información. Considerándolo todo, una buena idea y, mejor aún, el código PowerShell de Sean funciona.
Aprovechando PowerShell
Lo bueno de PowerShell es que es fácil tomar una idea desarrollada por otra persona y evolucionarla y mejorarla. Ahí es donde entra en juego la imitación, y la idea de que un guión se puede tomar y mejorar es exactamente lo que queremos fomentar en Practical365.com. Mientras miraba el código, pensé en tres mejoras:
- Identifique los buzones creados en el último mes y cree contactos personales en estos buzones.
- Permita que cualquier destinatario habilitado para correo en Exchange Online se utilice para crear contactos personales.
- Compruebe si hay contactos personales en un buzón antes de intentar crearlo.
Estos son cambios relativamente simples. Esto es lo que hice para crear el código.
Buscar buzones de correo de destino
Para buscar buzones de correo creados en el último mes, ejecute el cmdlet Get-ExoMailbox con un filtro del lado del servidor en la propiedad WhenMailboxCreated. La comparación de fechas puede ser complicada con los cmdlets del buzón, pero el siguiente código funcionó para mí:
$LastMonth = (Get-Date).AddDays(-30)
$Mailboxes = Get-ExoMailbox -Filter "WhenMailboxCreated -gt '$LastMonth'" -RecipientTypeDetails UserMailbox | Select ExternalDirectoryObjectId, DisplayName, UserPrincipalName
Encuentre la fuente de contactos personales
La idea es permitir que cualquier destinatario habilitado para correo sea una fuente de contactos personales. El cmdlet Get-Recipient puede encontrar cualquier objeto en todos los tipos de destinatarios, pero debemos identificar qué destinatarios deben usarse como fuente. Para hacer esto, marcamos los destinatarios que se utilizarán escribiendo un valor en un atributo personalizado. Todos los objetos habilitados para correo admiten atributos personalizados, por lo que podemos usar buzones de usuario, buzones compartidos, grupos de Microsoft 365, listas de distribución, usuarios de correo y contactos de correo. Suponiendo que los destinatarios elegidos estén actualizados con el valor, podemos encontrar el conjunto de contactos de origen con un comando como:
$OrgContacts = Get-Recipient -Filter {CustomAttribute4 -eq "OrgContact"}Actualización de contactos personales
El script original hace el trabajo pesado de crear una estructura JSON que define cada contacto personal para agregarlo a los buzones de correo de los usuarios. Mi versión realiza algunos análisis para manejar cada tipo de destinatario. El otro cambio implementado es verificar si existe un contacto personal en un buzón antes de intentar agregarlo. La verificación utiliza un filtro para comprobar que existe un contacto personal con la misma dirección de correo electrónico. Si no encontramos ninguno, seguimos adelante y lo agregamos. Aquí está el código para el cheque:
$Uri = "https://graph.microsoft.com/v1.0/users/$Mailbox/contacts?`$filter=emailAddresses/any(a:a/address eq '$Email')"
$Results = Invoke-RestMethod -Headers $Headers -Uri $Uri -UseBasicParsing -Method "GET" -ContentType "application/json"
La Figura 1 muestra cómo aparecen los contactos de la organización en el buzón de un usuario. En este caso, los orígenes de los contactos incluyen un contacto de correo, una lista de distribución, un buzón compartido, un grupo de Microsoft 365 y un buzón de usuario.
El siguiente paso
Como cualquier script de PowerShell, estoy seguro de que este código (que puedes descargar desde GitHub) se puede mejorar. Por un lado, mis scripts vienen con un manejo mínimo de errores porque trato de ilustrar principios en lugar de escribir código estándar. En cualquier caso, cada organización tiene su propia forma de abordar los errores, los problemas de registro, etc. Lo mejor es que tomes la idea explicada aquí y la implementes a tu manera.
Deja volar tu imaginación y descubre lo que puedes hacer. Todas las mejoras son bienvenidas. Ninguna idea es mala. Y cuando haya terminado, asegúrese de compartir lo que ha creado. Todos lo apreciaremos.
