Empezando con el scripting
Ya sabes como empieza todo; con un problema. Puedes resolverlo a mano. Quizás ya lo has hecho alguna vez. Pero es tedioso y muy costoso en tiempo. Sabes que hay una maneja mejor, más eficaz. Abres la consola de PowerShell, enlazas un par de cmdlets mediante un pipe y ¡listo!
Probablemente tengas unos cuantos de estos comandos enlazados - one-liners - guardados en el disco duro, en uno o varios ficheros de texto que reutilizas de vez en cuando, cambiando los valores hardcodeados en los cmdlets.
El objetivo de este libro es pasar de esos cmdlets que te solucionan la papeleta a escribir potentes scripts reutilizables que facilitan tu trabajo diario.
Así pasarás de ser alguien que resuelve problemas a ser quien crea las herramientas que transforman la manera de trabajar.
PowerShell v3 funciona en Window 7 SP1, Server 2008 SP2 o Server 2008 R2 SP1, Windows 8 y Windows 2012. PowerShell v3 requiere .Net 4.0.
Para empezar, recuerda siempre ejecutar Powershell como administrador.
Seguridad en PowerShell
PowerShell se ha diseñado para ser seguro, a diferencia de otros lenguajes de scripting como Visual Basic Script (vbs).
Al hacer doble click sobre un script PowerShell, no se ejecuta, si no que el script se abre con el editor de texto por defecto del sistema. De esta forma nadie puede ejecutar un script por error. Los ficheros ps1, por tanto, están asociados por defecto con Notepad.
Incluso si intentas ejecutar el script desde la línea de comandos -para evitar que alguien instale un script que suplante un comando de sistema, por ejemplo- hay que indicar la ruta completa al script (incluso cuando se ejecuta desde la misma carpeta del sistema).
Aún así, la política de ejecución de scripts en el sistema impide que los scripts se ejecuten; es necesario modificar la política de ejecución para permitir la ejecución de scripts PowerShell.
En Windows 2012 WinRM viene activado por defecto, ya que el objetivo es ser capaces de gestionar grandes cantidades de servidores con el menor esfuerzo posible.
Políticas de ejecución de scripts en PowerShell
En Windows 2012 R2 la política de ejecución por defecto es RemoteSigned. Ahora veremos qué seignifica ésto y de qué otras opciones disponemos:
-
Unrestricted: PowerShell permite ejecutar cualquier script, independientemente del origen (es decir, permite ejecutar scripts descargados desde internet). Es una mala idea establecer la política de ejecución de scripts comoUnrestricted. -
AllSignedyRemoteSigned: En cualquier de estos dos casos, para poder ejecutar un script, debe haber sido firmado mediante un certificado digital que identifique a su autor.AllSignedobliga a que cualquier script que vaya a ejecutarse deba estar firmado por alguien en quien confiamos. En el caso deRemoteSignedsólo deben estar firmados aquellos scripts descargados de internet; los scripts creados localmente se pueden ejecutar con normalidad.
En un entorno empresarial, podemos establecer la política de ejecución de scripts a través de políticas de dominio.
Para obtener el estado de la política de ejecución actual:
1 PS> Get-ExecutionPolicy
Para establecer la política de ejecución de scripts:
1 PS> Set-ExecutionPolicy RemoteSigned
Ejecutando scripts en PowerShell
Una vez hemos establecido la política de ejecución, creamos un script sencillo que obtiene el estado del servicio BITS (Background Intelligent Transfer Service) y lo guardamos como bits.ps1.
Si intentamos ejecutar bits.ps1, incluso desde la carpeta en la que se encuentra el script, PowerShell responde con un error, indicando que bits.ps1 no se reconoce como el nombre de un cmdlet válido.
Para poder ejecutarlo, debemos indicar la ruta completa al script o, si estamos en la misma carpeta donde se encuentra el script, debemos indicar .\bits.ps1 por seguridad.
PowerShell ISE
Cuando ejecutamos un script desde la línea de comandos, al finalizar la ejecución del mismo, las funciones, variables, etc se eliminan.
Para poder guardar las funciones que ejecutamos en la memoria -al menos, mientras la ventana de PowerShell siga abierta-, podemos usar el método del dot sourcing:
1 PS> . .\bits.ps1
Precediendo el nombre del script con un punto, las funciones definidas dentro del script dot sourceado estarán disponibles en la ventana de PowerShell y podrán ser utilizadas tanto desde la línea de comandos como en otros scripts que lancemos.
En general, usaremos Windows PowwerShell ISE para escribir y desarrollar los scripts, por lo que la técnica anterior, aunque es bueno conocerla, no debería ser usada frecuentemente.
Windows PowerShell ISE es un editor de texto especializado en PowerShell proporcionado por el equipo de desarrollo de PowerShell.
Es importante ejectuar Windows PowerShell ISE como administrador.
ISE muestra por defecto un panel lateral que permite explorar los cmdlets (puede mostrarse ejecutando Show-Commands en el panel de la consola). Al seleccionar un cmdlet se muestran los diferentes parámetros que acepta el cmdlet como un formulario, indicando aquellos parámetros que son obligatorios, el tipo de los parámetros, etc. Desde este panel podemos ejecutar el cmdlet en la cónsola o copiarlo al editor integrado en ISE.
ISE también cuenta con IntelliSense, que muestra ayudas para completar los nombres de cmdlets, parámetros, métodos, etc asociados al elemento que estamos escribiendo en cada momento.
Por supuesto, ISE también colorea el código para que sea más fácil detectar errores, proporcionando ayuda si dejamos paréntesis huérfanos y muchos otros detalles que facilitan enormemente el desarrollo de scripts.
La consola de ISE también proporciona IntelliSense, autocompletado, resaltado de sintaxis, copiar y pegar con Ctrl+C y Ctrl+V.
Quizás la configuración más adecuada sea la de tener el editor ocupando la pantalla completamente, con la consola oculta, ya que podemos cambiar entre la ventana de edición y la consola mediante Ctrl+R.
Mediante Ctrl+J ISE muestra snippets, trozos de código fuente para agilizar la creación de scripts (usándolos como plantillas). Otra funcionalidad interesante es la de poder ejecutar únicamente el texto seleccionado mediante F8 o todo el script con F5.
Desbloqueando scripts descargados de internet
La política de ejecución por defecto en Windows 2012 (y superior) es RemoteSigned, de manera que si descargamos un script de internet, no podremos ejecutarlo aunque lo revisemos y confiemos en que no contiene código malicioso, ya que la seguridad de PowerShell bloqueará su ejecución.
Tenemos dos opciones: establecer la política de ejecución de scripts como Unrestricted, que es una muy mala idea, o usar el cmdlet Unblock-File para deshacer el bloqueo del sistema (eliminando la marca de que el script ha sido descargado de internet).