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