¿Por qué mi script creado localmente no puede ejecutarse bajo la política de ejecución RemoteSigned?


98

Dado que esta pregunta sigue atrayendo respuestas que son refutadas por el cuerpo de la pregunta o que no abordan el problema real, lea este sencillo resumen de lo que necesita saber:

  • Esta no es una pregunta "¿Por qué mi instalación predeterminada de PowerShell no ejecuta scripts?" pregunta.
  • Esto no es un "¿Por qué mi instalación de PowerShell no ejecuta scripts descargados de Internet?" pregunta.
  • La pregunta es por qué la RemoteSignedpolítica de ejecución impide la ejecución del script cuando no debería.
  • RemoteSignedes la única política de ejecución que quiero usar. Soy consciente de que existen otras políticas menos restrictivas. Si esas políticas fueran sustitutos aceptables, las habría usado en su lugar y esta pregunta no existiría.
  • La política de ejecución ya está configurada en RemoteSigned. Cambiarlo de RemoteSigneda RemoteSignedno es una solución.
  • El archivo de secuencia de comandos se crea y se almacena localmente.
  • El archivo de script no está bloqueado. El archivo de script nunca fue bloqueado (ver punto anterior).
  • El archivo de script no se puede desbloquear porque no hay nada que desbloquear (ver punto anterior).
  • El archivo de script es (intenta ser) ejecutado por un administrador.
  • Windows PowerShelles la única aplicación involucrada. Ni Windows PowerShell ISEtampoco Command Promptotras herramientas o editores son relevantes.
  • La causa del problema ya ha sido identificada (ver respuesta aceptada). Después de casi 8 años, creo que todas las demás explicaciones obvias, sean aplicables o no, también se han publicado. Si piensa lo contrario , lea la pregunta y las respuestas existentes en su totalidad antes de agregar la suya.

Estoy usando Windows PowerShell 2.0 en Windows 7 Professional de 64 bits. Tengo un script en mi Desktopque causa el siguiente error cuando intento ejecutarlo:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Soy administrador de dominio y administrador local, y si ejecuto Get-ExecutionPolicy -List, puedo ver que el Group Policy Objectque creé para configurar PowerShell está aplicando correctamente la RemoteSignedpolítica de ejecución a nivel de máquina:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    RemoteSigned
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

He creado el guión a mí mismo en Notepad, y utiliza los Sysinternals ' streamsutilidad y el archivo Propertiesde diálogo para confirmar que el guión no está siendo tratado como provenientes de internet. Si copio la secuencia de comandos a un recurso compartido de red en un servidor de dominio, entonces se puede ejecutar. Si ejecuto Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine, el script local todavía no puede ejecutarse, lo cual tiene sentido ya que la política de ejecución en el MachinePolicyalcance tendrá prioridad.

Según lo documentado por about_Execution_Policies( actual ; en el momento de la pregunta ), la RemoteSignedpolítica significa:

  • Se pueden ejecutar secuencias de comandos.

  • Requiere una firma digital de un editor de confianza en scripts y archivos de configuración que se descargan de Internet (incluidos los programas de correo electrónico y mensajería instantánea).

  • No requiere firmas digitales en scripts que haya ejecutado y que haya escrito en la computadora local (no descargado de Internet).

  • Existe el riesgo de ejecutar scripts no firmados de fuentes distintas de Internet y scripts firmados, pero maliciosos.

Mi secuencia de comandos no está firmada, pero dado que se crea y se ejecuta localmente, debería satisfacer el tercer punto anterior. Por lo tanto...

  • ¿Por qué no se permite ejecutar mi secuencia de comandos?
  • ¿Por qué PowerShell se queja de que mi secuencia de comandos "no está firmada digitalmente" cuando ese requisito solo debería aplicarse a archivos de Internet?
  • ¿Por qué PowerShell ya no se preocupa de que el script no esté firmado cuando se ejecuta desde un recurso compartido de red?

