materials

PowerShell

Introducción a PowerShell

Es el sustituto de la antigua consola CMD y está basado en objetos por lo que en lugar de procesar texto como la mayoría de intérpretes de comandos procesa objetos. A sus comandos se les llama cmdlets y están formados por un verbo (Get, Set, Remove, …) y un nombre de objeto sobre el que realizar la acción (Location, Item, Content, Process, Service, …) separados por un -.

Por ejemplo, para cambiar al directorio Windows el comando es cd C:\Windows y su cmdlet correspondiente es

Set-Location C:\Windows

donde:

Y para saber en qué directorio estamos deberíamos ejecutar Get-Location.

La salida de un cmdlet es también un objeto por lo que podemos encadenar varios cmdlets, formatear la salida, aplicar filtros, …

Algunos comandos útiles para todo esto son:

Ejemplo:

Get-Process | Where-Object {$_.Id -gt 500 -and $_.Id -lt 1000 } | Sort-Object -Property Id | Format-Table -Property *

El operador | permite encadenar varios comandos de forma que la salida del comando que hay antes del operador constituirá la entrada para el comando que hay tras él. Se utiliza tanto en PS como en la consola clásica y en las diferentes terminales de GNU/Linux. Lo veremos con más detalle en el apartado de redireccionamiento de comandos.

Los cmdlets normalmente tienen alias tanto para poder seguir usando los comandos clásicos como para no escribir tanto. Por ejemplo Get-ChildItem tiene como alias dir, ls y gci. Podemos ver todos los alias de un comando con Get-Alias. Ejemplo:

Get-Alias -Definition Get-ChildItem

Obtener ayuda

Normalmente para ejecutar un comando ponemos uno o más parámetros para que el comando haga exactamente lo que queremos. Esto hace que en ocasiones sea compleja la forma de utilizar un comando y muchas veces tenemos que ir a la ayuda para hacer lo que queremos.

Para obtener la ayuda de un comando ejecutaremos el cmdlet

Get-Help <NombreDelCmdlet>

Help COPY

Si ponemos Get-Help <NombreDelCmdlet> -full muestra información detallada de cada opción del comando así como ejemplos de uso.

Si sólo queremos ver ejemplos de su uso pondremos Get-Help <NombreDelCmdlet> -examples.

La primera vez nos pedirá que actualicemos la ayuda con el cmdlet Update-Help ya que no se instala por defecto (hay que hacerlo desde una consola de Administrador). Este cmdlet tiene como alias help y man.

El cmdlet para obtener la lista de comandos es Get-Command.

PowerShell ISE

PowerShell incluye un entorno para probar comandos llamado ISE (Interactive Script Environment) que nos permite ver gráficamente los parámetros de un comando lo que puede ser útil cuando no los recordamos.

PowerSell ISE

En este caso se quería listar los ficheros del directorio actual cuyo nombre empieza por ‘ntuser’ aunque estén ocultos. Se selecciona el comando a usar, se marcan los parámetros en el panel de la derecha y se pulsa ‘Ejecutar’ y el entorno escribe por nosotros el comando con sus parámetros correctos.

Sintaxis de los comandos de la consola

Normalmente para ejecutar un comando ponemos uno o más parámetros para que el comando haga exactamente lo que queremos. Esto hace que en ocasiones sea compleja la forma de utilizar un comando y muchas veces tenemos que ir a la ayuda para hacer lo que queremos.

Help Copy-Item

La información que nos proporciona la ayuda es la siguiente:

Cómo podemos ver, los parámetros que modifican el comportamiento de un comando en la consola de Windows son una letra precedida del carácter -. Podemos poner tantos parámetros como necesitemos para un comando.

Comandos para trabajar con Directorios y Ficheros

Cambiar de directorio

Set-Location (equivale a cd)

Cambia el directorio actual por el que le pasamos como parámetro. El cmdlet para mostrar el directorio actual es Get-Location.

Ejemplos:

Ver el contenido de un directorio

Get-ChildItem (equivale a dir)

Lista el contenido del directorio pasado como parámetro. Si no le pasamos ningún parámetro muestra el contenido del directorio actual.

Principales parámetros:

Ejemplos:

Crear un directorio o un fichero vacío

New-Item (en directorios equivale a mkdir)

Crea un nuevo directorio o fichero que le pasamos como parámetro. Ejemplos:

Borrar un directorio o fichero

Remove-Item (equivale a rmdir en directorios y del en ficheros)

Borra los directorios o ficheros pasados como parámetro. Si queremos borrar un directorio que no está vacío Remove-Item pedirá confirmación (a menos que se le añada el modificador -Recurse).

Ejemplos:

Copiar directorios y ficheros

Copy-Item (equivale a copy/xcopy)

Copia los ficheros o directorios indicados a una nueva ubicación. Si ya existe el fichero en el destino se produce un error. Principales parámetros y modificadores:

Ejemplos:

Mover directorios y archivos

Move-Item (equivale a move)

Funciona como el comando de copiar pero en vez de hacer una copia se mueven los ficheros o directorios de ubicación. Después copiar tendremos el fichero 2 veces: donde estaba y donde lo hemos copiado. Si lo movemos se borra de donde estaba y se sitúa donde lo copiamos.

Funciona también con directorios sn necesidad de poner modificador (sin -Recurse).

Renombrar directorios y ficheros

Rename-Item (equivale a rename)

