Cuando queremos ejecutar scripts de Powershell en un equipo con Windows tenemos que tener en cuenta la directiva de seguridad que se aplica para poder ejecutar scripts y comandos.
Si queremos ejecutar un simple script como el siguiente:
Nos encontramos con que no podemos ejecutarlo.
Vamos a explicar por qué. Las directivas de ejecución de Windows PowerShell nos indican si podemos ejecutar scripts o no con el objetivo de controlar que sabemos que script estamos ejecutando. Hay que indicar que las directivas no se preocupan del contenido del script sino de si se puede ejecutar o no. Las directivas pueden tomar los siguientes valores:
- Restricted
- Directiva de ejecución predeterminada.
- Admite comandos individuales, pero no permite ejecutar scripts.
- Evita que se ejecuten todos los archivos de script, incluidos los archivos de formato y configuración (.ps1xml), los archivos de script de módulos (.psm1) y los perfiles de Windows PowerShell (.ps1).
- AllSigned
- Permite ejecutar scripts.
- Requiere que todas los scripts y archivos de configuración estén firmados por un editor de confianza, incluidos los scripts que se escriben en un equipo local.
- Pide confirmación antes de ejecutar los scripts de editores que no se han clasificado para indicar si son de confianza o no.
- Se corre el riesgo de ejecutar scripts sin firmar procedentes de orígenes distintos de Internet y malintencionados, aunque estén firmados.
- RemoteSigned
- Permite ejecutar scripts.
- Requiere una firma digital de un editor de confianza en scripts y archivos de configuración descargados de Internet (también desde programas de correo electrónico y de mensajería instantánea).
- No requiere firma digital en los scripts ejecutados y escritos en el equipo local (que no se hayan descargado desde Internet).
- Se corre el riesgo de ejecutar scripts malintencionados, aunque estén firmados.
- Unrestricted
- Permite ejecutar scripts sin firma. (Se corre el riesgo de ejecutar scripts malintencionados.)
- Advierte al usuario antes de ejecutar scripts y archivos de configuración que se descargan de Internet.
- Bypass
- No se bloquea nada y no se muestran advertencias ni mensajes.
- Esta directiva de ejecución está diseñada para configuraciones en las que un script de Windows PowerShell está integrado en una aplicación mayor o para configuraciones en que Windows PowerShell constituye la base de un programa que tiene su propio modelo de seguridad.
- Undefined
- No hay ninguna directiva de ejecución establecida en el ámbito actual.
- Si la directiva de ejecución es Undefined en todos los ámbitos, la directiva de ejecución efectiva es Restricted, que es la directiva de ejecución predeterminada.
Ámbito de ejecución de las directivas
Se puede establecer una directiva de ejecución que sea efectiva solamente en un ámbito determinado.
Los valores válidos de Scope son Process, CurrentUser y LocalMachine. LocalMachine es el valor predeterminado cuando se establece una directiva de ejecución.
Los valores de Scope se muestran por orden de precedencia.
- MachinePolicy y UserPolicy: se establecen a nivel de GPO y no se pueden modificar desde una sesión PowerShell.
- Process: La directiva de ejecución afecta solamente a la sesión actual (el proceso actual de Windows PowerShell). La directiva de ejecución se almacena en la variable de entorno de $PSExecutionPolicyPreference. Este valor se elimina cuando se cierra la sesión en la que se establece la directiva.
- CurrentUser:La directiva de ejecución afecta solamente al usuario actual.Se almacena en la subclave HKEY_CURRENT_USER del Registro.
- LocalMachine: La directiva de ejecución afecta a todos los usuarios del equipo actual. Se almacena en la subclave HKEY_LOCAL_MACHINE del Registro.
Obtener la directiva de ejecución
Obtenemos las directivas con el comando Get-ExecutionPolicy.
1 |
Get-ExecutionPolicy |
Si queremos obtener todas las directivas utilizamos el parámetro -List
1 |
Get-ExecutionPolicy -List |
Cambiar la directiva
Para poder realizar un cambio en la directiva utilizamos el cmdlet Set-ExecutionPolicy
Por defecto, si no indicamos el parámetro Scope, se cambia en el ámbito LocalMachine
Pero indicando el parámetro Scope seleccionamos en que ámbito queremos que se ejecute.
Cambiar la seguridad para la ejecución de un script concreto.
Se puede dar la situación de que queramos ejecutar un script y la directiva configurada haga que no se ejecute directamente sino que nos muestre un mensaje como el siguiente:
1 2 3 4 5 6 7 |
Advertencia de seguridad Ejecute sólo los scripts de confianza. Los archivos procedentes de Internet pueden ser útiles, pero algunos archivos podrían dañar su equipo. ¿Desea ejecutar Script.ps1? [N] No ejecutar [Z] Ejecutar una vez [U] Suspender [?] Ayuda (el valor predeterminado es "N"): |
Podemos ejecutar el script con el parámetro -ExecutionPolicy para definir la directiva para esa ejecución, por ejemplo:
1 |
powershell.exe -ExecutionPolicy Bypass Ejemplo.ps1 |
De esta forma podemos saltarnos la advertencia de seguridad, útil en el caso de tener por ejemplo ese script como tarea programada y no queremos cambiar la directiva a nivel de máquina.
Temas
- Introducción
- Instalación y requerimientos
- Ayuda
- Ampliando la funcionalidad
- Canalización
- Operadores
- Comandos básicos
- Formato de salida
- Importar y Exportar datos
- Arrays y HashTables
- Ejecución de Scripts
- Providers
- Trabajos
- Scripts y funciones
- Gestión de Errores
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?
Un comentario
Pingback: Curso básico de Powershell: Arrays y HashTables