Gestión de buzones de correo en línea de PowerShell, Piping y Exchange
Cmdlets de canalización
Al trabajar con PowerShell tenemos muchos cmdlets que pueden realizar tareas como consultas, cambios de configuración y más. Por sí solos, los cmdlets individuales son útiles, pero poder pasar información de un cmdlet a otro es una característica increíblemente útil de PowerShell. PowerShell utiliza un concepto llamado canalización para combinar dos o más cmdlets para realizar una tarea coherente. El carácter de canalización '|' separa los cmdlets.
Al crear una canalización entre cmdlets, la información pasa del cmdlet de la izquierda al cmdlet de la derecha. Tenga en cuenta que cuando la información pasa de izquierda a derecha, PowerShell almacena los datos como objetos para que los procese el siguiente cmdlet y no como texto sin formato. El uso de objetos significa que PowerShell tiene la máxima flexibilidad cuando el siguiente cmdlet de la canalización procesa los datos que recibe.
Uso práctico
Aquellos con PowerShell por primera vez a menudo terminan usando cmdlets únicos para crear frases ingeniosas para consultar información como Get-EXOMailbox para enumerar los buzones de correo de Exchange Online o cambiar la configuración con Set-EXOMailbox. El uso de una canalización entre estos cmdlets amplía lo que podemos hacer. Aunque no existe límite para la cantidad de cmdlets en una canalización, tenga cuidado de no hacerlo demasiado complejo, ya que esto podría tener consecuencias no deseadas.
Estos ejemplos muestran cómo usar la canalización de diferentes maneras para enumerar los buzones de correo de Exchange Online que están habilitados para archivar:
Get-EXOMailbox -PropertySets Minimum,Archive | Where ArchiveName -ne $NullEl mismo ejemplo, pero se usa otra canalización para agregar clasificación por la propiedad DisplayName:
Get-EXOMailbox -PropertySets Minimum,Archive | Where ArchiveName -ne $Null | Sort-Object DisplayName
Tomando el ejemplo anterior y agregando Pipelines adicionales para ajustar el formato de la salida:
Get-EXOMailbox -PropertySets Minimum,Archive | Where ArchiveName -ne $Null | Sort-Object DisplayName | ft -AutoExiste un orden de operaciones para el uso de cmdlets para procesar la información correctamente. Por ejemplo, los cmdlets de formato (Ft, Fl, Fw) deben agregarse al final de la canalización. De lo contrario, PowerShell genera un error:
"out-lineoutput : The object of type "Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData" is not valid or not in the correct sequence."NO intente formatear la salida en medio del proceso:
Get-EXOMailbox -PropertySets Minimum,Retention | Ft DisplayName,Retention* | Sort-Object DisplayNameHAGA esto en su lugar (formateando al final):
Get-EXOMailbox -PropertySets Minimum,Retention | Sort-Object DisplayName | Ft DisplayName,Retention*Cmdlets compatibles
No todos los cmdlets de PowerShell pueden canalizar información de un cmdlet a otro, normalmente porque los objetos generados por un cmdlet no pueden ser procesados por el siguiente en la canalización. Por ejemplo, no podemos canalizar objetos desde el cmdlet Get-EXOMailbox al cmdlet Get-Remote Domain porque el segundo cmdlet intentará procesar las identidades de los buzones como dominios remotos y, por lo tanto, fallará.
Por otro lado, los cmdlets que procesan objetos similares como Get-EXOMailbox y Get-MailboxSpellingConfiguration pueden canalizar datos entre ellos porque el segundo cmdlet puede aceptar las identidades de buzón para procesar.
Comprender qué cmdlets funcionan juntos requiere algo de experiencia. Lógicamente, debemos comprender qué acepta un cmdlet como entrada antes de canalizar información desde otro cmdlet.
La variable de canalización $_
La tubería admite la variable especial $_ para identificar el objeto actual que está procesando PowerShell. Podemos usar el objeto y trabajar con sus propiedades agregando un '.' y la propiedad que queramos, como DisplayName o Identity.
Un uso común de la variable $_ es hacer referencia a una propiedad del objeto que se consulta y filtrar todos los objetos que coincidan con esta propiedad. Esto se puede hacer tanto en una sola línea como en un bucle Foreach:
En este ejemplo, buscamos buzones de correo actualizados en los últimos 14 días:
$Date = (Get-Date).AddDays(-14)
Get-EXOMailbox -InactiveMailboxOnly | Where {$_.WhenChanged -lt $Date} | Ft
También podemos usar la variable $_ para realizar otras tareas comunes. En este ejemplo buscamos buzones ubicados en EE.UU. y que tengan una Política de Retención asignada:
Get-EXOMailbox -PropertySets All | Where {$_.RetentionPolicy -ne $Null} | Where {$_.UsageLocation -eq 'United States'} | Ft DisplayName,PrimarySMTPAddress,RetentionPolicy -AutoLista de todos los buzones de correo inactivos de Estados Unidos, ordenados por la fecha del último cambio y el formato de salida:
Get-EXOMailbox -InactiveMailboxOnly -PropertySets All | Where {$_.UsageLocation -eq 'United States'} | Sort-Object WhenChanged | Ft DisplayName, WhenCreated, WhenChangedEste ejemplo expone los elementos recuperables almacenados en todos los buzones ubicados en los Estados Unidos. Foreach-Object se utiliza para convertir el GUID del buzón en un nombre para mostrar para una mejor legibilidad de la salida:
Get-EXOMailbox -Properties UsageLocation | Where {$_.UsageLocation -eq 'United States'} | Get-ExOMailboxFolderStatistics -FolderScope RecoverableItems | Select-Object ContentMailboxGuid, FolderAndSubfolderSize, ItemsInFolderAndSubfolders | ForEach-Object { $Mailbox = $_.ContentMailboxGuid; $Name = (Get-ExOMailbox $Mailbox).DisplayName;$_.ContentMailboxGuid = $Name ; Return $_}Ejemplos del mundo real
Los bucles Foreach son otra forma en la que podemos utilizar la variable especial $_ para manipular datos.
Al recopilar datos de buzones de correo, una tarea común es revisar las direcciones de correo electrónico para asegurarse de que los datos de Exchange Online sean correctos. Por ejemplo, tal vez hubo conflictos de objetos o alias incorrectos cuando el objeto de usuario se sincronizó con Azure AD y la dirección de correo electrónico onmicrosoft.com del usuario final se creó incorrectamente o no como se esperaba. La inclusión de la propiedad EmailAddresses revela direcciones de correo electrónico proxy con prefijos de 'SIP:' o 'SMTP:' o 'smtp:'. Podemos usar $_ para eliminar el pretexto para revelar solo la dirección de correo electrónico:
Get-ExOMailbox | Select-Object DisplayName,RecipientTypeDetails,EmailAddresses | Foreach-Object { $EmailAddresses = $_.EmailAddresses;$TrimmedEmails = @();Foreach ($EmailAddress in $EmailAddresses) { $Email = $EmailAddress.split(':')[1]; $TrimmedEmails += $Email}; $_.EmailAddresses = $TrimmedEmails;Return $_}Con algunos cambios, podemos usar el código para crear listas para direcciones proxy SMTP, SIP y SharePoint Online:
Sólo SMTP
Get-ExOMailbox | Select-Object DisplayName, RecipientTypeDetails,EmailAddresses | Foreach-Object { $EmailAddresses = $_.EmailAddresses;$TrimmedEmails = @();Foreach ($EmailAddress in $EmailAddresses) { if ($EmailAddress -like 'smtp*') { $Email = $EmailAddress.split(':')[1]; $TrimmedEmails += $Email}}; $_.EmailAddresses = $TrimmedEmails;Return $_}Sólo SIP
Las direcciones SIP se utilizan para las comunicaciones de Teams, incluidos los teléfonos (Figura 2:)
Get-ExOMailbox | Select-Object DisplayName, RecipientTypeDetails,EmailAddresses | Foreach-Object { $EmailAddresses = $_.EmailAddresses;$TrimmedEmails = @();Foreach ($EmailAddress in $EmailAddresses) { if ($EmailAddress -like 'sip*') { $Email = $EmailAddress.split(':')[1]; $TrimmedEmails += $Email}}; $_.EmailAddresses = $TrimmedEmails;Return $_}Al final del formateo de datos, tenga en cuenta el uso de 'Return $_' que permite la devolución literal de los datos reformateados al objeto en la tubería. En nuestros ejemplos, devolvemos solo direcciones proxy formateadas en lugar de los valores contenidos en la propiedad EmailAddresses del objeto de buzón.
Exportar-CSV
Las canalizaciones de PowerShell pueden formatear la salida en un archivo para utilizarlo con fines de generación de informes. Por ejemplo, podemos crear una lista de todos los buzones inactivos de Estados Unidos, ordenados por la fecha del último cambio y la salida formateada:
Get-EXOMailbox -InactiveMailboxOnly -PropertySets All | Where UsageLocation -eq 'United States' | Sort-Object WhenChanged | Select-Object DisplayName,WhenCreated,WhenChanged | Export-CSV c:\reports\InactiveUSMailboxes.csv -NoTypeOut-GridView
También podemos canalizar la salida al cmdlet Out-GridView para ver los datos en una ventana emergente:
Get-EXOMailBox | Out-GridViewUna característica útil de Out-GridView es utilizar el modificador PassThru, que permite a un operador seleccionar valores y pasar solo aquellos a PowerShell para su posterior procesamiento mediante el siguiente cmdlet de la canalización.
Get-EXOMailbox | Out-GridView -PassThru | Get-EXOCasMailbox | Ft DisplayName,*EnabledAl hacer clic en Aceptar en el cuadro emergente, se pasan los buzones de correo seleccionados para que Get-EXOCasMailbox los procese y muestre en qué propiedades se permite conectarse a un buzón:
Conclusión
La canalización de PowerShell combina cmdlets singularmente útiles para procesar datos. Utilizado de manera inteligente, el canal es una excelente manera de procesar datos a través de una serie de pasos para automatizar operaciones administrativas comunes. Dominar la canalización, o al menos sentirse cómodo con la canalización de cmdlets, es una habilidad esencial para cualquiera que utilice PowerShell para administrar los inquilinos de Microsoft 365.





