Por defecto, si intentamos ejecutar un script desde la consola de PowerShell nos encontraremos que no tenemos permisos de ejecución para ello. Windows aplica una política restrictiva con el objeto de evitar la ejecución de cualquier código malicioso así como tareas no autorizadas. Pero si estamos seguros y confiamos en el script que queremos ejecutar podemos habilitar los permisos necesarios mediante la ejecución del siguiente comando:

Set-ExecutionPolicy -ExecutionPolicy "PolicyName" -Scope "Scope"

donde tenemos que indicar dos parámetros. Por un lado, la directiva de ejecución que queremos aplicar (parámetro -ExecutionPolicy) y, por otro lado, el ámbito de ejecución (parámetro -Scope). Por tanto, tenemos que conocer que valores pueden tomar estos dos parámetros.


Directivas de ejecución

Restricted

  • Es la directiva de ejecución predeterminada en equipos cliente que ejecutan Windows.
  • Permite comandos individuales, pero no permite scripts.
  • Impide la ejecución de todos los archivos de script, incluidos los archivos de formato y configuración (.ps1xml), los archivos de script de módulo (.psm1) y los perfiles de PowerShell (.ps1).

RemoteSigned

  • Es la directiva de ejecución predeterminada en servidores.
  • Los scripts se pueden ejecutar.
  • Requiere una firma digital de un publicador de confianza en scripts y archivos de configuración que se descargan de Internet, que incluye programas de correo electrónico y mensajería instantánea.
  • No requiere firmas digitales en scripts escritos en el equipo local y no descargados de Internet.
  • Se corre el riesgo de ejecutar scripts sin firmar desde orígenes distintos de Internet y scripts firmados pero que contienen código malintencionado.

AllSigned

  • Los scripts se pueden ejecutar.
  • Requiere que todos los scripts y archivos de configuración estén firmados por un editor de confianza, incluidos los scripts que se escriban en el equipo local.
  • Solicita confirmación antes de ejecutar scripts de publicadores que aún no han sido clasificados como de confianza.
  • Se corre el riesgo de ejecutar scripts firmados pero que contienen código malintencionado.

Unrestricted

  • Permite ejecutar scripts sin firma, con el riesgo de ejecutar scripts que contienen código malintencionados.
  • Advierte al usuario antes de ejecutar scripts y archivos de configuración que se descargan de Internet.

Bypass

  • No se bloquea nada y tampoco se muestran advertencias ni mensajes.
  • Esta directiva de ejecución está diseñada para configuraciones en las que un script de PowerShell está integrado en una aplicación más grande o para configuraciones en las que PowerShell es 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 esta directiva está establecida en todos los ámbitos, la directiva de ejecución efectiva es Restricted, que es la directiva de ejecución predeterminada.


Ámbitos de las directivas de ejecución

MachinePolicy

Se establece mediante un directiva de grupo para todos los usuarios del equipo (no se puede modificar desde una sesión PowerShell).

UserPolicy

Se establece mediante directiva de grupo para el usuario actual del equipo (no se puede modificar desde una sesión PowerShell).

Process

Afecta a la sesión actual de PowerShell. La directiva de ejecución se guarda en la variable de entorno $env:PSExecutionPolicyPreference, en lugar del registro. Cuando se cierra la sesión de PowerShell, se eliminan la variable y el valor.

CurrentUser

La directiva de ejecución sólo afecta al usuario actual. Se almacena en la subclave del registro HKEY_CURRENT_USER.

LocalMachine

La directiva de ejecución afecta a todos los usuarios del equipo actual. Se almacena en la subclave del registro HKEY_LOCAL_MACHINE.


Podemos ver todas las directivas de ejecución aplicadas para la sesión actual y su orden de prioridad (de mayor a menor prioridad) mediante la ejecución del siguiente comando:

Get-ExecutionPolicy -list

Comando Get-ExecutionPolicy -list

En este caso, la directiva de ejecución efectiva es RemoteSigned porque la directiva de ejecución del usuario actual tiene prioridad sobre la directiva de ejecución establecida para el equipo local. Se puede consultar la directiva de ejecución establecida para un ámbito determinado añadiendo al anterior comando el parámetro -Scope.