Cómo habilitar la ejecución de scripts de PowerShell en Windows, cómo ejecutar archivos .ps1, cómo solucionar el error "la ejecución de scripts está deshabilitada en este sistema".
Windows permite automatizar tareas mediante scripts de PowerShell, tanto en su versión de escritorio como en un Windows Server. Sin embargo, la ejecución de scripts está deshabilitada por defecto. Veamos cómo permitir la ejecución de scripts de PowerShell en un entorno Windows.
La primera vez que ejecutemos un script de PowerShell contenido en un archivo .ps1 en un sistema operativo Windows, lo más probable es que el sistema nos devuelva el siguiente mensaje:
PS C:\Users\usuario> .\archivo.ps1
.\script.ps1 : No se puede cargar el archivo C:\Users\usuario\archivo.ps1 porque la ejecución de scripts está deshabilitada en este sistema. Para obtener más información, consulta el tema about_Execution_Policies en
https:/go.microsoft.com/fwlink/?LinkID=135170.
En línea: 1 Carácter: 1
+ .\script.ps1
+ ~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
Podemos ver cómo está configurada la ejecución de scripts de PowerShell en el sistema mediante:
PS C:\Users\usuario> Get-ExecutionPolicy -list
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
Como se observa en el cuadro, las políticas de ejecución de scripts de PowerShell no están definidas (Undefined). Por defecto, Windows no tiene definida la ejecución de scripts, lo cual significa que deniega implícitamente su ejecución hasta que se configure un apartado como "no restringido".
Los modos de ejecución que se pueden especificar son los siguientes:
• Restricted (Restringida): es la regla por defecto. Permite la ejecución de comandos individuales pero no de archivos de scripts, incluyendo los archivos de configuración y formato (.ps1xml), los archivos de scripts de módulos (.psm1) y los perfiles de Windows PowerShell (.ps1).
• Allsigned (Solo firmas): permite ejecutar scripts firmados por un editor de confianza, incluyendo los scripts que se escriban en el equipo local. Solicita confirmación antes de ejecutar scripts de publicadores que no hayan sido clasificados como de confianza.
• Remotesigned (Firma remota): permite la ejecución de scripts descargados de internet firmados digitalmente por un editor de confianza. No requiere firma digital en los scripts que hayan sido escritos en el equipo local.
• Unrestricted (Sin restricción): permite ejecutar scripts sin firmar. Advierte al usuario antes de ejecutar archivos de configuración y scripts descargados de Internet con el fin de añadir seguridad.
• Bypass: esta directiva no bloquea nada y no muestra advertencias de seguridad. Pensado para programas que integran un script de Windows PowerShell en una aplicación compleja.
• Undefined (Indefinido): esta opción indica que no existe ninguna directiva de ejecución establecida. Si la directiva de ejecución en todos los ámbitos es Undefined, la directiva de ejecución será Restricted, que es la directiva de ejecución por defecto en Windows.
Si queremos ejecutar scripts de PowerShell en una máquina, debemos permitir antes su ejecución mediante el comando Set-ExecutionPolicy del siguiente modo:
PS C:\Users\usuario> Set-ExecutionPolicy -Scope LocalMachine unrestricted
Cambio de directiva de ejecución
La directiva de ejecución te ayuda a protegerte de scripts en los que no confías. Si cambias dicha directiva, podrías
exponerte a los riesgos de seguridad descritos en el tema de la Ayuda about_Execution_Policies en
https:/go.microsoft.com/fwlink/?LinkID=135170. ¿Quieres cambiar la directiva de ejecución?
[S] Sí [O] Sí a todo [N] No [T] No a todo [U] Suspender [?] Ayuda (el valor predeterminado es "N"): S
Set-Executionpolicy : Se denegó el acceso a la clave de Registro
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'. Para cambiar la directiva de ejecución para el ámbito (LocalMachine) predeterminado, inicie Windows PowerShell con la opción "Ejecutar como administrador". Para cambiar la directiva de ejecución para el usuario actual, ejecute "Set-ExecutionPolicy -Scope CurrentUser".
En línea: 1 Carácter: 1
+ Set-Executionpolicy -Scope LocalMachine unrestricted
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.
SetExecutionPolicyCommand
Como vemos, para modificar los permisos a nivel de máquina, debemos ejecutar el comando como administrador. Si queremos ejecutar scripts con nuestro usuario sin tener que abrir una nueva instancia de PowerShell como administrador, basta con cambiar "LocalMachine" por "CurrentUser". De esta forma, Windows no nos pide que abramos nueva instancia de PowerShell como administrador:
PS C:\Users\usuario> Set-ExecutionPolicy -Scope CurrentUser unrestricted
Cambio de directiva de ejecución
La directiva de ejecución te ayuda a protegerte de scripts en los que no confías. Si cambias dicha directiva, podrías
exponerte a los riesgos de seguridad descritos en el tema de la Ayuda about_Execution_Policies en
https:/go.microsoft.com/fwlink/?LinkID=135170. ¿Quieres cambiar la directiva de ejecución?
[S] Sí [O] Sí a todo [N] No [T] No a todo [U] Suspender [?] Ayuda (el valor predeterminado es "N"): S
Si listamos las políticas de ejecución de nuevo, veremos que CurrentUser ha cambiado a "Unrestricted":
PS C:\Users\usuario> Get-ExecutionPolicy -list
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Unrestricted
LocalMachine Undefined
A partir de este momento, ya podemos ejecutar archivos .ps1 con scripts de PowerShell sin problemas.