¿Cómo habilitar la ejecución de scripts de PowerShell?

260

Cuando intento ejecutar mi script de PowerShell me sale este error:

El archivo C: \ Common \ Scripts \ hello.ps1 no se puede cargar porque la ejecución de scripts está deshabilitada en este sistema. Consulte "get-help about_signing" para obtener más detalles.
En la línea: 1 char: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Pavel Chuchuva
fuente

Respuestas:

400
  1. Inicie Windows PowerShell con la opción "Ejecutar como administrador". Solo los miembros del grupo Administradores en la computadora pueden cambiar la política de ejecución.

  2. Habilite la ejecución de scripts sin firmar ingresando:

    set-executionpolicy remotesigned
    

Esto permitirá ejecutar scripts sin firmar que escriba en su computadora local y scripts firmados desde Internet.

Consulte también Ejecución de scripts en la Biblioteca Microsoft TechNet.

Pavel Chuchuva
fuente
3
¿Esto cambiará la política de forma permanente o tengo que hacerlo cada vez que reinicie mi computadora?
Ray
2
@Ray Esto cambiará la política de forma permanente.
Pavel Chuchuva
1
@ Ray Vea la documentación . Por defecto, lo establece para el LocalMachine. Para establecer otros ámbitos ( CurrentUsero Process), pase -Scopeexplícitamente.
jpmc26
@PavelChuchuva debo añadir esta línea en la parte superior de mi guión que quería decir
FabioSpaghetti
@FabioSpaghetti No es necesario agregar nada a sus scripts. Simplemente ejecute ese comando una vez siguiendo los pasos.
Pavel Chuchuva
74

La Política de ejecución predeterminada está configurada como restringida, puede verla escribiendo:

Get-ExecutionPolicy

Debe escribir lo siguiente para que pase al modo sin restricciones:

Set-ExecutionPolicy unrestricted

Espero que esto ayude

William Hilsum
fuente
13
La firma obligatoria tiene sentido si espera que el usuario copie y pegue scripts maliciosos de Internet. Si asume que el usuario no es estúpido, entonces "remotosignado" no agrega ninguna seguridad y dificulta la vida.
Guss
@Guss: Al probar esto, descubrí que RemoteSigned ya no requiere la firma de archivos .ps1 generados localmente, y trata el control de fuente git como una fuente local.
Joshua
@ Joshua: sí, mi punto exactamente. Si RemoteSignedno bloquea copiar y pegar, no bloquea git u otros métodos de descarga que no sean IE, ¿para qué sirve? Dilo conmigo: "¡absolutamente nada!". Creo que exigir que los scripts se firmen con un certificado de firma de código de $ 100 es inútil, estúpido y niega todo lo bueno que un lenguaje de script decente puede hacer para Windows. Dicho esto, si el camino a seguir es lograr que los usuarios comprendan lo que están haciendo para usar los scripts de PS, entonces es posible que tengamos demasiadas cosas ... Nahhhh, eso nunca funcionará ;-)
Guss
@ Guss: ya tengo un buen lenguaje de script en Windows. Cygwin funciona muy bien en Windows 10; literalmente, mucho mejor de lo que ha sido en cualquier versión anterior de Windows. Solo quiero ejecutar scripts que alguien más haya escrito.
Joshua
61

En mi máquina que uso para scripts de desarrollo, usaré -restricted como arriba. Sin embargo, cuando implemente mis scripts en una máquina de usuario final, solo llamaré a powershell con el modificador -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
MDMoore313
fuente
2
Es posible que desee combinar este truco con un truco políglota en un archivo .CMD. Ver stackoverflow.com/a/8597794/5314
Jay Bazuzi
¡Agradable! He estado implementando los sfx hechos por winrar rarlabs.com
MDMoore313
1
Ese truco me permitió ejecutar el script de PowerShell de Git Bash (MINGW32 bash)
Kamil Szot
16

Podemos obtener el estado de ExecutionPolicy actual mediante el siguiente comando:

Get-ExecutionPolicy;

Por defecto está restringido . Para permitir la ejecución de scripts de PowerShell, necesitamos establecer esta ExecutionPolicy como Bypass o Unrestricted .

Podemos establecer la política para el Usuario actual como Bypasso Unrestrictedusando cualquiera de los siguientes comandos de PowerShell:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

La política sin restricciones carga todos los archivos de configuración y ejecuta todos los scripts. Si ejecuta un script sin firmar que se descargó de Internet, se le solicitará permiso antes de que se ejecute.

Mientras que en la política de omisión , nada está bloqueado y no hay advertencias ni avisos durante la ejecución del script. Bypass ExecutionPolicy es más relajado que Unrestricted.

Pratik Patil
fuente
5

Dependiendo de la versión y configuración de Windows, puede tener la siguiente advertencia, incluso en Unrestrictedmodo:

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

La solución es utilizar la política de "omisión", habilitada con el siguiente comando:

Set-ExecutionPolicy Bypass

De la documentación :

Bypass: nada está bloqueado y no hay advertencias ni avisos.

Esto es obviamente inseguro, por favor entienda los riesgos involucrados.

Benoit Blanchon
fuente
esta fue la única forma en que pude ejecutar mi script en un entorno WINE con powershell 2.0. Gracias.
Wyatt8740
@ Wyatt8740: Porque wine presenta todas las unidades como unidades de red.
Joshua
@Joshua No tenía idea. ¿Me puede dar una fuente para esa declaración? probé un google informal, pero obviamente me veo mal.
Wyatt8740
@ Wyatt8740: Fuente: cuadro de diálogo común de Wine OpenFileName. Mira los íconos de la unidad.
Joshua
@Joshua quise decir una fuente de código fuente; Los iconos son posiblemente arbitrarios. Pero no había pensado en eso; Supongo que es un buen lugar para comenzar (editar: no parece que estén aquí ).
Wyatt8740
2

Una clave de registro con:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "Bypass"

y:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

funciona de hecho también.

Giesbert Schipper
fuente
1

Por alguna razón, el cmdlet de PowerShell no habilitó la ejecución local globalmente, solo para el contexto del usuario local. Si intentara iniciar un script de Powershell desde el indicador bash de CygWin, por ejemplo, que se ejecuta en su propio contexto de usuario, no se ejecutaría, dando el error "no está firmado digitalmente". La respuesta fue ir al Editor de políticas de grupo local -> Política de computadora local -> Plantillas administrativas -> Componentes de Windows -> Windows PowerShell y hacer doble clic en 'Activar ejecución de script'. Esto me permite cambiarlo a 'Habilitado' y luego la política de ejecución de "Permitir scripts locales y scripts firmados remotos" y hacer que funcione globalmente, independientemente del contexto del usuario.

Eric Green
fuente
0

La respuesta aceptada es correcta, pero la modificación de la política solo está disponible para la instancia actualmente en ejecución de Powershell, lo que significa que una vez que se cierra la instancia de Powershell. La política se restablecerá. Si un usuario vuelve a abrir otra instancia de Powershell, se aplicará la política predeterminada que esRestricted

Para mí, necesito usar la consola de VisualStudio Code y g ++ de cygwin para construir cosas. La consola está usando Powershell, con la política predeterminada, no se puede hacer nada. Una solución es cambiar la política cada vez que se dispara la consola en la consola de VisualStudio Code, tal vez una secuencia de comandos para cambiar la política.

Soy flojo, así que otra solución es cuando ejecuto Powershell en modo administrador, similar a lo que hace la respuesta aceptada. pero con un parámetro adicional que cambia los valores en la tabla del Registro. Una vez hecho esto. Otras instancias de Powershell usarán la RemoteSignedpolítica de forma predeterminada.

set-executionpolicy remotesigned -Scope CurrentUser

r0ng
fuente
0

Establecer la política (correctamente) es la mejor opción, pero en mis sistemas administrados no tengo la capacidad de cambiar esa política.

Para mí, la solución más simple para cambiar la política es abrir el script en el "ISE de PowerShell" , resaltar el código (o parte del código) para ejecutar y luego hacer clic en el botón "Ejecutar selección" (o usar el F8 atajo).

Esta no es la mejor solución y hace poco para automatizar tareas, pero sí me permite el uso y la utilidad de PowerShell sin afectar mi departamento de IS.

DBADon
fuente
-2

La razón por la que funciona la tecla reg es porque está haciendo exactamente lo que hacen los comandos PS. Los comandos escriben los cambios en las teclas de registro. Los comandos son mucho más rápidos y fáciles que crear una clave de registro o cavar en el registro.

keith
fuente
1
Eso es simplemente incorrecto: las claves que se mencionaron en otras respuestas cambian la política de ejecución de powershells, que luego permite que se ejecute el script de powershell.
Patrick R.