PowerShell dice que "la ejecución de scripts está deshabilitada en este sistema".

1764

Estoy tratando de ejecutar un archivo que llama a script de cmd.exe, y obtengo el siguiente error:

Management_Install.ps1 no se puede cargar porque la ejecución de scripts está deshabilitada en este sistema.

he corrido

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

y cuando huyo Get-ExecutionPolicydeVuelvo Unrestricted.

PS C:\Users\Administrator\> Get-ExecutionPolicy
Unrestricted

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1

WARNING: Running x86 PowerShell...

El archivo C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1no se puede cargar porque la ejecución de scripts está deshabilitada en este sistema. Por favor vea " get-help about_signing" para más detalles.

En línea: 1 char: 25

  • .\Management_Install.ps1 <<<< 1

    • CategoryInfo: NotSpecified: (:) [], PSSecurityException

    • FullyQualifiedErrorId: RuntimeException

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> PAUSE

Press any key to continue . . .

El sistema es Windows Server 2008R2.

¿Qué estoy haciendo mal?

Conor
fuente
3
No busques amigo, inicié sesión como Administrador y también hice una carrera como "Administrador" y obtuve el mismo resultado que el anterior ...
Conor
2
Llegué al fondo, el error fue engañoso, el problema estaba en mi script de PowerShell, ¡gracias!
Conor
Vale la pena señalar que la Política de ejecución tiene varios ámbitos, y ejecutar PowerShell de diferentes maneras puede obtener políticas diferentes. Para ver la lista de políticas, ejecute Get-ExecutionPolicy -List.
Bacon Bits

Respuestas:

2243

Si está utilizando Windows Server 2008 R2, entonces hay una versión x64 y x86 de PowerShell, las cuales deben tener establecidas sus políticas de ejecución. ¿Estableció la política de ejecución en ambos hosts?

Como administrador , puede establecer la política de ejecución escribiendo esto en su ventana de PowerShell:

Set-ExecutionPolicy RemoteSigned

Para obtener más información, vea Usar el cmdlet Set-ExecutionPolicy .

Cuando haya terminado, puede restablecer la política a su valor predeterminado con:

Set-ExecutionPolicy Restricted
Chad Miller
fuente
141
Set-ExecutionPolicy Restrictedparece ser la forma de deshacerlo si desea volver a poner los permisos como estaban: technet.microsoft.com/en-us/library/ee176961.aspx . El método de derivación temporal @Jack Edmondsme parece más seguro:powershell -ExecutionPolicy ByPass -File script.ps1
SharpC
33
Para una política más segura, amplíelo al usuario real: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Nuno Aniceto
Set-ExecutionPolicy RemoteSigned no puede ser la primera línea de su script. Si es así, resáltelo y ejecute seleccionado solo INICIALMENTE antes de ejecutar el resto de su secuencia de comandos.
ozzy432836
Me encontré con una pregunta similar en el sitio de SF, "La política de ejecución de Powershell dentro de SQL Server", preguntó el 10 de octubre de 2014. Las respuestas incluidas Get-ExecutionPolicy -Listme ayudaron a ver los diferentes ámbitos. El cmd Get-ExecutionPolicyno muestra todos los ámbitos. Import-Module SQLPSAhora está trabajando con políticas modificadas de la siguiente manera: {Undefined- Process,MachinePolicy,UserPolicy,}; {RemoteSigned- CurrentUser, LocalMachine}.
SherlockSpreadsheets
Si hago esto, ¿el cambio dura solo la duración del PowerShell actual? ¿O es más grande que eso?
William Jockusch
709

Puede omitir esta política para un solo archivo agregando -ExecutionPolicy Bypassal ejecutar PowerShell

powershell -ExecutionPolicy Bypass -File script.ps1
Jack Edmonds
fuente
3
Esto también es realmente útil si está en una cuenta que no es de administrador. Hice un atajo %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPassen mi barra de tareas.
zek19
3
Tenga en cuenta que Microsoft Technet lo estiliza como "Bypass", no como "ByPass". Ver: technet.microsoft.com/nl-nl/library/hh849812.aspx
Jelle Geerts
1
Esto no funciona para mí, obtengo el mismo permiso denegado como si lo llamara normalmente. Sin embargo, llamar a una ps1 desde un .bat type script.ps1 | powershell -funciona.
Some_Guy
8
El propósito de la Política de ejecución es evitar que las personas hagan doble clic en .ps1y ejecuten accidentalmente algo que no querían. Esto sucedería con los .batarchivos
Kolob Canyon
Me salvas el día, gracias por la respuesta.
Arpit Patel
163

