PowerShell Utilities Series: DMCredential o cómo no escribir credenciales en PowerShell

Como administradores de sistemas que somos, si nos encontramos bajo Windows es evidente que PowerShell es una de nuestras más potentes y versátiles herramientas de trabajo. Gracias a sus capacidades de Remoting, con PowerShell podemos conectarnos a otros sistemas para llevar a cabo tareas de mantenimiento y administración en ellos. En mi día a día no es raro tener que entrar varias veces a Office 365, Exchange Online y controladores de dominio desde PowerShell. Sin embargo, esto requiere que nos autentiquemos.

Cualquier administrador de sistemas que use PowerShell estará más que familiarizado con esta línea de comando:

De forma que tendremos que escribir nuestro nombre de usuario y contraseña que se almacenará en la variable $cred, de tipo System.Management.Automation.PSCredential.

En este otro artículo Antonio ya nos contó que podemos automatizar el proceso de inicio de sesión en otra máquina a través de PowerShell, escritura de credenciales incluidas; ya que podemos almacenarlas cifradas en nuestro script. Si somos capaces de hacer esto en un script que conecta con Exchange, ¿no podríamos hacerlo también de forma más genérica y utilizarlo para conectarnos a cualquier sistema? David Moravec, escritor de la PowerShell Magazine llegó a conclusiones similares allá por 2012.

David creó un sencillo módulo que nos permite almacenar las credenciales que necesitemos en un archivo, estando estas perfectamente cifradas de igual forma que las de Antonio. El código del módulo puede verse á continuación:

Básicamente se compone de tres cmdlets:

  • New-DMCredential. Crea un nuevo archivo cifrado que contiene las credenciales que especifiquemos. Por defecto estas se almacenarán en $env:userprofile.
  • Get-DMCrednetial. Lee un archivo que contenga credenciales almacenadas con New-DMCredential y las carga en una variable global. Para que este cmdlet funcione correctamente la máquina sobre la que se ejecuta New-DMCredential y Get-DMCredential debe ser la misma.
  • Show-DMCredential. Muestra la contraseña cifrada contenida en un archivo en texto plano. De igual forma que Get-DMCredential, es necesario que las credenciales hayan sido almacenadas en la misma máquinas desde la que son leídas.

De esta forma, crear un nuevo archivo es tan sencillo como:

Este cmdlet nos pedirá que introduzcamos unas credenciales y acto seguido generará un nuevo archivo llamado o365cred que las contiene. Dichas credenciales pueden ser recuperadas así:

Esto creará la variable $global:o365cred y almacenará las credenciales en ella. Fijaos que el nombre del archivo y el de la variable coinciden y que el cmdlet en sí no devuelve nada salvo por el parámetro Alias. Como la variable es global, la tenemos disponible para usar en cualquier ventana o runspace del sistema.

Útil y sencillo de usar ¿verdad? Pero aquí no acaba la cosa. Viendo el bien trabajo que Moravec hizo, se me ocurrió darle una vuelta de tuerca más y hacer que esta variable con credenciales se cargase en memoria cada vez que hacía el simple gesto de abrir una consola de PowerShell, al igual que ya hacía con el módulo de ls a color.

Conseguir esto es una cuestión tan sencilla como agregar el contenido adecuado a nuestro archivo de $profile. A mí me bastó con estas líneas:

De esta forma cuando abra una ventana de PowerShell:

pscred

Mis credenciales se encontrarán automáticamente disponibles en la variable $global:pscred y no tendré que escribirlas. Ni que decir tiene que en este caso nuestro equipo debe bloquearse siempre (Windows + L) siempre que lo dejemos desatendido por razones obvias.

¡Happy Powershelling!

Enlace relacionado: #PSTip Storing of credentials

0 pensamientos en “PowerShell Utilities Series: DMCredential o cómo no escribir credenciales en PowerShell”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *