miércoles, 15 de mayo de 2019

Habilitar ejecución de archivos .ps1 en Windows



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.
26

26 comentarios:

  1. Pero tal como menciona el mensaje de advertencia, acaso no es peligroso para la seguridad realizar esta acción?

    ResponderEliminar
    Respuestas
    1. Como bien dices, esta acción comporta un riesgo. Si se activa la ejecución de scripts de PowerShell, esto se puede usar para ejecutar malware en nuestro PC por parte de un atacante.

      Por otro lado, los scripts nos permiten automatizar tareas en el sistema, cosa que nos puede ahorrar tiempo en tareas repetitivas.

      Habría que valorar en cada caso si el riesgo merece el tiempo que vamos a ganar.

      De otro modo, se podría activar la ejecución de scripts momentáneamente. Ejecutar un script concreto, y una vez finalizada su ejecución, desactivar la ejecución de scripts nuevamente.

      Eliminar
    2. Totalmente de acuerdo contigo, Blai!

      Eliminar
  2. MUCHÍSIMAS GRACIAS MI AMIGO QUE DIOS TE BENDIGA Y QUE SIGAS CRECIENDO EN CONOCIMIENTOS ÉXITOS TOTALES SALUDOS DESDE ECUADOR

    ResponderEliminar
  3. PS C:\WINDOWS\system32> 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
    Set-ExecutionPolicy : Windows PowerShell actualizó la directiva de ejecución correctamente, pero el valor queda
    invalidado por una directiva definida en un ámbito más específico. Debido a esta invalidación, el shell mantendrá la
    directiva de ejecución efectiva actual: AllSigned. Escriba "Get-ExecutionPolicy -List" para ver la configuración de la
    directiva de ejecución. Para obtener más información, vea "Get-Help Set-ExecutionPolicy".
    En línea: 1 Carácter: 1
    + Set-ExecutionPolicy -Scope CurrentUser unrestricted
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
    + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
    PS C:\WINDOWS\system32> Get-ExecutionPolicy -list

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

    ResponderEliminar
    Respuestas
    1. hola bro, pudiste resolver esto? actualmente quiero instalar una app y me salta este error. Por favor, ayuda

      Eliminar
  4. No me lo permite he intentado varias opciones y nada, que puedo hacer ???

    ResponderEliminar
    Respuestas
    1. Prueba con esto:

      https://blogs.msdn.microsoft.com/pasen/2011/12/07/set-executionpolicy-windows-powershell-updated-your-execution-policy-successfully-but-the-setting-is-overridden-by-a-policy-defined-at-a-more-specific-scope/

      Eliminar
  5. Hola John, procura iniciar el power Shell the windows en modo administrador ejecuta los siguiente: "Get-ExecutionPolicy -List" (sin las comillas), verifica que la lista, que te mostrará 5 scopes, el scope CurrentUser y el scope LocalMachine tengan sus ExecutionPolicy asignada como Unrestricted. De ser que no tengan dicho ExecutionPolicy, ejecutarás los siguiente: "Set-ExecutionPolicy -Scope CurrentUser unrestricted" y "Set-ExecutionPolicy -Scope LocalMachine unrestricted"(sin las comillas). Para comprobar que se realizó el cambio ejecuta nuevamente: Get-ExecutionPolicy -List y comprueba que efectivamente tanto para el Scope CurrentUser y LocalMachine los ExecutionPolicy sean Unrestricted.

    ResponderEliminar
  6. alguien podria explicarme el problema, me paso al momento de iniciar un nuevo proyecto en algular con el comando ng pero es la primera vez que me ocurre.

    ResponderEliminar
    Respuestas
    1. Me ocurria lo mismo, pero use lo que indica Set-ExecutionPolicy -Scope LocalMachine unrestricted aunque es un poco peligroso. EL riesgo vale la pena

      Eliminar
  7. me sirvió. muchas gracias!

    ResponderEliminar
  8. Ha funcionado, muchas gracias :)

    ResponderEliminar
  9. excelente ..... gracias.

    ResponderEliminar
  10. Genial me sirvio en VSCode con Gulp

    ResponderEliminar
    Respuestas
    1. a mi no me ha servido, tambien quiero poner Gulp, hay algo mas que pueda hacer?

      Eliminar
  11. Me sirvió, muchas gracias eres un crack

    ResponderEliminar
  12. Gracias me sirvio de mucha ayuda. PUDE SOLUCIONARLO A TU AYUDA

    NO QUERIA EJECUTAR EL TERMINAL DE WINDOWS APARTE, SINO QUIERO HACERLO EN EL VSCODE

    Deseo ejecutar el comando ionic serve desde el terminal de VSCode pero me sale error. TU AYUDA POR FAVOR GRACIAS

    ionic : No se puede cargar el archivo C:\Users\ELIAS\AppData\Roaming\npm\ionic.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
    + ionic serve
    + ~~~~~
    + CategoryInfo : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

    ResponderEliminar
  13. Muchisimas gracias, me ayudaste mucho!

    ResponderEliminar