Tuve un problema similar y noté que el valor predeterminado cmden Windows Server 2012 era el x64.

Para Windows 7 , Windows 8 , Windows 10 , Windows Server 2008 R2 o Windows Server 2012 , ejecute los siguientes comandos como Administrador :

x86 (32 bit)
Abrir C:\Windows\SysWOW64\cmd.exe
Ejecute el comandopowershell Set-ExecutionPolicy RemoteSigned

x64 (64 bit)
Abrir C:\Windows\system32\cmd.exe
Ejecute el comandopowershell Set-ExecutionPolicy RemoteSigned

Puede verificar el modo usando

  • En CMD: echo %PROCESSOR_ARCHITECTURE%
  • En Powershell: [Environment]::Is64BitProcess

Referencias:
MSDN - Políticas de ejecución de Windows PowerShell
Windows - Explicación del directorio de 32 bits frente a 64 bits

Ralph Willgoss
fuente
133

La mayoría de las respuestas existentes explican el cómo , pero muy pocas explican el por qué . Y antes de comenzar a ejecutar código de extraños en Internet, especialmente el código que deshabilita las medidas de seguridad, debe comprender exactamente lo que está haciendo. Aquí hay un poco más de detalles sobre este problema.

Desde la página de TechNet Acerca de las políticas de ejecución :

Las políticas de ejecución de Windows PowerShell le permiten determinar las condiciones bajo las cuales Windows PowerShell carga los archivos de configuración y ejecuta los scripts.

Los beneficios de los cuales, según lo enumerado por PowerShell Basics - Política de ejecución y firma de código , son:

  • Control de ejecución : controle el nivel de confianza para ejecutar scripts.
  • Command Highjack - Previene la inyección de comandos en mi camino.
  • Identidad : es el script creado y firmado por un desarrollador en el que confío y / o firmado con un certificado de una Autoridad de certificación en la que confío.
  • Integridad : los scripts no pueden ser modificados por malware o usuarios malintencionados.

Para verificar su política de ejecución actual, puede ejecutar Get-ExecutionPolicy. Pero probablemente estés aquí porque quieres cambiarlo.

Para hacerlo, ejecutará el Set-ExecutionPolicycmdlet.

Tendrá que tomar dos decisiones importantes al actualizar la política de ejecución.

Tipo de política de ejecución:

  • Restricted - No se puede ejecutar ninguna secuencia de comandos local, remota o descargada en el sistema.
  • AllSigned - Todas las secuencias de comandos que se ejecutan deben estar firmadas digitalmente.
  • RemoteSigned - Todos los scripts remotos (UNC) o descargados deben estar firmados.
  • Unrestricted - No se requiere firma para ningún tipo de script.

Alcance del nuevo cambio

  • LocalMachine - La política de ejecución afecta a todos los usuarios de la computadora.
  • CurrentUser - La política de ejecución afecta solo al usuario actual.
  • Process - La política de ejecución afecta solo al proceso actual de Windows PowerShell.

† = Predeterminado

Por ejemplo : si desea cambiar la política a RemoteSigned solo para CurrentUser, debe ejecutar el siguiente comando:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Nota : para cambiar la política de ejecución, debe ejecutar PowerShell como administrador . Si está en modo normal e intenta cambiar la política de ejecución, obtendrá el siguiente error:

Se deniega el acceso a la clave de registro 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell'. Para cambiar la política de ejecución para el alcance predeterminado (LocalMachine), inicie Windows PowerShell con la opción "Ejecutar como administrador".

Si desea reforzar las restricciones internas en sus propios scripts que no se han descargado de Internet (o al menos no contienen los metadatos de UNC), puede obligar a la política a ejecutar solo sripts firmados. Para firmar sus propios scripts, puede seguir las instrucciones del artículo de Scott Hanselman sobre Signing PowerShell Scripts .

Nota : es probable que la mayoría de las personas reciban este error cada vez que abran Powershell porque lo primero que PS intenta hacer cuando se inicia es ejecutar el script de perfil de usuario que configura su entorno como quiera.

