Cómo obtener permisos de buzón con PowerShell

¿Cómo realiza un seguimiento de los permisos de buzón en Exchange Online? Agregar nuevos permisos es fácil y rápido, pero a menudo se olvida eliminar los permisos obsoletos.

Para realizar un seguimiento, queremos obtener un informe con todos los permisos de la carpeta del buzón.

Los permisos de buzón pueden ser establecidos por el administrador de Exchange o por los propios usuarios.

Esto hace que administrar y hacer un seguimiento de los permisos sea un verdadero desafío.

Tendremos que recopilar los permisos de diferentes lugares y combinarlos en una descripción general clara.

Con la ayuda de PowerShell, podemos obtener fácilmente los permisos de la carpeta del buzón para cada usuario y generar un buen informe CSV a partir de él.

El siguiente script de PowerShell exporta los siguientes datos de los buzones de correo compartidos y de usuario a un archivo CSV:

  • Nombre para mostrar
  • Dirección de correo electrónico principal
  • Tipo de buzón
  • Leer y administrar permisos
  • Enviar como permisos
  • Enviar a behald
  • Permisos de la carpeta de la bandeja de entrada (nombre para mostrar y nivel de permiso)
  • Permisos de calendario (nombre para mostrar y nivel de permiso)
informe de permisos
Ejemplo de informe de permisos de buzón

Como siempre, primero te explicaré el guión y las diferentes opciones. Entonces entiendes cómo funciona el script.

Al final del artículo, encontrará un enlace al script en mi repositorio de GitHub.

Permisos de buzón

Antes de comenzar con la secuencia de comandos del informe, primero quiero explicarle de dónde provienen todos los diferentes permisos.

Porque para obtener una descripción completa de todos los permisos del buzón, necesitamos obtener los permisos de 4 lugares diferentes.

Tenemos los siguientes permisos que queremos enumerar:

  • Leer y administrar permisos
  • Enviar como permisos
  • Enviar en nombre de los permisos
  • Permisos de la carpeta de la bandeja de entrada
  • Permisos de carpeta de calendario
Centro de administración de Office 365

Los primeros 3 permisos se pueden configurar y ver fácilmente a través del Centro de administración de Microsoft 365, pero para los permisos de carpeta, deberá usar el obtener permisos de carpeta de buzón cmdlet en PowerShell.

Permisos de lectura y administración

Leer y administrar son básicamente permisos de acceso completo. Para ver todos los usuarios que tienen acceso al buzón necesitaremos usar el cmdlet Get-EXOMailboxPermissions. Queremos asegurarnos de no enumerar los permisos predeterminados del sistema, por lo que los filtramos.

Get-EXOMailboxPermission -Identity <userprincipalname>| where { -not ($_.User -match "NT AUTHORITY") -and ($_.IsInherited -eq $false)} | ft

Enviar como permisos

Para ver el permiso Enviar como en PowerShell, necesitaremos usar el cmdlet Get-EXORecipientPermissions. También aquí queremos filtrar los permisos predeterminados.

Get-EXORecipientPermission -Identity <userprincipalname> | where { -not ($_.Trustee -match "NT AUTHORITY") -and ($_.IsInherited -eq $false)} | ft

Enviar en nombre de los permisos

Los permisos de envío en nombre son parte del Get-EXOMailbox cmdlet. Tendrás que especificar la propiedad. GrantSendOnBehalfTo para ver los permisos

Get-EXOMailbox -Identity <userprincipalname> -Properties GrantSendOnBehalfTo | select UserPrincipalName, DisplayName, PrimarySMTPAddress, GrantSendOnBehalfTo, ForwardingSMTPAddress | ft

Obtener permisos de carpetas de buzones

Los últimos permisos que queremos enumerar en nuestro informe son los permisos de carpeta.

Estos son un poco complicados porque necesitaremos dar los nombres correctos de las carpetas.

Para la mayoría de ustedes, estos serán los nombres de carpeta predeterminados en inglés, como bandeja de entrada y calendario.

