Conexión remota con PowerShell a Exchange Server 2010/2013
¡Hola a todos!
Hoy hablaremos de PowerShell, conexiones remotas a Exchange, y cómo podemos automatizar estas conexiones para usar en scripts que no requieren intervención por parte del usuario. ¿Suena interesante? Pues sigamos adelante!
Primero veamos cómo podemos conectarnos con PowerShell a un sistema remoto. En este caso, vamos a conectar con un servidor Exchange ficticio llamado “mi.sitio.es”.
1 2 3 |
$UserCredential=get-credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://mi.sitio.es/PowerShell/ -Authentication basic -AllowRedirection -Credential $UserCredential -SessionOption $sessionOption Import-PSSession $Session |
Muy fácil, tres líneas de código, introducimos nuestras credenciales en un diálogo pop-up, y tenemos una shell conectada al servidor Exchange, para ejecutar comandos como Get-Mailbox o Get-DistributionGroup. Éste es el procedimiento estándar para conectar con Exchange, y se puede encontrar en miles de artículos por Internet. El problema, es que requiere una sesión interactiva, porque nos pide las credenciales en un diálogo.
Como esto es demasiado fácil, y en ocasiones molesto (especialmente la parte de escribir nuestras credenciales), vamos a escalar la dificultad, y automatizar el proceso para que no haga falta introducir las credenciales en una sesión interactiva. Esto se consigue creando un objeto del tipo PSCredential.
1 |
$credential= New-Object System.Management.Automation.PSCredential 'sitiocuenta','MiP4ssw0rdEsMuy.Segur0' |
Obviamente, esto nos plantea un dilema práctico. Por muy compleja y segura que sea la password de nuestra cuenta (MiP4ssw0rdEsMuy.Segur0), si la pegamos como texto plano en un script no va a servir de nada. Especialmente si más de una persona tiene acceso al lugar donde el script esté guardado.
Esto se puede solucionar guardando la contraseña en un contenedor especial llamado “SecureString”, que se cifra con nuestras credenciales de Windows. En la práctica, esto significa que, el script quedaría entonces ligado a nuestra cuenta en una máquina en concreto. Si cambiamos de máquina o de usuario, tenemos que generar una nueva representación del SecureString. Útil para maximizar la seguridad del despliegue de un script, aunque es importante tener en cuenta que la seguridad que ofrece no es de nivel militar, pero sí es lo suficientemente buena para el “usuario estándar”.
Ahora bien, ¿cómo podemos generar un SecureString para almacenar nuestra contraseña, de forma segura y fiable? Podemos usar una función como la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function Get-SecureString ([parameter(Position=0,mandatory=$false)][String]$string=""){ <# .SYNOPSIS Lee una contraseña desde teclado y la devuelve como un SecureString .DESCRIPTION Lee una contraseña desde teclado y la devuelve como un SecureString .NOTES #> if($string -eq ""){ return read-host -Prompt "Password" -AsSecureString | ConvertFrom-SecureString } else{ return $string | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString } } |
Nótese que esta función nos va a convertir cualquier cadena que le pasemos a un securestring, ya sea pasando el texto como un parámetro (mala idea), o leyendo el texto con el Read-Host –AsSecureString. Obviamente, podemos usar la función tal cual, “Copipegándola” en la shell, y ya podemos usarla con total normalidad.
El resultado final nos deja con un script de conexión tal como el siguiente:
1 2 3 4 |
$securepw='09fa0000a08c9ddf0115d1d18c7a00c04fc297eb010000007843d2d51f6d6d4d8e2da43ad7f4c31e0000010002000000000003660000c00000001000f000ffb07d96e1715b179ff236a35e65334c00ffff000480000000a000000010000000ff3fe574369f6b2095b7a339794a8bbf2000000056e13018c28e88cff1d62c6be4cd8228c9404a6f9c326916e5c654eafaec250e140000002c178891fb56c3f7d907bf76339bbb7cb0cc3673' | Convertto-securestring ; $credential= New-Object System.Management.Automation.PSCredential 'sitiocuenta',$securepw ; $session= New-PSSession -Authentication basic -Credential $credential -ConnectionUri 'https://mi.sitio.es/powershell' -ConfigurationName Microsoft.Exchange -AllowRedirection -SessionOption (New-PSSessionOption -SkipRevocationCheck); Import-PSSession $session; |
Estas tres líneas las podemos incluir en un script .ps1 de PowerShell, y a continuación usar todos los cmdlets de Exchange que necesitemos para nuestros propósitos.
¡Y eso es todo por el momento! Espero que esta técnica os sea provechosa para aumentar la productividad y, sobre todo, happy scripting!
0 thoughts on “Conexión remota con PowerShell a Exchange Server 2010/2013”