Permite cambiar el nombre del fichero o directorio pasado como primer parámetro por el que le pasamos como segundo parámetro. Ejemplo:

También podemos cambiar el nombre a muchos ficheros a la vez:

No se puede cambiar el directorio donde se encuentra el fichero con este comando. Para ello hay que usar Move-Item que permite moverlo de lugar y además cambiar su nombre (si se lo especificamos en la ruta de destino)

Compartir un directorio

New-SMBShare

Permite compartir en la red un directorio existente con el protocolo SMB/CIFS. Ejemplo: New-SMBShare –Name Datos –Path "C:\Datos" –FullAccess "Admins. del dominio" -ReadAccess "Usuarios": comparte el directorio C:\Datos con el nombre Datos y le asigna permisos SMB de Control total al grupo Admins. del dominio y permisos de Leer al grupo Usuarios.

Descargar un fichero de internet

System.Net.WebClient.DownloadFile

El objeto System.Net.WebClient proporciona métodos comunes para enviar y recibir datos de un recurso identificado por un identificador URI. La forma de hacerlo es:

$webClient = New-Object System.Net.WebClient
$webClient.DownloadFile("http://www.xyz.com/path/file.txt","C:\path\file.txt")

Si se necesita autenticación en el servidor web, antes de descargar el fichero ejecutaremos $webClient.Credentials = Get-Credential para que nos pidan las credenciales.

Comandos para trabajar con el contenido de un fichero

Existen muchas formas en Powershell de mostrar, filtrar y ordenar el contenido de un fichero. La más sencilla es usar el cmdlet Get-Content para mostrarlo y luego usar Where-Object, Sort-Object, etc. para filtrarlo, ordenarlo, etc ya que estos comandos (como todos) trabajan sobre objetos y funcionan tanto sobre ficheros como sobre las líneas de un fichero.

Ejemplo:

Si se trata de un fichero de texto delimitado por un carácter (CSV) podemos convertirlo en un objeto con sus campos como propiedades con el comando Import-Csv. Una vez convertido en objeto podemos filtrar por campo, ordenar por campo, mostrar sólo algunos campos y cualquier otra cosa que se nos ocurra.

Ejemplos:

Comandos para gestionar la red

Comandos para gestionar discos

Comandos para gestionar procesos y servicios

Para ver los procesos del sistema usamos el cmdlet Get-Process. Ejemplos:

Si queremos detener procesos el cmdlet que se usa es Stop-Process. Ejemplos:

Para iniciar un proceso se usa Start-Process. Ejemplo:

También podemos gestionar los servicios de Windows con los comandos:

Ejemplos:

Comandos para gestionar usuarios

Para trabajar con los usuarios tenemos comandos ...-Local... para trabajar con usuarios locales y ...-AD... para trabajar con usuarios de Active Directory. Si no nos aparecen los comandos de active Directory debemos instalar ese módulo para Powershell.

Los comandos más habituales son:

El nombre de un usuario puede contener hasta 20 caracteres. La contraseña puede contener hasta 127 caracteres.

Ejemplos:

NOTA: para especificar el nombre de usuario se pone el parámetro -Name o no se pone nada. Para especificar el nombre completo con New-LocalUser el parámetro es -FullName y en New-ADUser es -DisplayName y además permite indicar nombre y apellidos con -GivenName y -SurName respectivamente.

Un parámetro muy útil de New-ADUser es -Instance que permite copiar de otro usuario una serie de opciones configuradas en el mismo. Por ejemplo podemos crear una plantilla para cada tipo de usuario donde indiquemos cosas como oficina, departamento, horas de inicio de sesión, etc. Después, para crear un nuevo usuario basado en dicha plantilla haremos:

$plantilla1rAsix = Get-ADUser -Identity plantilla1rAsix -Properties Office,Department,LogonHours

New-ADUser "jsegura" -Path OU=1rCurs,OU=ASIX,DC=BATOI,DC=LAN -DisplayName "Juan Segura" -GivenName "Juan" -Surname "Segura" -AccountPassword (ConvertTo-SecureString 12345678 -AsPlainText -force) -OfficePhone "666 12 34 56" -ChangePasswordAtLogon $true -Enabled $true -Instance $plantilla1rAsix

El nuevo usuario jsegura obtendrá los campos Office, Department y LogonHours del usuario plantilla1rAsix.

Comandos para gestionar grupos

Ejemplos:

Otros comandos útiles

Instalar comandos de ActiveDirectory en PowerShell

Si no nos aparecen los comandos de PowerShell en la máquina debemos instalar ese módulo. En el controlador del dominio ya estará instalado por defecto pero no lo estará en otros servidores miembro ni en los clientes.

Para instalarlo en un Windows Server, si lo tenemos disponible basta con ejecutar:

Import-Module -Name ActiveDirectory

Si no está disponible podemos instalarlo con:

Install-WindowsFeature -Name RSAT-AD-PowerShell -IncludeAllSubFeature

Para instalarlo en el cliente podemos ejecutar:

Get-WindowsCapability -Name RSAT.ActiveDirectory* -Online | Add-WindowsCapability -Online

Saber más

En Internet hay infinidad de páginas y tutoriales sobre Powershell.

En la web de Microsoft encontramos recursos para aprender Powershell.

Para aprender scripts hay multitud de enlaces como el libro Scripts en PowerShell: Guia para principiantes de SomeBooks.

También hay gran cantidad de cursos disponibles, como el de Automatización de tareas administrativas mediante PowerShell de Microsoft.