Pero en holandés, es por ejemplo «Postvak in» y «Agenda». Si no está seguro de cuáles son los nombres de carpeta correctos en su inquilino, enumere todas las carpetas de un solo buzón:

Get-EXOMailboxFolderStatistics -identity <userprincipalname> | ft
obtener permisos de calendario de buzón
Obtener carpetas de buzones

Si ha encontrado los nombres de carpeta correctos para su inquilino, podemos usar el siguiente cmdlet de PowerShell para obtener los permisos de la carpeta del buzón

$identity = <userprincipalname>
$folder = Inbox  # Or Calendar for example

Get-EXOMailboxFolderPermission -Identity "$($identity):\$($folder)" | where { -not ($_.User -match "Default") -and -not ($_.AccessRights -match "None")}

Entonces, como puede ver, para obtener todos los permisos del buzón, necesitaremos buscar en diferentes lugares y combinar todos los datos.

Cómo utilizar la secuencia de comandos de permisos del buzón

Obtener todos los permisos de buzón en un inquilino más grande puede llevar algún tiempo porque necesitamos obtener los permisos de 4 lugares diferentes.

Así que he agregado un par de parámetros a la secuencia de comandos para que pueda ajustar el informe a sus necesidades.

Para ejecutar el script, siempre deberá ingresar su dirección de correo electrónico para la autenticación con el
-adminUPN parámetro. Sin ningún otro parámetro, el script generará un informe con:

  • Todos los buzones (compartidos y de usuario)
  • Incluir permisos de bandeja de entrada y carpeta de calendario
  • Obtener nombres para mostrar para los permisos
  • Almacene el informe en la ubicación raíz del script ( .\mailboxsizereport-nov-30-2021.csv)
.\MailboxPermissionReport.ps1 -adminUPN [email protected]
Obtener permisos de buzón
Obtenga permisos de buzón con PowerShell

Como puede ver, la secuencia de comandos mostrará una barra de progreso basada en la cantidad de buzones que procesa.

Obtener permisos de buzón compartido

Hay un par de opciones cuando se trata de buzones compartidos. De forma predeterminada, se incluyen en el informe.

Pero también puede obtener solo los permisos de buzones compartidos o dejarlos fuera del informe de PowerShell con el parámetro -sharedMailboxes:

# Get only the shared mailboxes
.\MailboxPermissionReport.ps1 -adminUPN [email protected] -sharedMailboxes only

# Get only the user mailboxes
.\MailboxPermissionReport.ps1 -adminUPN [email protected] -sharedMailboxes no

# (Default) Get user and shared mailboxes
.\MailboxPermissionReport.ps1 -adminUPN [email protected] -sharedMailboxes include

Permisos de carpetas de buzones

De forma predeterminada, la secuencia de comandos mostrará una lista de todos los permisos de la carpeta del buzón.

Estos son los permisos que se aplican solo al calendario o la carpeta de la bandeja de entrada, por ejemplo.

Especialmente el calendario es una carpeta de buzón donde se aplican muchos permisos.

Pero como se mencionó, cada solicitud lleva más tiempo. Entonces, si no está interesado en los permisos de la carpeta del buzón, puede omitirlos con el parámetro -folderPermissions:

.\MailboxPermissionReport.ps1 -adminUPN [email protected] -folderPermissions:$false

Sin embargo, las columnas aún se enumeran en Excel, pero todas están vacías.

Obtener permisos para un solo usuario o una selección de usuarios

También puede solicitar solo los permisos de buzón de un solo buzón o una selección de buzones.

Esto le permite verificar solo el permiso de buzón de los buzones de gestión, por ejemplo:

.\MailboxPermissionReport.ps1 -adminUPN [email protected] -UserPrincipalName [email protected],[email protected],[email protected]om

Puede usar cualquiera de las siguientes opciones para el parámetro UserPrincipalName, siempre que el valor identifique de forma única el buzón:

  • ID de usuario o nombre principal de usuario (UPN)
  • Nombre
  • Alias
  • Nombre distinguido (DN)
  • Nombre de dominio \ usuario
  • Dirección de correo electrónico

