Búsqueda de sitios web

Cómo buscar correos electrónicos con PowerShell


Un método excelente para buscar mensajes en los buzones de correo de Exchange Online es con PowerShell. Puede modificar los comandos a su gusto y obtener los resultados que necesita. Además, exportar los resultados a un archivo CSV es excelente, por lo que puedes filtrarlos allí. En este artículo, aprenderá cómo buscar correos electrónicos con PowerShell.

Instalar Microsoft Graph PowerShell

Ejecute Windows PowerShell como administrador e instale Microsoft Graph PowerShell.

Install-Module Microsoft.Graph -Force
Install-Module Microsoft.Graph.Beta -AllowClobber -Force

Importante: Instale siempre los módulos Microsoft Graph PowerShell y Microsoft Graph Beta PowerShell. Esto se debe a que algunos cmdlets aún no están disponibles en la versión final y no funcionarán. Actualice ambos módulos a la última versión antes de ejecutar un cmdlet o script para evitar errores y resultados incorrectos.

Configurar el registro de aplicaciones en Microsoft Entra

Antes de poder ejecutar los comandos o scripts, primero debe crear un registro de aplicación con los permisos correctos y un secreto de cliente para autenticarse con Microsoft Graph PowerShell.

1. Registrar nueva aplicación

Registre una nueva aplicación en Microsoft Entra ID:

  1. Inicie sesión en el centro de administración de Microsoft Entra
  2. Haga clic en Identidad > Aplicación > Registros de aplicaciones.
  3. Haga clic en Nuevo registro

  1. Nombra la aplicación Buscar-Mail
  2. Seleccione Cuentas solo en este directorio organizacional (solo EXOIP - Inquilino único)
  3. Haga clic en Registrarse

La aplicación Search-Mail se ha creado correctamente. Copie los valores siguientes y péguelos en el Bloc de notas, ya que los necesitará más adelante cuando se conecte a Microsoft Graph PowerShell.

  1. Copie el ID de la aplicación (cliente)
  2. Copie el ID del directorio (inquilino)

2. Asignar permisos de API

Asigne permisos API para la aplicación que registró en el paso anterior:

  1. Haga clic en permiso de API.
  2. Haga clic en Agregar un permiso

  1. Haga clic en API de Microsoft.
  2. Haga clic en Microsoft Graph

  1. Haga clic en Permisos de la aplicación.
  2. Busque Usuario.Leer.Todo
  3. Seleccione Usuarios > Usuario.Leer.Todo

  1. Busque Mail.Read
  2. Seleccione Correo > Correo.Leer
  3. Haga clic en Agregar permisos

Los permisos de API se agregaron correctamente. El siguiente paso es otorgar el consentimiento del administrador.

3. Otorgar consentimiento del administrador

Debe otorgar consentimiento de administrador para los permisos que seleccionó en el paso anterior:

  1. Haga clic en Otorgar consentimiento de administrador para EXOIP.
  2. Haga clic en Sí

  1. La marca de verificación verde muestra que otorgaste el consentimiento del administrador correctamente.

4. Crear secreto de cliente

Después de registrar una nueva aplicación en Microsoft Entra, asignar permisos de API y otorgar consentimiento de administrador, debe crear un secreto de cliente.

Para crear un secreto de cliente para su aplicación en Microsoft Entra ID, siga estos pasos:

  1. Haga clic en Certificados y secretos
  2. Haga clic en Secretos de cliente > Nuevo secreto de cliente.
  3. Escriba Descripción
  4. Seleccione una Fecha de vencimiento
  5. Haga clic en Agregar

Nota: La fecha de vencimiento del Secreto de Cliente tiene un máximo de 24 meses (2 años). Siempre puede renovar el secreto del cliente en Microsoft Entra ID con PowerShell.

  1. Copie el valor del secreto del cliente y guárdelo en el Bloc de notas.

Conéctese a Microsoft Graph PowerShell con Client Secret

Debe cambiar los valores de los parámetros siguientes para conectarse a MS Graph PowerShell con Client Secret:

  • Escriba el valor del ID del cliente de la aplicación en la línea 2.
  • Escriba el valor del ID de inquilino del directorio en la línea 3.
  • Escriba el valor del valor secreto del cliente en la línea 4.

Ejecute el siguiente script de PowerShell.

# Configuration
$ClientId = "c6787ff5-08ec-4e96-b4d2-1d1782303310"
$TenantId = "eb403171-a4ec-4d98-a08f-1876318c9deb"
$ClientSecret = "6_q8Q~X9e-fjwWhVVP_WWx~ua4JMI.BWkI7Q7b7B"

# Convert the client secret to a secure string
$ClientSecretPass = ConvertTo-SecureString -String $ClientSecret -AsPlainText -Force

# Create a credential object using the client ID and secure string
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ClientId, $ClientSecretPass

# Connect to Microsoft Graph with Client Secret
Connect-MgGraph -TenantId $tenantId -ClientSecretCredential $ClientSecretCredential