1
@Downvoter: ¿le importaría dar una razón por qué?
BACON

Respuestas:


125

¿El archivo está bloqueado? Tuve el mismo problema y pude resolverlo haciendo clic derecho en el archivo .PS1, Propiedades y eligiendo Desbloquear.


1
Como expliqué, la secuencia de comandos se está creando directamente en mi disco duro (no se descarga desde ningún lugar), y confirmé que no hay secuencias alternativas que lo identifiquen como originario de una zona diferente (como Internet Explorer y otros navegadores web crean). Si ejecuto 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;, sigo recibiendo el error de que el script no está firmado digitalmente y no se ejecuta. Si abro el cuadro de diálogo Propiedades para el archivo recién creado, no hay nada que desbloquear.
BACON

48
¿Qué quiere decir ~ " Propiedades y elegir Desbloquear "?
IgorGanapolsky

1
@IgorGanapolsky quieren decir en el Explorador, busque el ps1archivo, haga clic derecho sobre él para abrir el menú contextual y elija Properties, en la primera pestaña cerca de la parte inferior dirá que el archivo está bloqueado y le permitirá marcar una casilla de verificación para desbloquearlo.
Lankymart

1
Tenga en cuenta que si descargó un archivo zip, debe desbloquear el archivo zip antes de extraerlo para evitar el desbloqueo masivo de todos los archivos que contiene.
Ohad Schneider

14
@Lankymart Windows 10, probé esto, no dice que esté bloqueado.
Alan Baljeu

119

Algunas cosas para comprobar:

¿Puedes cambiar a sin restricciones?

Set-ExecutionPolicy Unrestricted

¿Está establecida la política de grupo?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

Además, ¿cómo llamas a Script.ps1?

¿Esto le permite funcionar?

powershell.exe -executionpolicy bypass -file .\Script.ps1

El valor predeterminado para el Scopeparámetro es LocalMachine, por lo que Set-ExecutionPolicy Unrestrictedes efectivamente el mismo Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachineque ya había probado. Sí, la Turn on Script Executionpolítica está habilitada para Computer Configuration. PowerShellse abre a C:\Users\UserName, por lo que simplemente corro .\Desktop\Script.ps1en el indicador. Usar la ruta absoluta produce el mismo error, al igual que llamar al script mediante powershell.exe.
BACON

¿Ha intentado deshabilitar la configuración de política de grupo y actualizar con gpupdate /force? (Relanzar PowerShell.exe después)
Andy Arismendi

Pues bien, desde hace mucho tiempo yo estaba corriendo como Unrestricteden el LocalMachineámbito de aplicación, pero cuando empecé a escribir guiones que quería ejecutar desde otros equipos me puse LocalMachinede nuevo a Undefined, y añadió la actual Política de grupo para establecer RemoteSigneden el MachinePolicyámbito de aplicación. Este es solo un script de prueba único y realmente no es gran cosa ejecutarlo desde la red, solo quiero saber por qué no funciona localmente. Después de todo, un script creado localmente debería poder ejecutarse bajo RemoteSigned, ¿verdad? Pensé que debía haber algo que me faltaba o que no entendía.
BACON

@BACON Tiene razón en cuanto a RemoteSignedguardar Write-Host hicon el bloc de notas en su escritorio debería funcionar bien. Su configuración también se ve bien ... Algo me parece roto ... por eso sugerí eliminar la política de grupo para ver si ayuda.
Andy Arismendi

1
Para el desarrollo, solo solíamos -executionpolicy bypasssuperar temporalmente el problema de firma remota ... y eso nos permitió descubrir y depurar otros problemas (no relacionados, que nos obligaron a actualizar PowerShell).
Doug_Ivison

13

Finalmente rastreé esto hasta .NET Code Access Security . Tengo algunos módulos binarios desarrollados internamente que se almacenan y ejecutan desde un recurso compartido de red. Para que .NET 2.0 / PowerShell 2.0 los cargue, agregué una regla de URL al Intranetgrupo de código para confiar en ese directorio:

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