Usar archivo CSV con usuarios

He agregado la opción de usar un archivo CSV con los usuarios de los que desea obtener los permisos del buzón.

De esta manera, puede obtener fácilmente los permisos de solo una selección de usuarios sin la necesidad de escribir todos los nombres principales de los usuarios en la línea de comando.

.\MailboxPermissionReport.ps1 -adminUPN [email protected] -csvFile "c:\temp\csvfile.csv"

Asegúrese de que el archivo CSV esté separado por comas, tenga encabezados y contenga un campo UserPrincipalName. Por ejemplo:

UserPrincipalName,Display Name
[email protected],Adele Vance
[email protected],Grady Archie
[email protected],Joni Sherman

Mostrar nombres para mostrar o no

Los diferentes cmdlets de permisos de buzón que usamos en la secuencia de comandos devuelven los nombres principales de usuario de los usuarios que tienen permisos.

Por ejemplo, si buscamos los permisos Enviar como, los usuarios que tienen que enviar como permisos se enumeran en la columna Trustee.

Obtener permisos de carpetas de buzones

Listado de todos los usuarios como [email protected] en su informe realmente no lo hace legible.

Entonces, de manera predeterminada, buscaremos el nombre para mostrar de cada usuario. Pero eso lleva un poco más de tiempo.

Si desea ejecutar el informe en un grupo grande de usuarios, es posible que desee deshabilitar esta función.

Lo que hace la secuencia de comandos es eliminar esa parte del dominio del nombre de usuario, por lo que solo obtiene GradyA en su informe, por ejemplo.

.\MailboxPermissionReport.ps1 -adminUPN [email protected] -displayNames:$false

Ruta de exportación CSV

También puede especificar la ubicación y el nombre de archivo del archivo de salida con el -path parámetro. De manera predeterminada, el archivo CSV se guardará en la ubicación raíz del script con el nombre MailboxPermissionReport-MM-dd-yyyy.csv

.\MailboxPermissionReport.ps1 -adminUPN [email protected] -path c:\temp\permission.csv

PowerShell Obtener secuencia de comandos de permisos de buzón

Para obtener los permisos del buzón con PowerShell, necesitaremos usar el módulo Exchange Online.

Vamos a usar el módulo Exchange Online v2 porque admite MFA y SSON.

De esta manera, solo tiene que ingresar su dirección de correo electrónico para conectarse a Exchange Online.

El script verificará si el módulo está instalado y le dará la opción de instalarlo cuando no esté disponible en su computadora.

También verificamos si hay conexiones existentes, para evitar múltiples conexiones desde la misma computadora.

Obtener los buzones

Entonces, la primera parte del script es obtener los buzones. Si el parámetro -userPrincipalName está configurado, luego obtendremos todos los buzones enumerados y los agregaremos a una matriz.

De lo contrario, obtendremos todos los buzones, incluidos los compartidos o no, según el -sharedMailboxes parámetro.

# Check which mailboxes to get
    if ($UserPrincipalName) {
      
      Write-Host "Collecting mailboxes" -ForegroundColor Cyan
      $mailboxes = @()

      # Get the requested mailboxes
      foreach ($user in $UserPrincipalName) {
        Write-Host "- Get mailbox $user" -ForegroundColor Cyan
        $mailboxes += Get-SingleUser -identity $user
      }
      
    }else{
      Write-Host "Collecting mailboxes" -ForegroundColor Cyan
      $mailboxes = Get-Mailboxes
    }

# Function Get-SingleUser gets mailbox based on identity
Get-EXOMailbox -Identity $identity -Properties GrantSendOnBehalfTo, ForwardingSMTPAddress | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, RecipientTypeDetails, GrantSendOnBehalfTo, ForwardingSMTPAddress

