Eliminar el contenido de los contactos en Exchange Online
Hace poco leí un articulo donde se indicaba como eliminar contactos en un Exchange 2007 y 2010 mediante un script de Powershell, pero no era compatible con Exchange Online.
Bien, pues después de darle varias vueltas, he conseguido hacerlo de tal forma que valga para Exchange Online mediante el uso de Powershell y EWS.
Lo primero indicar que como requisito, es primordial instalar la API de EWS, ya que sin eso no podremos trabajar con el script.
Voy comentando los trozos del script:
param([string]$EmailAddress,[string]$Username,[string]$EwsUrl,[string]$EWSManagedApiDLLFilePath);
$Password = cat C:\O365_Passw.txt
En esta cabecera indicamos la sintaxis que utilizara nuestro script: Buzon (E-Mail), Usuario, Ruta de EWS, Ruta de la API de EWS, y finalmente le indicamos que use como contraseña la que este almacenada en el txt indicado (c:\O365-Passw.txt). Este archivo solamente debe contener la contraseña deseada. (es solo una vuelta que le he dado al código con la finalidad de que si programamos la tarea, no aparezca en los valores de la misma).
# Comprobar E-Mail
if (!$EmailAddress) { throw «El parametro E-Mail debe especificarse»; } if (!$EmailAddress.Contains(«@»)) { throw «El parametro E-Mail no parece ser valido»; }# Comprobar si la API de EWS esta presente
if (!$EWSManagedApiDLLFilePath) { $EWSManagedApiDLLFilePath = «C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll» }
if (!(Get-Item -Path $EWSManagedApiDLLFilePath -ErrorAction SilentlyContinue)) {
throw «No se ha encontrado la API de EWS en $($EWSManagedApiDLLFilePath). Descargala desde http://www.microsoft.com/download/en/details.aspx?id=28952«; }
Comprobamos que se haya introducido una dirección de E-Mail valida en la sintaxis y que la API de EWS esta instalada, de lo contrario nos indicara que debemos descargarla e instalarla.
# Cargar la API de EWS
[void][Reflection.Assembly]::LoadFile(«C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll»);# Crear objeto de servicio
if ($Exchange2007) { $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1) }
else { $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1) }# Establecer credenciales si se han especificado o usar el usuario actual
if ($Username -and $Password) {
if ($Domain) { $service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials($Username,$Password,$Domain); }
else {
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials($Username,$Password); } }
else { $service.UseDefaultCredentials = $true; }# Establecer URL de EWS si se ha especificado, o usar autodiscover de lo contrario.
if ($EwsUrl) {
$service.URL = New-Object Uri($EwsUrl); }
else {
try { $service.AutodiscoverUrl($EmailAddress); } catch { throw; } }
Cargamos la API de EWS, detectamos la versión de Exchange del servidor, utilizamos credenciales suministradas o utilizamos el usuario actual, y establecemos la URL de EWS. Esta URL no es otra mas que la del servidor de Exchange/ews/Exchange.asmx (p.ej: https://amsprd0610.outlook.com/ews/Exchange.asmx)
# Efectuar una prueba – obtener la carpeta de contactos predeterminada.
if ($Impersonate) {
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $EmailAddress); } try { $ContactsFolder = [Microsoft.Exchange.WebServices.Data.ContactsFolder]::Bind($service, [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Contacts); } catch { throw; }
Establecemos un vinculo con la carpeta de contactos y hacemos el enlace.
$ContactsFolder.Empty([Microsoft.Exchange.WebServices.Data.DeleteMode]::MoveToDeletedItems, $true);
Procedemos a eliminar el contenido enviándolo a la carpeta de elementos eliminados. En este ultimo comando, podemos especificar varias opciones dentro del código:
- MoveToDeletedItems: los enviara a la carpeta de elementos eliminados.
- HardDelete: los eliminara directamente sin dejar copia en ningún sitio.
- SoftDelete: los eliminara, pero únicamente se podrán recuperar a través de «recuperar elementos eliminados» en nuestro Outlook.
Una vez explicado el script, podeis descargarlo de AQUI. Su forma de ejecución será algo como esto:
./delete_contacts.ps1 -EmailAddress usuario@dominio.com -Username usuario@dominio.com -EwsUrl https://servidor_exchange/EWS/Exchange.asmx
Hasta otra!