windows - help - ¿Cómo cambia con éxito la política de ejecución y habilita la ejecución de los scripts de PowerShell?
habilitar scripts powershell windows 10 (6)
Tengo un problema con respecto al cambio de la Política de ejecución en mi sistema operativo Windows Server 2008+. Es la primera vez que intento ejecutar un script para el que necesito acceso completo a los recursos e intento lo siguiente después de iniciar Powershell en modo elevado :
Set-ExecutionPolicy Unrestricted
Pero entiendo esto:
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope. Due to the override, your shell will retain its current
effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. For more information please see
"Get-Help Set-ExecutionPolicy".
At line:1 char:1
+ Set-ExecutionPolicy Unrestricted
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
+ FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
Aunque soy administrador, no puedo cambiar la política de ejecución. ¿Qué hacer?
Ahora hay una revisión disponible para instalar:
2.8.7 para VS 2013: https://github.com/NuGet/Home/releases/download/2.8.7/NuGet.Tools.vsix
3.1.1 para VS 2015: https://github.com/NuGet/Home/releases/download/3.1.1/NuGet.Tools.vsix
Cree el siguiente ps.cmd
y póngalo en su RUTA:
POWERSHELL -Command "$enccmd=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content ''%1'' | Out-String)));POWERSHELL -EncodedCommand $enccmd"
Ahora puedes ejecutar cualquier script de powershell como en:
psa mypowershell.ps1
El mensaje de error indica que la configuración que está intentando definir a través de Set-ExecutionPolicy
está anulada por una configuración en otro ámbito. Use Get-ExecutionPolicy -List
para ver qué ámbito tiene qué configuración.
PS C:/> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
PS C:/> Set-ExecutionPolicy Restricted -Scope Process -Force
PS C:/> Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope. Due to the override, your shell will retain its current
effective execution policy of Restricted. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. ...
PS C:/> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Restricted
CurrentUser Unrestricted
LocalMachine RemoteSigned
PS C:/> ./test.ps1
./test.ps1 : File C:/test.ps1 cannot be loaded because running scripts is
disabled on this system. ...
PS C:/> Set-ExecutionPolicy Unestricted -Scope Process -Force
PS C:/> Set-ExecutionPolicy Restricted -Scope CurrentUser -Force
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope. Due to the override, your shell will retain its current
effective execution policy of Restricted. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. ...
PS C:/> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Unrestricted
CurrentUser Restricted
LocalMachine RemoteSigned
PS C:/> ./test.ps1
Hello World!
Como puede ver, ambas configuraciones se definieron a pesar del error, pero la configuración en el ámbito más específico ( Process
) todavía tiene prioridad, ya sea impidiendo o permitiendo la ejecución de scripts.
Dado que el ámbito predeterminado es LocalMachine
el error podría deberse a una configuración en el ámbito CurrentUser
o Process
. Sin embargo, una razón más común es que la ejecución del script se configuró a través de una política de grupo (local o de dominio).
El administrador local puede modificar una política de grupo local a través de gpedit.msc
(Editor de políticas de grupo local) como se describe en esta respuesta .
Una política de grupo de dominio no puede ser reemplazada por configuraciones / políticas locales y debe ser cambiada por un administrador de dominio a través de gpmc.msc
(Administración de políticas de grupo) en un controlador de dominio.
Para las políticas locales y de dominio, la configuración se puede definir como una configuración de computadora:
Computer Configuration
`-Administrative Templates
`-Windows Components
`-Windows PowerShell -> Turn on Script Execution
o como configuración de usuario:
User Configuration
`-Administrative Templates
`-Windows Components
`-Windows PowerShell -> Turn on Script Execution
Los primeros se aplican a objetos de computadora, mientras que los últimos se aplican a objetos de usuario. Para las políticas locales, no hay una diferencia significativa entre las políticas de usuario y de computadora, porque las políticas de usuario se aplican automáticamente a todos los usuarios de la computadora.
Una política puede tener uno de tres estados (o cinco estados si cuenta las 3 configuraciones disponibles para el estado Habilitado por separado):
- No configurado : la política no controla la ejecución del script de PowerShell.
- Habilitado : permitir la ejecución del script PowerShell.
- Permitir solo los guiones firmados : permitir la ejecución de los guiones firmados solamente (igual que
Set-ExecutionPolicy AllSigned
). - Permitir guiones locales y guiones firmados remotos : permitir la ejecución de todos los guiones locales (firmados o no) y de guiones firmados desde ubicaciones remotas (igual que
Set-ExecutionPolicy RemoteSigned
). - Permitir todos los scripts : permite la ejecución de scripts locales y remotos independientemente de si están firmados o no (igual que
Set-ExecutionPolicy Unrestricted
).
- Permitir solo los guiones firmados : permitir la ejecución de los guiones firmados solamente (igual que
- Deshabilitado : no permitir la ejecución del script de PowerShell (igual que
Set-ExecutionPolicy Restricted
).
Los cambios realizados a través de Set-ExecutionPolicy
solo se hacen efectivos cuando las políticas locales y de dominio están configuradas como No configuradas (política de ejecución no MachinePolicy
en los ámbitos MachinePolicy
y UserPolicy
).
El problema es que Windows no permite que todos los scripts se ejecuten en modo Unrestricted
. En realidad, sin importar la política de ejecución para su usuario (incluso si es administrador), la Local Group Policy
tendrá prioridad.
Y, de forma predeterminada, la política de ejecución de la secuencia de comandos del grupo local es tal para la cual las secuencias de comandos no pueden ejecutarse. ¡Necesitamos cambiarlo!
Cambio de la política de ejecución del grupo local
Lo hacemos a través del Local Group Policy Editor
que puede acceder buscando en la barra de búsqueda de Windows "política de grupo". O haz esto:
- Abra la Consola de administración presionando
Win + r
y escribiendo el comandommc
. - Vaya a
File -> Add Remove Snap In...
- En el panel izquierdo, busque el
Group Policy Object Editor
y añádalo. - Cierra el formulario.
Luego, en el panel izquierdo, se puede expandir el editor de grupo. Expanda y navegue a Computer Configuration -> Administrative Templates -> Windows Components
.
Luego a Windows PowerShell
.
Así que seleccione Turn on Script Execution
. Cambie la configuración a Enabled
y especifique Allow all scripts
en la Execution Policy
.
Confirme pulsando Ok
y cierre la consola de gestión.
Si se está ejecutando en Visual Studio 2015 recientemente, verifique si hay actualizaciones para el administrador de paquetes nuget en herramientas> extensiones y actualizaciones>
Si un controlador de dominio establece la política de ejecución de PowerShell a través de una política de grupo, deberá restablecer la política de ejecución a "Omitir" en el registro después de cada inicio. He creado un par de scripts de inicio para automatizar el proceso. A continuación, describo mi proceso.
Cree una carpeta llamada% USERPROFILE% / Documents / StartupScripts y luego coloque un script de PowerShell llamado ExecutionPolicy.ps1 con el siguiente código:
Push-Location
Set-Location HKLM:/Software/Policies/Microsoft/Windows/PowerShell
Set-ItemProperty . ExecutionPolicy "Bypass"
Pop-Location
Luego cree un archivo llamado% USERPROFILE% / AppData / Roaming / Microsoft / Windows / Start Menu / Programs / Startup / Startup.cmd y coloque el siguiente código en él:
PowerShell -Version 3.0 -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%/StartupLog.txt" 2>&1
PowerShell -Version 3.0 "%USERPROFILE%/Documents/StartupScripts/ExecutionPolicy.ps1" >> "%TEMP%/StartupLog.txt" 2>&1
Este script se ejecutará al inicio de cada inicio de sesión.