Buscar correos electrónicos de un usuario específico

Recibe todos los mensajes de un usuario específico.

$User = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Obtenga todos los mensajes de un usuario específico que se leen.

$User = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" -Filter "IsRead eq true" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Recibe todos los mensajes de un usuario específico que no están leídos.

$User = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" -Filter "IsRead eq false" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Buscar correos electrónicos por fecha

Busque correos electrónicos de un usuario específico después de una fecha específica.

$User = "Amanda.Morgan@exoip.com"
$Date = "2024-01-01"

Get-MgUserMessage -All -UserId "$User" -Filter "ReceivedDateTime gt $Date" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Buscar correos electrónicos sobre el tema

Busque correos electrónicos que comiencen con un asunto específico.

$Subject = "The subject"
$user = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$User" -Filter "startswith(Subject,'$Subject')" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView

Busque correos electrónicos que sean iguales al asunto.

$Subject = "The specific subject"
$user = "Amanda.Morgan@exoip.com"

Get-MgUserMessage -All -UserId "$user" -Filter "Subject eq '$Subject'" | 
Select-Object Subject, InternetMessageId, ReceivedDateTime, 
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } }, 
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } | 
Out-GridView

Buscar correos electrónicos de los últimos 30 días

Busquemos todos los correos electrónicos de la organización de los últimos 30 días, en el destinatario y en el remitente. Los resultados aparecerán en Out-GridView y se exportarán a un archivo CSV.

Busque todos los correos electrónicos de la organización de los últimos 30 días.

# Get all users
$users = Get-MgUser -All

# Create an empty array to store the data
$Data = @()

# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")

# Loop through each user
foreach ($user in $users) {
    # Ensure the user has an associated email address
    if ($user.Mail) {
        $messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
        foreach ($message in $messages) {
            $Data += [PSCustomObject]@{
                ReceivedDateTime  = $message.ReceivedDateTime
                Subject           = $message.Subject
                Sender            = $message.Sender.EmailAddress.Address -join ','
                Recipient         = $message.ToRecipients.EmailAddress.Address -join ','
                InternetMessageId = $message.InternetMessageId
            }
        }
    }
}

# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\All_emails.csv" -NoTypeInformation -Encoding utf8

Busque todos los correos electrónicos de la organización que se hayan enviado a un destinatario específico en los últimos 30 días.

# Email address of the recipient you want to filter
$recipientEmailAddress = "amanda.morgan@exoip.com"

# Get all users
$users = Get-MgUser -All

# Create an empty array to store the data
$Data = @()

# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")

# Loop through each user
foreach ($user in $users) {
    # Ensure the user has an associated email address
    if ($user.Mail) {
        $messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
        foreach ($message in $messages) {
            # Check if the recipient matches the desired email address
            if ($message.ToRecipients.EmailAddress.Address -eq $recipientEmailAddress) {
                $Data += [PSCustomObject]@{
                    ReceivedDateTime  = $message.ReceivedDateTime
                    Subject           = $message.Subject
                    Sender            = $message.Sender.EmailAddress.Address
                    Recipient         = $message.ToRecipients.EmailAddress.Address
                    InternetMessageId = $message.InternetMessageId
                }
            }
        }
    }
}

# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\Recipient_emails.csv" -NoTypeInformation -Encoding utf8

Busque todos los correos electrónicos de la organización que hayan sido enviados por un remitente específico en los últimos 30 días.

# Email address of the sender you want to filter
$senderEmailAddress = "john.doe@gmail.com"

# Get all users
$users = Get-MgUser -All

# Create an empty array to store the data
$Data = @()

# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")

# Loop through each user
foreach ($user in $users) {
    # Ensure the user has an associated email address
    if ($user.Mail) {
        $messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
        foreach ($message in $messages) {
            if ($message.Sender.EmailAddress.Address -eq $senderEmailAddress) {
                $Data += [PSCustomObject]@{
                    ReceivedDateTime  = $message.ReceivedDateTime
                    Subject           = $message.Subject
                    Sender            = $message.Sender.EmailAddress.Address
                    Recipient         = ($message.ToRecipients.EmailAddress.Address -join ',')
                    InternetMessageId = $message.InternetMessageId
                }
            }
        }
    }
}

# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\Sender_emails.csv" -NoTypeInformation -Encoding utf8

¡Eso es todo!

Leer más: Exportar registros de la aplicación Entra ID Informe de vencimiento de certificados y secretos »

Conclusión

Aprendiste a buscar correos electrónicos con PowerShell. Primero, configure una aplicación en Microsoft Entra con los permisos correctos. Después de eso, conéctese con Microsoft Graph PowerShell a la aplicación. Por último, ejecute los comandos para buscar correos electrónicos con PowerShell.

¿Disfrutaste este artículo? También te puede interesar Cómo bloquear el dominio de nivel superior (TLD) en Microsoft 365. No olvides seguirnos y compartir este artículo.

Artículos relacionados