Introducción a PowerShell

Presentación del producto

PowerShell es más que una nueva shell, se trata de un cambio de mentalidad a la hora de concebir y diseñar el software de Microsoft. Hasta la fecha en que apareció, las aplicaciones realizaban sus tareas mediante una colección de ejecutables y presentaban una serie de APIs. Así teníamos que algunas cosas se podían hacer sólo desde la mmc, otras desde línea de comandos (reparar una base de datos dañada de Exchange), otras tenían varias formas.

En general ésto perjudicaba la “Automation” (la administración automática y centralizada).

En un software PS compliant, si se puede hacer desde qualquier parte de la aplicación, entonces se puede hacer desde PS. Esto es porque PS pasa a ser el centro de la aplicación: ahora los GUI llaman a comandos PS para realizar las acciones que hemos clickado.

Productos PS de MS :

Productos PS no MS:

Productos MS no totalmente PS:

Por ahora, Windows PowerShell es un producto que se instala aparte del sistema, y en Windows7 y Windows 2008 viene incluido en el propio cd de instalación. Para Vista, XP y 2003 se descarga de la web de microsoft.

Más que un shell

A diferencia de otros shell como cmd.exe o bash que lanzan un comando de texto como un proceso y devuelven el resultado del comando como texto, PS manipula directamente los objetos de MS .NET Framework en el símbolo de sistema.

En windows 2008 se instala como característica (Agregar característica desde “Manage your Server”), y es compatible con los comandos tradicionales de cmd.exe.

En PS las acciones se realizan mediante “command-lets” que comunmente se abrevian como cmdlets. Su sintaxis es: <verbo>-<nombre>, por ejemplo:

Get-Service

Start-Service

Es muy importante entender que éstos cmdlets no transfieren comandos o parámetros a otras utilidades, sino que operan directamente sobre los objetos .NET de la aplicación.

Como en otras shells, los cmdlets se pueden encadenar:

Get-Service | Format-List

Si lo probáis veréis que esto devuelve más información que el propio Get-Service, algo que en un shell convencional es impensable. La razón en que GetService no devuelve una lista de texto con datos de los servicios, sino que devuelve una colección de objetos de tipo servicio. Así podemos mediante una pipe controlar qué mostramos de esos objetos:

Get-Service | Format-List -property *

Para obtener ayuda desde la propia consola PS:

get-help

get-help <cmdlet>

Variables

Las variables en PS empiezan por el símbolo $ y representan objetos. Aquí va un ejemplo para entenderlo mejor:

$objDNS=get-service DNS

$objDNS.status

Así, siempre se asigna una variable a un objeto.

Existe una variable especial denominada “de ensamblado”: $_ .Se usa para seleccionar los objetos uno por uno cuando se usan pipes. En el siguiente script listamos los servicios que están en estado “Running”:

Get-Service | Where-Object { $_.status -eq “Running”}

Alias

Al igual que en Bash, un alias es una forma alternativa para referirse a un cmdlet. Muchos de los cmdlets de PS ya vienen con algún alias definido. Por ejemplo el cmdlet que muestra el contenido de una carpeta en un disco es Get-ChildItem. Este cmdlet tiene dos alias: dir y ls. Para determinar el cmdlet que hay tras un alias escribimo alias <alias>:

alias dir   -> devuelve Get-ChildItem

Si probamos a ejecutar: dir /s (para listar el contenido de las subcarpetas) vemos que devuelve un error porque el cmdlet al que apunta no admite ese parámetro. Sin embargo

dir -recurse

funciona de maravilla cuando en un cmd.exe devolvería error.

Espacios de nombres, proveedores y PSDrives

Como en PS todo son Objetos, los cmdlets operan contra los objetos en un espacio de nombres, y aunque algunos espacios de nombres vienen por defecto otros hay que crearlos mediante proveedores de un espacio de nombres para un servicio concreto.

Estos espacios de nombres se representan como PSDrives y se accede a ellos como a una unidad convencional. Uno de los PSDrives que viene por defecto es que permite el acceso al registro de windows como si se tratase de un sistema de ficheros más. Para ir a la sección del registro de HKey Local Machine y listar su contenido:

cd hklm:\s

ls

Para mostrar los PSDrives montados: Get-Psdrives

Creación de usuarios con en AD con PS:

Los pasos siempre serán los mismos:

1.  Conectarse al contenedor de AD en que crearemos el usuario:

$objOU=[ADSI] “LDAP://OU=Alumnes,CN=lasalle,CN=local”

2. Invocar el método Create del objeto OU para crear el usuario que recogemos en una variable:

$objUser=$objOU.Create (“user”,”CN=Vicente Iranzo”)

3. Rellenar los campos del objeto con el método Put:

$objUser.Put (“sAMAccountName”,”viranzo”)

4. Ejecutar los cambios en AD:

$objUser.SetInfo