# Function Get-Mailboxes gets all mailboxes based on shared mailbox parameter
    switch ($sharedMailboxes)
    {
      "include" {$mailboxTypes = "UserMailbox,SharedMailbox"}
      "only" {$mailboxTypes = "SharedMailbox"}
      "no" {$mailboxTypes = "UserMailbox"}
    }

    Get-EXOMailbox -ResultSize unlimited -RecipientTypeDetails $mailboxTypes -Properties GrantSendOnBehalfTo, ForwardingSMTPAddress| 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, RecipientTypeDetails, GrantSendOnBehalfTo, ForwardingSMTPAddress

Recopilación de permisos

El siguiente paso es obtener permisos para cada buzón. Cada función buscará los permisos, utilizando las funciones descritas al principio y devolverá una matriz con los usuarios.

# Collect permissions for each mailbox
$mailboxes | ForEach {
     
   # Get Send on Behalf Permissions
   $sendOnbehalfUsers = Get-SendOnBehalf -mailbox $_
      
   # Get Fullaccess Permissions
   $fullAccessUsers = Get-FullAccessPermissions -identity $_.UserPrincipalName

   # Get Send as Permissions
   $sendAsUsers = Get-SendAsPermissions -identity $_.UserPrincipalName
}

Dependiendo del parámetro folderPermissions también obtendremos los permisos de la carpeta del buzón:

if ($folderPermissions.IsPresent) {
        
    # Get Inbox folder permission
    $inboxFolder = Get-FolderPermissions -identity $_.UserPrincipalName -folder $inboxFolderName
    $ib = $inboxFolder.users.Count

    # Get Calendar permissions
    $calendarFolder = Get-FolderPermissions -identity $_.UserPrincipalName -folder $calendarFolderName
    $ca = $calendarFolder.users.Count
}

Para los permisos de las carpetas, necesitamos saber los nombres correctos de las carpetas. Al comienzo del script, configuramos 2 variables con los nombres correctos:

$inboxFolderName = "inbox"  # Default "inbox"
$calendarFolderName = "calendar"  # Default "calendar"

Creación de la exportación CSV

Para la exportación CSV, quería enumerar cada usuario que tiene permiso para un buzón en su propia fila, con la sangría correcta. Entonces, para hacer esto, necesitamos saber cuántas filas secundarias vamos a agregar y qué matriz con permisos es la más larga.

Así que contamos cada matriz y luego usamos una función simple if-else para averiguar cuál es más grande.

# Count number or records
$sob = $sendOnbehalfUsers.Count
$fa = $fullAccessUsers.Count
$sa = $sendAsUsers.Count

# $ib and $ca are set in the folder permissions
$mostRecords = Find-LargestValue -sob $sob -fa $fa -sa $sa -ib $ib -ca $ca

# Find Largest Values function:
Function Find-LargestValue {
  <#
    .SYNOPSIS
        Find the value with the most records
  #>
  param(
    [Parameter(Mandatory = $true)]$sob,
    [Parameter(Mandatory = $true)]$fa,
    [Parameter(Mandatory = $true)]$sa,
    [Parameter(Mandatory = $true)]$ib,
    [Parameter(Mandatory = $true)]$ca
  )

  if ($sob -gt $fa -and $sob -gt $sa -and $sob -gt $ib -and $sob -gt $ca) {return $sob}
  elseif ($fa -gt $sa -and $fa -gt $ib -and $fa -gt $ca) {return $fa}
  elseif ($sa -gt $ib -and $sa -gt $ca) {return $sa}
  elseif ($ib -gt $ca) {return $ib}
  else {return $ca}
}

Si sabemos cuántos subregistros necesitamos crear, podemos recorrerlos con un ciclo do-while y crear un PSCustomObject con todos los datos.