El archivo generalmente se encuentra en:

%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

Puede encontrar la ubicación exacta ejecutando la variable powershell

$profile

Si no hay nada que le importe en el perfil y no quiera preocuparse por su configuración de seguridad, puede eliminarlo y PowerShell no encontrará nada que no pueda ejecutar.

KyleMit
fuente
8
Creo que es importante tener en cuenta que si bien la política de ejecución es una medida de seguridad, no es una que pretenda evitar que los usuarios ejecuten código de PowerShell. La política de ejecución es algo que tiene la intención de proteger sus scripts y determinar quién los escribió, modificó o aprobó y eso es todo. Es trivial evitar la política de ejecución con algo tan simple como Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -.
Bacon Bits
1
Sin -ExecutionPolicy ByPassembargo, dada la existencia de , ¿cuál es el propósito de esta política? ¿Es solo para evitar que los usuarios abran accidentalmente una consola de PowerShell y ejecuten un script malicioso? ¿No podría el atacante simplemente usar un ejecutable o un script por lotes si quisieran evitar esto? Incluso después de leer el comentario de @BaconBits, no estoy muy seguro de qué escenario esta política debe evitar ...
Ajedi32
2
@ Ajedi32 Digamos que tengo una tarea que ejecuta un script en un recurso compartido de red. Cuando invoco mi script, quiero que mi proceso verifique que el script esté firmado. Quiero que mi código verifique dos veces que el script que voy a ejecutar es el código en el que confío para ejecutar. No me importa si puedes ejecutar mi código. Detener ese es el trabajo de los derechos de acceso. Solo quiero evitar que me hagas ejecutar código que no escribí. Los derechos de acceso significan que el sistema operativo le impide modificar mi código cuando inicia sesión. La firma de código y la política de ejecución significa mi guión no se ha modificado, cuando me voy a ejecutarlo.
Bacon Bits
40

En Windows 7:

Vaya al menú Inicio y busque "Windows PowerShell ISE".

Haga clic derecho en la versión x86 y seleccione "Ejecutar como administrador".

En la parte superior, pegue Set-ExecutionPolicy RemoteSigned; ejecuta el script Elige "Sí".

Repita estos pasos para la versión de 64 bits de Powershell ISE también (la versión no x86).

Solo estoy aclarando los pasos que @Chad Miller insinuó. Gracias Chad!

Ryan
fuente
39

También ejecutar este comando antes de que el script también resuelva el problema:

set-executionpolicy unrestricted
manik sikka
fuente
27
-1 - Sigue el principio de mínimo permiso. Al menos establezca la política RemoteSignedantes de eliminar todas las restricciones de su política de seguridad. Si eso no funciona, vuelva a evaluar cuáles son sus puntos débiles y por qué no funciona. Puede establecerlo unrestrictedcomo último recurso, pero no debería ser su punto de partida.
KyleMit
3
Gracias por señalar esta opción también. Con todo el debido respeto a las necesidades de seguridad para fines de producción, en los momentos en que la demanda de capacidad de creación rápida de prototipos es tan alta, todas las políticas y la seguridad realmente se interponen en el camino para hacer las cosas.
tishma
1
Con respecto al comentario sobre la creación de prototipos, me temo que esta es la razón por la cual el código basura entra en producción. Por supuesto, este es solo un ejemplo trivial, pero si no puede resolver algo tan trivial durante el desarrollo, es una preocupación para el lanzamiento. Además, para el código a medida, y si puede, conozca el entorno de destino: configuramos la mayoría de nuestros sistemas internos como Remotesigned.
Trix
33

Si se encuentra en un entorno en el que no es administrador, puede establecer la Política de ejecución solo para usted, y no requerirá administrador.

Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

o

Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted"

Puede leer todo al respecto en la entrada de ayuda.

Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full
Micah 'Powershell Ninja'
fuente
Me funcionó muy bien en Windows 8, incluso cuando Set-ExecutionPolicy Unrestrictedcomo administrador no parecía "irrestricto" lo suficiente como para realmente ayudar.
patridge
1
Creo que lo que puede estar experimentando es un GPO u otra cosa que sobrescriba su configuración del nivel "LocalMachine" de ExecutionPolicy. No puede sobrescribir lo que tiene una Política de dominio con el comando Set-ExecutionPolicy. Sin embargo, pero al establecer el nivel de acceso "Usuario actual", usted y solo usted tendrán la Política de ejecución especificada. Esto se debe a que la computadora busca en el usuario actual la política de ejecución antes de ver la configuración de LocalMachine.
Micah 'Powershell Ninja'
1
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted" es la única solución que me funcionó. Gracias
Paulj
32

