Skip to main content

Habilitar ejecución de scripts en PowerShell

Se quiere ejecutar un script .ps1 en PowerShell, pero la ejecución está bloqueada a nivel de máquina por GPO:

PS C:\Users\Sergio> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       AllSigned
   UserPolicy    Unrestricted
      Process       Undefined
  CurrentUser    Unrestricted
 LocalMachine    Unrestricted

Cuando se intenta ejecutar el script, se obtiene el siguiente error:

PS C:\Users\Sergio> .\TEST.ps1
.\TEST.ps1 : File C:\Users\Sergio\TEST.ps1 cannot be loaded because its
operation is blocked by software restriction policies, such as those created by using Group Policy.
At line:1 char:1
+ .\TEST.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Para habilitar la ejecución de scripts cuando estan capados por GPO o en cierto scope:

1. Abrir PowerShell en modo "Run as Administrator"
2. Introducir el siguiente comando:

Set-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\PowerShell -Name ExecutionPolicy -Value Bypass 

3. Reiniciar la sesión PowerShell (cerrar y abrir nueva ventana PowerShell como admin)

El valor Bypass se debe introducir tal cual, no ByPass como viene en varias webs por internet. Si se introduce ByPass, no lo detecta y no se ejecutan los scripts.

El el comando modifica la clave de registro (o la crea) ExecutionPolicy y le asigna el valor de Bypass. De forma que con el comando:

Get-ExecutionPolicy -List

ahora se obtiene:

PS C:\Users\sjimenezanton> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy          Bypass
   UserPolicy    Unrestricted
      Process       Undefined
  CurrentUser    Unrestricted
 LocalMachine    Unrestricted

Con el scope MachinePolicy en modo Bypass ya se puede ejecutar el script:

PS C:\Users\Sergio> $ip = (Get-NetIPAddress -AddressFamily IPV4 -InterfaceAlias "Loopback Pseudo-Interface 1").IPAddress
PS C:\Users\Sergio> .\TEST.ps1 ; echo $ip
IP:
127.0.0.1
Fuentes

[1] https://vladtalkstech.com/2015/03/windows-powershell-updated-execution-policy-successfully-setting-overridden-policy-defined-specific-scope.html
[2] https://vladtalkstech.com/2014/03/change-powershell-machinepolicy-execution-policy-windows-server-2012r2.html
[3] https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-executionpolicy?view=powershell-7.3