Guía práctica: cómo diseñar búsquedas altamente efectivas en Microsoft 365 eDiscovery (con PowerShell)
Cuando llega una campaña de phishing o spam masivo a tu organización, el reloj empieza a correr. No basta con que “más o menos” encuentres los correos: necesitas una búsqueda quirúrgica, lo suficientemente precisa como para:
- No dejar fuera instancias del correo malicioso (evitar falsos negativos).
- No tocar mensajes legítimos (evitar falsos positivos), sobre todo cuando vas a usar un Purge masivo.
En esta guía te muestro, paso a paso, cómo:
- Conectarte a Microsoft 365 Compliance/Purview desde PowerShell.
- Diseñar una consulta KQL (
ContentMatchQuery) altamente precisa. - Ejecutar la búsqueda con
New-ComplianceSearchdesde PowerShell.
1. Requisitos previos: permisos y contexto
Antes de empezar, asegúrate de tener:
- Una cuenta con rol adecuado en el portal de Compliance:
- Compliance Administrator, eDiscovery Manager o equivalente.
- Acceso a PowerShell en tu equipo (Windows PowerShell o PowerShell 7).
- Conectividad hacia Microsoft 365 (sin bloqueos de firewall.
Todo lo que vamos a hacer está pensado para trabajar con:
- Content Search / eDiscovery / Purview en Microsoft 365.
- Correos almacenados en Exchange Online.
2. Instalar e importar el módulo de PowerShell
El módulo que necesitamos es ExchangeOnlineManagement, que incluye Connect-IPPSSession y los cmdlets de Compliance.
2.1. Instalar el módulo (una sola vez)
Abre PowerShell y ejecuta:
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser
Si te pregunta por la confianza en el repositorio PSGallery, responde Y.
2.2. Importar el módulo (cada vez que abras PowerShell)
En cada nueva sesión, importa el módulo:
Import-Module ExchangeOnlineManagement
Puedes validar que está cargado con:
Get-Module ExchangeOnlineManagement
3. Cómo conectarse al portal de Compliance/Purview
Para poder usar New-ComplianceSearch, debemos conectarnos al endpoint de Compliance usando Connect-IPPSSession.
3.1. Conexión básica con usuario específico
Connect-IPPSSession -UserPrincipalName tu_usuario@tu_dominio.com
- Sustituye
tu_usuario@tu_dominio.compor tu UPN de administrador o cuenta con permisos de eDiscovery. - Se abrirá la ventana de inicio de sesión de Microsoft 365 (con MFA si está habilitado).
3.2. Conexión pidiendo credenciales en ventana
Si prefieres que te pida el usuario directamente en una ventana de login:
Connect-IPPSSession
Una vez conectado, puedes validar que tienes los cmdlets disponibles:
Get-Command *-ComplianceSearch
Deberías ver, entre otros:
New-ComplianceSearchStart-ComplianceSearchGet-ComplianceSearch
4. Diseñando una búsqueda altamente efectiva: la huella del correo
El corazón de todo es la query KQL que va en -ContentMatchQuery. La idea es crear una huella (fingerprint) del correo malicioso combinando varias propiedades:
- kind: tipo de elemento (correo, reunión, archivo, etc.).
- from: remitente exacto.
- subject: asunto con IDs o cadenas únicas.
- body: tokens largos y poco probables (URLs, IDs, hashes).
- received: fecha o rango de fechas.
Un ejemplo de huella muy precisa para un correo malicioso podría ser:
(kind:email)
AND (from:"bad.sender@malicious-domain.com")
AND (subject:"[ID] 5f9d1c44bfe24e5b9d01a81a")
AND (body:"tZEqcO6opzIqGtbiruXsBFttr6l7a9gdi3Ks")
AND (received:2025-11-27)
Qué aporta cada parte:
- kind:email: limita la búsqueda a correos electrónicos.
- from: obliga a que el correo provenga de un remitente muy concreto.
- subject: usa un ID/hash específico dentro del asunto, muy difícil de encontrar en un correo legítimo.
- body: usa un token largo del cuerpo (por ejemplo parte de una URL de Zoom/Teams o tracking ID), casi imposible de repetir.
- received: restringe a los mensajes recibidos en una fecha concreta o rango corto.
El objetivo es conseguir una búsqueda que produzca cero falsos positivos antes de usarla en un purge.
5. Armando la consulta KQL en una variable de PowerShell
En PowerShell es mucho más limpio guardar la consulta en una variable y reutilizarla.
Ejemplo de construcción de la query (adáptala a tu escenario concreto):
$KqlQuery = '(kind:email) AND (from:"bad.sender@malicious-domain.com") AND (subject:"[ID] 5f9d1c44bfe24e5b9d01a81a") AND (body:"tZEqcO6opzIqGtbiruXsBFttr6l7a9gdi3Ks") AND (received:2025-11-27)'
Observa que:
- La query completa va entre comillas simples en PowerShell, lo que evita problemas con las comillas dobles internas.
- Dentro de la query usamos comillas dobles para las propiedades KQL (
from:"...",subject:"...", etc.).
6. Ejecutar la búsqueda con New-ComplianceSearch (PowerShell)
Una vez conectados y con la query lista, podemos crear y lanzar la búsqueda desde PowerShell.
6.1. Crear la búsqueda
$KqlQuery = '(kind:email) AND (from:"bad.sender@malicious-domain.com") AND (subject:"[ID] 5f9d1c44bfe24e5b9d01a81a") AND (body:"tZEqcO6opzIqGtbiruXsBFttr6l7a9gdi3Ks") AND (received:2025-11-27)'
$Search = New-ComplianceSearch `
-Name "Busqueda Correo Malicioso 2025-11-27" `
-ExchangeLocation All `
-ContentMatchQuery $KqlQuery
Explicación rápida:
- -Name: nombre descriptivo de la búsqueda (aparecerá en el portal de Compliance).
- -ExchangeLocation All: ejecuta la búsqueda en todos los buzones de Exchange Online. Puedes limitarlo a ciertos usuarios si lo prefieres.
- -ContentMatchQuery: recibe la query KQL que definimos.
6.2. Iniciar la búsqueda
Crear la búsqueda no la ejecuta automáticamente; hay que iniciarla:
Start-ComplianceSearch -Identity $Search.Identity
Después de unos minutos (dependiendo del tamaño del tenant), puedes revisar el estado:
Get-ComplianceSearch -Identity $Search.Identity
7. Validar los resultados antes de cualquier purge
Antes de usar esta búsqueda en un proceso de eliminación (purge), valida manualmente que la query es tan precisa como crees.
- Ve al portal de Microsoft Purview / eDiscovery.
- Localiza la búsqueda con el nombre que usaste en
-Name. - Abre la búsqueda y utiliza la opción de Preview (vista previa) para revisar varios resultados:
- ¿Todos los mensajes corresponden al correo malicioso o a la misma campaña?
- ¿No aparecen correos legítimos (notificaciones reales de bancos, Zoom, proveedores, etc.)?
- Si ves falsos positivos, vuelve a PowerShell, refina
$KqlQuery(añadiendo otro token, ajustando fechas, especificando dominio, etc.) y repite el proceso.
Solo cuando estés 100 % seguro de que la búsqueda es quirúrgica deberías plantearte usarla en un purge masivo.
Importante: la ejecución de acciones de borrado (por ejemplo, New-ComplianceSearchAction -Purge) debe seguir tu proceso interno de aprobación y documentación. La idea de este artículo es que llegues con una búsqueda sólida y validada antes de tomar esa decisión.
8. Cerrar la sesión de PowerShell
Cuando termines de trabajar con Compliance y Exchange Online, es buena práctica cerrar las sesiones abiertas:
Disconnect-ExchangeOnline -Confirm:$false
Con esto limpias las conexiones de tu sesión de PowerShell.
9. Conclusión
Diseñar búsquedas “altamente efectivas” en Microsoft 365 eDiscovery no es escribir cualquier texto en el cuadro de búsqueda. Es construir una huella digital del correo malicioso combinando:
- Tipo de contenido (
kind). - Remitente (
from). - Asunto (
subject) con IDs o cadenas únicas. - Tokens largos del cuerpo (
body). - Ventanas de tiempo (
received).
Con esa huella bien diseñada, más una conexión correcta a Compliance desde PowerShell y el uso de New-ComplianceSearch, tendrás búsquedas potentes y precisas para analizar y erradicar campañas de correo malicioso sin poner en riesgo mensajes legítimos.
En un siguiente artículo puedes ampliar este enfoque con ejemplos concretos para phishing bancario, falsas notificaciones de Zoom/Teams y supuestas facturas electrónicas.