RemoteSigned: todos los scripts que creó usted mismo se ejecutarán, y todos los scripts descargados de Internet deberán estar firmados por un editor de confianza.

OK, cambie la política simplemente escribiendo:

Set-ExecutionPolicy RemoteSigned
Jaime
fuente
Como se recomienda en otras publicaciones: es aconsejable incluir "-Scope CurrentUser" para una política más segura, cuando eso tenga sentido.
clusterdude
32

Podemos obtener el estado actual ExecutionPolicymediante 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 ExecutionPolicyes más relajado que Unrestricted.

Pratik Patil
fuente
44
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; También es una manera rápida y sucia de decirle a VS2015 que deje de quejarse y ejecute mi script sangriento. Gracias. salvador de la vida.
Eon
1
Los puntos y comas finales en los extremos de sus comandos son superfluos.
Bill_Stewart
23

Estoy usando Windows 10 y no pude ejecutar ningún comando. El único comando que me dio algunas pistas fue este:

[x64]

  1. Abra C: \ Windows \ SysWOW64 \ cmd.exe [como administrador]
  2. Ejecute el comando> powershell Set-ExecutionPolicy Unrestricted

Pero esto no funcionó. Fue limitado. Probablemente nuevas políticas de seguridad para Windows10. Tuve este error:

Set-ExecutionPolicy: Windows PowerShell actualizó su política de ejecución con éxito, pero una política definida en un ámbito más específico anula la configuración. Debido a la anulación, su shell conservará su política de ejecución efectiva actual de ...

Entonces encontré otra forma ( solución ):

  1. Abrir Ejecutar Comando / Consola ( Win+ R)
  2. Tipo: gpedit.msc ( Editor de directivas de grupo )
  3. Vaya a Política de equipo local -> Configuración del equipo -> Plantillas administrativas -> Componentes de Windows -> Windows Powershell .
  4. Habilite " Activar ejecución de script "
  5. Establezca la política según sea necesario. Puse el mío en " Permitir todos los scripts ".

Ahora abra PowerShell y disfrute;)

hugocabral
fuente
¿Es esta una instalación independiente o está conectado a un grupo de trabajo o dominio?
MEMark
¿Por qué abrir cmd para hacerlo? Simplemente abra ISE (como administrador) y escribaSet-ExecutionPolicy RemoteSigned
Kolob Canyon
Dios mío, esto finalmente solucionó mi caja win10, @kolob set-executepolicy no es suficiente
xer0x
No deberías estar usando Unrestricted. Es una mejor práctica usarRemoteSigned
Kolob Canyon
@ xer0x debería ser siempre que ejecutes PowerShell como administrador
Kolob Canyon
10

La configuración de la política de ejecución es específica del entorno. Si está intentando ejecutar un script desde el ISE x86 en ejecución , debe usar el PowerShell x86 para establecer la política de ejecución. Del mismo modo, si está ejecutando el ISE de 64 bits, debe establecer la política con el PowerShell de 64 bits.

ScriptAholic
fuente
10

Win+ Ry escriba el comando copiar y pegar y presione OK:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

Y ejecuta tu script.

Luego revierta cambios como:

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"
Qamar
fuente
10

También puede omitir esto utilizando el siguiente comando:

PS > powershell Get-Content .\test.ps1 | Invoke-Expression

También puede leer este artículo de Scott Sutherland que explica 15 formas diferentes de omitir PowerShell Set-ExecutionPolicysi no tiene privilegios de administrador:

15 formas de evitar la política de ejecución de PowerShell

Alexander Sinno
fuente
Esta es probablemente una de las guías más convincentes para solucionar problemas y comprender esta restricción.
Osvaldo Mercado
5
  1. Abra PowerShell como administrador y ejecute Set-ExecutionPolicy -Scope CurrentUser
  2. Proporcione RemoteSigned y presione Entrar
  3. Ejecute Set-ExecutionPolicy -Scope CurrentUser
  4. Proporcione sin restricciones y presione Entrar