Tenga en cuenta que, según las versiones de .NET instaladas y si es Windows de 32 o 64 bits, caspol.exepueden existir en las siguientes ubicaciones, cada una con su propia configuración de seguridad ( security.config):

  • $Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

Después de eliminar el grupo 1.2.3....

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

... Me quedo con la configuración CAS predeterminada y los scripts locales ahora funcionan de nuevo. Ha sido un tiempo desde que he vanamente con CAS, y no estoy seguro de por qué mi norma parece interferir con las que otorgan FullTrusta MyComputer, pero desde CAS está obsoleta de .NET 4.0 (sobre la que se basa PowerShell 3.0), I Supongo que ahora es un punto discutible.


¿Cómo agregaste una regla de URL? Tuve el mismo problema y espero que esto pueda ayudarme a resolverlo. Gracias.
OptimusPrime

Ha pasado mucho tiempo desde la última vez que trabajé con caspol.exe, pero después de ejecutar caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustterminé con la misma 1.2.3.regla que se ve en esta respuesta. Estaba usando una file://URL para hacer referencia a un directorio en un recurso compartido SMB, aunque veo en la documentación que uno de los -addgroup ejemplos usa una ruta UNC.
BACON

11

Al ejecutar un archivo PS1 para una unidad asignada a Dropbox, descubrí que siempre recibo este error. Al abrir propiedades para la PS1 no hay "Desbloquear".

Lo único que funciona para mí es

powershell.exe -executionpolicy bypass -file. \ Script.ps1


1
¿Está diciendo que su secuencia de comandos está almacenada en una unidad asignada a un recurso compartido de red? ¿O el script crea una unidad asignada? Si lo primero, como dice en el cuerpo y título de la pregunta, el script fue creado y almacenado localmente, entonces el origen / zona del script no sería un factor. De cualquier manera, el uso de la Bypasspolítica de ejecución ya se sugirió hace más de cinco años y tan recientemente como hace cinco meses . Lea la pregunta y las respuestas existentes antes de responder.
BACON

6

Si el archivo se copia desde una ubicación de red, es decir, otra computadora, es posible que Windows haya bloqueado ese archivo. Haga clic derecho en el archivo y haga clic en el botón de desbloqueo y vea si funciona.


2
Como expliqué tanto en la pregunta como en mi comentario sobre la respuesta de @ O-Dogg, el script se estaba creando directamente en mi disco duro (no descargado de ningún lado), y confirmé que no había transmisiones alternativas que lo identificaran como originado en una zona diferente (como crean Internet Explorer y otros navegadores web). Si ejecuté 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;, todavía recibo el error de que el script no estaba firmado digitalmente y no se ejecutó. Si abrí el cuadro de diálogo Propiedades para el archivo recién creado, no había nada que desbloquear.
BACON

Vale la pena comprobar que no lo está creando y ejecutando en una unidad asignada. En nuestros servidores, por ejemplo, la carpeta de inicio de cada usuario es una unidad asignada a su carpeta personal.
Caltor

0

Este es un problema de IDE. Cambie la configuración en la GUI de PowerShell. Vaya a la pestaña Herramientas y seleccione Opciones, y luego Opciones de depuración . Luego, marque la casilla Desactivar el requisito de que se firmen los scripts . Hecho.


El OP claramente no quiere que los scripts se ejecuten sin firmar y no se refirió al IDE.
kfsone

1
No disponible en Powershell ISE
Josh Noe

0

Lo que me funciona fue hacer clic derecho en el archivo .ps1 y luego en propiedades. Haga clic en el botón "DESBLOQUEAR". Funciona muy bien para mí después de pasar horas tratando de cambiar las políticas.