Do{
  if ($x -eq 0) {
      [pscustomobject]@{
        "Display Name" = $_.DisplayName
        "Emailaddress" = $_.PrimarySMTPAddress
        "Mailbox type" = $_.RecipientTypeDetails
        "Read and manage" = @($fullAccessUsers)[$x]
        "Send as" = @($sendAsUsers)[$x]
        "Send on behalf" = @($sendOnbehalfUsers)[$x]
        "Inbox folder" = @($inboxFolder.users)[$x]
        "Inbox folder Permission" = @($inboxFolder.permission)[$x]
        "Inbox folder Delegated" = @($inboxFolder.delegated)[$x]
        "Calendar" = @($calendarFolder.users)[$x]
        "Calendar Permission" = @($calendarFolder.permission)[$x]
        "Calendar Delegated" = @($calendarFolder.delegated)[$x]
      }
      $x++;
  }else{
      [pscustomobject]@{
        "Display Name" = ''
        "Emailaddress" = ''
        "Mailbox type" = ''
        "Read and manage" = @($fullAccessUsers)[$x]
        "Send as" = @($sendAsUsers)[$x]
        "Send on behalf" = @($sendOnbehalfUsers)[$x]
        "Inbox folder" = @($inboxFolder.users)[$x]
        "Inbox folder Permission" = @($inboxFolder.permission)[$x]
        "Inbox folder Delegated" = @($inboxFolder.delegated)[$x]
        "Calendar" = @($calendarFolder.users)[$x]
        "Calendar Permission" = @($calendarFolder.permission)[$x]
        "Calendar Delegated" = @($calendarFolder.delegated)[$x]
      }
      $x++;
  }

  $currentUser = $_.DisplayName
  if ($mailboxes.Count -gt 1) {
    Write-Progress -Activity "Collecting mailbox permissions" -Status "Current Count: $i" -PercentComplete (($i / $mailboxes.Count) * 100) -CurrentOperation "Processing mailbox: $currentUser"
  }
}
while($x -ne $mostRecords)

Descargue el script completo de permisos de buzón

Puedes descargar el script completo aquí desde mi página de GitHub. De esta forma siempre tendrás la última versión del script.

Siempre pruebe el script primero con un pequeño grupo de usuarios, usando el -UserPrincipalName parámetro.

Si desea saber cómo puede ejecutar un script de PowerShell, asegúrese de leer este artículo.

Terminando

Para ejecutar el script fácilmente desde la línea de comandos, también puede agregar el script (o la carpeta) a su perfil de PowerShell. Lea todo sobre esto en este artículo.

Espero que haya encontrado útil este script, si tiene alguna pregunta, simplemente deje un comentario a continuación.

También le puede gustar uno de los siguientes scripts de informes de PowerShell:

Otros artículos relacionados

Cómo arreglar ERR_CONNECTION_TIMED_OUT

Cómo arreglar ERR_CONNECTION_TIMED_OUT

El error ERR_CONNECTION_TIMED_OUT en Chrome o Edge indica que el sitio web que intenta visitar no respondió. Entonces, para resolver ...
Leer Más
15 mejores libros de tecnología sobre TI para leer

15 mejores libros de tecnología sobre TI para leer

Me encanta leer libros, la mayoría de las veces son thrillers tecnológicos o políticos, pero también me gusta leer libros ...
Leer Más
Restaurar Papelera de reciclaje SharePoint Online con PowerShell

Restaurar Papelera de reciclaje SharePoint Online con PowerShell

Uno de mis usuarios eliminó una biblioteca de documentos completa que contenía más de 12000 elementos. Sincronizó la carpeta con ...
Leer Más
Migrar las unidades de inicio de los usuarios a OneDrive para empresas con PowerShel

Migrar las unidades de inicio de los usuarios a OneDrive para empresas con PowerShel

Tenemos Office 365 desde hace casi 3 años y una de las cosas en mi lista de tareas pendientes era ...
Leer Más
Power Automate - Editor de expresiones y actualización de contenido dinámico

Power Automate – Editor de expresiones y actualización de contenido dinámico

Una de las cosas más molestas de Power Automate, el antiguo Microsoft Flow, es el editor de expresiones pequeño y ...
Leer Más
Visor de claves de producto de Windows: métodos sencillos y gratuitos

Visor de claves de producto de Windows: métodos sencillos y gratuitos

Si compró una computadora o computadora portátil nueva con Windows ya instalado, es posible que haya notado que no recibió ...
Leer Más

Deja un comentario