PowerShell: Ejemplos básicos ForEach

Ejercicios ForeEach en GitHub.

ForEach permite crear bucles que ejecutan una serie de rutinas de forma iterativa.

Sintaxis:

ForEach (item In collection) {ScriptBlock}

Recorre una colección de elementos y en cada iteración nos proporciona el siguiente elemento (item) de la colección (collection).

Representación en un diagrama de transición de estados:

Ejemplo básico

Fuente en GitHub.

Vamos a definir tres variables para crear un array de elementos y acceder a sus valores usando un bucle ForeEach.

Un array es una lista que contiene una serie de elementos, cada elemento del array no tiene porque ser del mismo tipo de datos.

La forma más sencilla de declarar un array es la siguiente:

$myArray = 1,"Hello",3.5,"World"

O usando la sintaxis explicita

$myArray = @(1,"Hello",3.5,"World")

Para crear un array de enteros por ejemplo:

$myArray = 1,2,3,4,5,6,7

O de forma más abreviada usando el operador de rango (…) sería lo mismo:

$myArray = (1..7)

Tenemos varias formas de obtener los valores del array.

$myArray

Retorna todos los elementos del array.

Para retornar un elemento en una posición concreta del array usamos su índice (la primera posición es 0).

$myArray[0]
$myArray[6]

Para obtener la dimensión o número de elementos del array:

$myArray.length

Siguiendo el ejemplo previo creamos un array (los elementos separados por “,”) y los recorremos extrayendo sus elementos.

Otro ejemplo de arrays y ForEach.

Ejemplo con una tubería (pipe)

Ejemplo.

Un pipe es una canalización de comandos, la salida con los resultados generada por Get-Service (obtiene la lista de servicios de una máquina) se pasa al comando ForEach.

 

 

Enlaces externos

Arrays

Pipe, tubería, canalización

 

 

 

 

 

Anuncios

PowerShell: Incluir usuario en una cuenta de seguridad

Fuente en GitHub.

Vamos a hacer un script que añade una cuenta introducida por el usuario (usuario de login de la cuenta o sAMAccountName) a un grupo de seguridad de AD (Active Directory).

Comprobar si la cuenta existe

Lo primero es comprobar si el nombre de la cuenta introducida por el usuario existe, para ello vamos a implementar una función que reciba como parámetro de entrada una cadena con el nombre de la cuenta y usando el cmdlet “Get-AdUser” lo compruebe retornando $true si existe o $false en caso contrario.

Para contar el número de objetos devueltos como resultado de Get-AdUser usamos la propiedad Count. El problema es cuando no retorna valores, para eso usamos la construcción @(…) para forzar que el resultado sea un array.

Añadir cuenta a grupo

Ahora vamos a implementar una función que reciba como parámetros el nombre de la cuenta y el nombre del grupo y usando el cmdlet Add-ADGroupMember  añada la cuenta de usuario a un grupo de seguridad.

Llamada la aplicación

En el cuerpo principal de script sólo realizamos una llamada a la función MainUsuarioAGrupoAD que contiene la lógica de la aplicación.

Enlaces externos

 

PowerShell: Captura errores try/catch/finally

Post relacionados:

Para controlar como responde nuestro script cuando se produce un error que finaliza la ejecución del mismo usamos los bloques try/catch/finally (si es un error que no finaliza la ejecución usamos $errorActionPreference).

En este ejemplo mostramos un mensaje de salida y continuamos con la ejecución del script:

El bloque finally se ejecuta siempre independientemente de que se produzca un error o no (por ejemplo si queremos guardar guardar una traza de ejecución en un fichero de log).

 

 

PowerShell: Control de errores (II)

Post relacionados:

Además de la salida de error se pueden generar otro tipo de salidas.

Salida Debug

Podemos usar el comando “Write-Debug” para mostrar este tipo de salida (o el método “WriteDebug()“).  PowerShell muestra esta salida en color amarillo normalmente.

Podemos configurar el comportamiento de “Write-Debug”  usando la variable de sistema “$DebugPreference“.

Por defecto “Write-Debug” no se muestran en consola. Usando “$DebugPreference” podemos darle los siguientes valores:

  • Continue” :  PS muestra mensaje.
  • SilentlyContinue“: No muestra mensaje.
  • Stop“: Muestra el mensaje y a continuación interrumpe ejecución.
  • Inquire“: Pregunta al usuario.

Otras salidas

 

 

 

PowerShell: Control de errores

Determinar el estado del último comando ejecutado

Si queremos conocer el estado del último comando ejecutado y su tuvo éxito o se produjo algún error.

Existen dos variables reservadas de PowerShell:

$lastExitCode

De tipo numérico representa el código de salida / error (similar a %errorlevel% en DOS).

$?

Valor booleano que indica si el último comando se ejecuto de forma satisfactoria o no.

Ejemplo de uso:

Si hacemos lo mismo pero haciendo ping a un host que no existe:

Ver los errores generados por un comando

Si ejecutamos por la línea de comandos lo siguiente:

PS > 1/0

Y a continuación:

PS > $error[0] | Format-List -Force

Sale por consola información detallada del error:

La variable reservada “$error” contiene una lista de errores. Podemos obtener el número de errores con:

PS > $error.Count

O incluso borrar la lista de errores:

PS > $error.Clear()

Como hemos visto más arriba para acceder al último error accedemos a la primera posición del array con “$error[0]”.

PS > $currentError = $error[0]

PowerShell clasifica los errores en dos tipos: Que interrumpen la ejecución del comando o del resto del script o que continuación su ejecución.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Powershell: Cambiar la contraseña de cuenta Active Directory

Partiendo de la sintaxis aprendida en el post “PowerShell: Ejemplos básicos” vamos a crear un script que permita modificar la contraseñade una cuenta basada en el nombre que introduzca el usuario por teclado, el usuario debe introducir los siguientes datos:

  • Nombre de la cuenta que
  • Nueva contraseña
  • Confirmación de la nueva contraseña
  • ¿El usuario debe cambiar la contraseña el próximo inicio de sesión? Pregunta Sí / No.

Configuración

Importa modulo con utilidades para Active Directory y establece una variable de solo lectura global (una constante) para depurar script.

Función para depuración por consola, así podemos desactivar los mensajes informativos que usamos para testear el script.

Funciones de propósito general

Función para leer una cadena introducida por el usuario

Evitamos con un pequeño control que el usuario introduzca una cadena vacía.

Función específica para preguntas donde el usuario debe seleccionar entre dos opciones:

Función de entrada principal

Nuestro script sólo tendrá una línea de código fuera de las funciones (sin contar la cabecera con la importación del modulo y la variable global) y será la llamada a la función “SetAccountPwdMain“:

Función cambio contraseña