1
Ya hay dos respuestas que ignoraron lo que se indica en la pregunta y sugieren esta misma solución inaplicable. Escribí muy claramente: "Yo ... utilicé la utilidad de secuencias de Sysinternals y el cuadro de diálogo Propiedades del archivo para confirmar que el script no se trata como si hubiera venido de Internet" y luego "se creó y se ejecutó localmente". Incluso dice en el título que el guión está "creado localmente". No hay nada que desbloquear. Si desbloquear su script resolvió su problema, entonces no tuvo el mismo problema que yo porque, como se indicó, mi script no estaba bloqueado. -1.
BACON

1
@BACON para ser justos, tuve los mismos síntomas que tú y para mí el desbloqueo funcionó. Aunque mi script se creó localmente, tuve que desbloquearlo cada vez que lo guardaba.
SQB

Esta es quizás una solución alternativa
Mo Zaatar

0

Haga una copia de seguridad del archivo script.bs1

Lo que me funciona fue eliminar el archivo script.bs1 y ejecutar el comando de ejecución.


1
¿Cuál es el mensaje de error que estaba recibiendo que se resolvió al hacer esto?
BACON

Pasé por este error 2 veces diferentes y lo solucioné de la misma manera. Parece que la ejecución del comando de ejecución desde la CMD se ejecutará inmediatamente en el otro archivo con el mismo nombre pero con la extensión (.cmd).
Abstracción simple

El archivo C: \ Users \ UserName \ Desktop \ Script.ps1 no se puede cargar. El archivo C: \ Users \ UserName \ Desktop \ Script.ps1 no está firmado digitalmente. El script no se ejecutará en el sistema. ((Script.ps1 no es un error firmado digitalmente))
Abstracción simple

Veo. ¿Y qué se devuelve cuando corres Get-ExecutionPolicy -List?
BACON

MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Abstracción simple

-1

Seleccione el símbolo del sistema de su terminal en lugar de Power shell. Eso debería funcionar.


2
¿Qué significa esto incluso? Seleccionarlo donde? El objetivo era ejecutar una secuencia de comandos de PowerShell en PowerShell, por lo que usar cualquier otra cosa que no fuera PowerShell no funcionaría.
BACON

-1

Cuando ejecuta un script de .ps1 PowerShell, es posible que reciba el mensaje “.ps1 no está firmado digitalmente. El script no se ejecutará en el sistema ". Para solucionarlo, debe ejecutar el comando a continuación para ejecutar Set-ExecutionPolicy y cambiar la configuración de la Política de ejecución.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Otra respuesta ya sugiere utilizar la Bypasspolítica de ejecución. Usar una política diferente no es útil, de todos modos, y no aborda el problema real si RemoteSignedrealmente es lo que se necesita. Finalmente, el mensaje de error al que hace referencia no es el mismo que en la pregunta.
BACON

-2

Estaba teniendo el mismo problema y lo solucioné cambiando el programa predeterminado para abrir archivos .ps1 a PowerShell. Estaba configurado en Bloc de notas .


¿Tuviste este mismo problema? ¿O cuando hacía doble clic en un .ps1archivo, se abriría en el Bloc de notas en lugar de ejecutar el script en PowerShell?
BACON

-2

Intente ejecutar la GUI de Powershell como administrador


3
Como se indica en la pregunta I am both a domain administrator and a local administrator,. La ejecución de PowerShell con niveles elevados no supondría ninguna diferencia, ya que el script podía ejecutarse sin niveles cuando se almacenaba en un recurso compartido de red.
BACON

-4

Ejecute debajo de 2 comandos en la ventana de PowerShell

  1. Set-ExecutionPolicy sin restricciones

  2. Desbloquear-Archivo-Ruta D: \ PowerShell \ Script.ps1


2
Claramente no leyó la pregunta o las respuestas de otros años que proponen variaciones de esta misma solución inaplicable o mis comentarios que afirman una y otra vez que esa no es la respuesta. Haría -10 esto si pudiera, pero en cambio tendré que conformarme con -1.
BACON
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.