Ramanujam Allam
fuente
5

puede probar esto y seleccionar la opción "Todos"

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
Taqi Raza Khan
fuente
3

En el editor PowerShell ISE encontré que ejecutar la siguiente línea permitía primero los scripts.

Set-ExecutionPolicy RemoteSigned -Scope Process
David Douglas
fuente
2

En PowerShell 2.0, la política de ejecución se estableció en deshabilitada de manera predeterminada.

A partir de entonces, el equipo de PowerShell ha realizado muchas mejoras y confía en que los usuarios no romperán mucho las cosas mientras ejecutan scripts. Entonces, desde PowerShell 4.0 en adelante, está habilitado de forma predeterminada.

En su caso, escriba Set-ExecutionPolicy RemoteSigneddesde la consola de PowerShell y diga sí.

Adil Arif
fuente
2

Tuve el mismo problema hoy. La política de ejecución de 64 bits no estaba restringida, mientras que la de 32 bits estaba restringida.

Aquí se explica cómo cambiar la política de 32 bits de forma remota:

Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted}
rko281
fuente
2

Vaya a la ruta de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShelly configúrelo ExecutionPolicyen RemoteSigned.

sunish surendran.k
fuente
1
1. Abra PowerShell como Administrador y ejecute Set-ExecutionPolicy -Scope CurrentUser 2. Proporcione RemoteSigned y presione Enter 3. Ejecute Set-ExecutionPolicy -Scope CurrentUser 4. Proporcione Sin restricciones y presione Enter
Ramanujam Allam
2

Recibo otra advertencia cuando intento correr Set-ExecutionPolicy RemoteSigned

Resolví con estos comandos

Set-ExecutionPolicy "RemoteSigned" -Scope Process -Confirm:$false

Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false
George C.
fuente
1

Si está aquí por ejecutarlo con Ruby o Chef y usar `` ejecución del sistema, ejecute lo siguiente:

`powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')`

Ese comando es para obtener la carpeta "MyDocuments".

-ExecutionPolicy Unrestricted Hace el truco.

Espero que sea útil para alguien más.

JGutierrezC
fuente
¿Debería el cerco `` realmente estar allí?
Peter Mortensen
1

Varias respuestas apuntan a la política de ejecución. Sin embargo, algunas cosas requieren "administrador de runas" también. Esto es más seguro ya que no hay cambios permanentes en la política de ejecución y puede superar la restricción del administrador. Use con schedtask para comenzar un lote con:

    runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1

tanto de Jack Edmonds arriba como de Peter Mortensen / Dhana de post ¿Cómo ejecutar una aplicación como "ejecutar como administrador" desde el símbolo del sistema?

Kirt Carson
fuente
1

Encontré que esta línea funcionaba mejor para uno de mis servidores Windows Server 2008 R2. Un par de otros no tuvieron problemas sin esta línea en mis scripts de PowerShell:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process
WIlliamT
fuente
1

Abra la consola de Powershell como administrador y luego configure la política de ejecución

Set-ExecutionPolicy -ExecutionPolicy Remotesigned 
lokeshbandharapu
fuente
0

Puede usar una forma especial para evitarlo:

Get-Content "PS1scriptfullpath.ps1" | Powershell-NoProfile -

Canaliza el contenido del script powershell a powershell.exe y lo ejecuta sin pasar por la política de ejecución.

Wasif Hasan
fuente
0

Esto resolvió mi problema

Abra el PowerShellcomando de Windows y ejecute la consulta a continuación para cambiarExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

si solicita cambios de confirmación, presione 'Y' y presione enter.

Arvind Chourasiya
fuente
0

Ejecutar Set-ExecutionPolicy RemoteSignedcomando

maxxi
fuente
0
  1. PowerShell abierto como administración
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

usa este comando

MD SHAYON
fuente
-1

Abra cmd en lugar de powershell. Esto me ayudó ...

Jelmer Jellema
fuente
-2

Abra la ventana de PowerShell como administrador . Funcionará.

Suganthan Raj
fuente
No funcionó. Sin embargo, ejecutar powershell Set-ExecutionPolicy RemoteSigned funcionó.
Thronk