about_Execution_Policies
Descripción breve
Describe las directivas de ejecución de PowerShell y explica cómo administrarlas.
Descripción larga
La directiva de ejecución de PowerShell es una característica de seguridad que controla las condiciones en las que PowerShell carga archivos de configuración y ejecuta scripts. Esta característica ayuda a evitar la ejecución de scripts malintencionados.
En un equipo Windows puede establecer una directiva de ejecución para el equipo local, para el usuario actual o para una sesión determinada. También puede usar una configuración de directiva de grupo para establecer directivas de ejecución para equipos y usuarios.
Las directivas de ejecución para el equipo local y el usuario actual se almacenan en el Registro. No es necesario establecer directivas de ejecución en el perfil de PowerShell. La directiva de ejecución de una sesión determinada se almacena solo en memoria y se pierde cuando se cierra la sesión.
La directiva de ejecución no es un sistema de seguridad que restrinja las acciones del usuario. Por ejemplo, los usuarios pueden omitir fácilmente una directiva escribiendo el contenido del script en la línea de comandos cuando no pueden ejecutar un script. En su lugar, la directiva de ejecución ayuda a los usuarios a establecer reglas básicas e impide que las incumplen involuntarlamente.
En equipos que no son windows, la directiva de ejecución predeterminada es Unrestricted y no se puede cambiar. El Set-ExecutionPolicy cmdlet está disponible, pero PowerShell muestra un mensaje de consola que indica que no se admite. Aunque devuelve en plataformas que no son de Windows, el comportamiento realmente coincide porque esas plataformas no Get-ExecutionPolicy Unrestricted implementan el Seguridad de Windows Bypass Zones.
Directivas de ejecución de PowerShell
La aplicación de estas directivas solo se produce en plataformas Windows. Las directivas de ejecución de PowerShell son las siguientes:
AllSigned
- Los scripts se pueden ejecutar.
- Requiere que todos los scripts y archivos de configuración estén firmados por un editor de confianza, incluidos los scripts que se escriban en el equipo local.
- Le preguntará antes de ejecutar scripts desde publicadores que aún no se han clasificado como de confianza o que no son de confianza.
- Riesgos al ejecutar scripts firmados, pero malintencionados.
Bypass
- No se bloquea nada y tampoco se muestran advertencias ni mensajes.
- Esta directiva de ejecución está diseñada para configuraciones en las que un script de PowerShell está integrado en una aplicación más grande o para configuraciones en las que PowerShell es la base de un programa que tiene su propio modelo de seguridad.
Default
- Establece la directiva de ejecución predeterminada.
- Restricted para clientes de Windows.
- RemoteSigned para servidores Windows.
RemoteSigned
- Directiva de ejecución predeterminada para equipos windows server.
- Los scripts se pueden ejecutar.
- Requiere una firma digital de un publicador de confianza en scripts y archivos de configuración que se descargan de Internet, lo que incluye programas de correo electrónico y mensajería instantánea.
- No requiere firmas digitales en scripts escritos en el equipo local y no descargados de Internet.
- Ejecuta scripts que se descargan desde Internet y no están firmados, si los scripts están desbloqueados, como mediante el
Unblock-Filecmdlet . - Corre el riesgo de ejecutar scripts sin firmar desde orígenes distintos de Internet y scripts firmados que podrían ser malintencionados.
Restricted
- Directiva de ejecución predeterminada para equipos cliente Windows.
- Permite comandos individuales, pero no permite scripts.
- Impide la ejecución de todos los archivos de script, incluidos los archivos de formato y configuración ( ), los archivos de script de módulo ( ) y los
.ps1xml.psm1perfiles de PowerShell (.ps1).
Undefined
- No hay ninguna directiva de ejecución establecida en el ámbito actual.
- Si la directiva de ejecución en todos los ámbitos es , la directiva de ejecución efectiva es para clientes Windows y Undefined Restricted RemoteSigned para Windows Server.
Unrestricted
- La directiva de ejecución predeterminada para equipos que no son Windows y no se puede cambiar.
- Se pueden ejecutar scripts sin signo. Existe el riesgo de ejecutar scripts malintencionados.
- Advierte al usuario antes de ejecutar scripts y archivos de configuración que no son de la zona de intranet local.
Nota
En los sistemas que no distinguen las rutas de acceso de convención de nomenclatura universal (UNC) de las rutas de acceso de Internet, es posible que los scripts identificados por una ruta de acceso UNC no puedan ejecutarse con la directiva de ejecución RemoteSigned.
Ámbito de la directiva de ejecución
Puede establecer una directiva de ejecución que sea efectiva solo en un ámbito determinado.
Los valores válidos Scope para MachinePolicy son , UserPolicy, Process , CurrentUser y LocalMachine. LocalMachine es el valor predeterminado al establecer una directiva de ejecución.
Los Scope valores se muestran en orden de precedencia. La directiva que tiene prioridad es efectiva en la sesión actual, incluso si se estableció una directiva más restrictiva en un nivel inferior de prioridad.
Para obtener más información, vea Set-ExecutionPolicy.
MachinePolicy
Se establece mediante directiva de grupo para todos los usuarios del equipo.
UserPolicy
Se establece mediante directiva de grupo para el usuario actual del equipo.
Process
El Process ámbito solo afecta a la sesión actual de PowerShell. La directiva de ejecución se guarda en la variable de entorno $env:PSExecutionPolicyPreference , en lugar del Registro. Cuando se cierra la sesión de PowerShell, se eliminan la variable y el valor.
CurrentUser
La directiva de ejecución sólo afecta al usuario actual. Se almacena en la subclave HKEY_CURRENT_USER registro.
LocalMachine
La directiva de ejecución afecta a todos los usuarios del equipo actual. Se almacena en la subclave HKEY_LOCAL_MACHINE registro.
Administración de la directiva de ejecución con PowerShell
Para obtener la directiva de ejecución efectiva para la sesión actual de PowerShell, use el Get-ExecutionPolicy cmdlet .
El comando siguiente obtiene la directiva de ejecución efectiva:
Get-ExecutionPolicy
Para obtener todas las directivas de ejecución que afectan a la sesión actual y mostrarlas en orden de precedencia:
Get-ExecutionPolicy -List
El resultado es similar al siguiente resultado de ejemplo:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine AllSigned
En este caso, la directiva de ejecución efectiva es RemoteSigned porque la directiva de ejecución del usuario actual tiene prioridad sobre la directiva de ejecución establecida para el equipo local.
Para obtener la directiva de ejecución establecida para un ámbito determinado, use el Scope parámetro de Get-ExecutionPolicy .
Por ejemplo, el siguiente comando obtiene la directiva de ejecución para el ámbito CurrentUser:
Get-ExecutionPolicy -Scope CurrentUser
Cambio de la directiva de ejecución
Para cambiar la directiva de ejecución de PowerShell en el equipo Windows, use el Set-ExecutionPolicy cmdlet . El cambio es efectivo inmediatamente. No es necesario reiniciar PowerShell.
Si establece la directiva de ejecución para los ámbitos LocalMachine o CurrentUser, el cambio se guarda en el Registro y sigue siendo efectivo hasta que vuelva a cambiarlo.
Si establece la directiva de ejecución para el Process ámbito, no se guarda en el Registro. La directiva de ejecución se conserva hasta que se cierra el proceso actual y los procesos secundarios.
Nota
En Windows Vista y versiones posteriores de Windows, para ejecutar comandos que cambien la directiva de ejecución del equipo local, ámbito LocalMachine, inicie PowerShell con la opción Ejecutar como administrador.
Para cambiar la directiva de ejecución:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
Por ejemplo:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Para establecer la directiva de ejecución en un ámbito determinado:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
Por ejemplo:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Un comando para cambiar una directiva de ejecución puede realizarse correctamente, pero todavía no cambiar la directiva de ejecución efectiva.
Por ejemplo, un comando que establece la directiva de ejecución para el equipo local puede realizarse correctamente, pero la directiva de ejecución del usuario actual puede invalidarla.
Eliminación de la directiva de ejecución
Para quitar la directiva de ejecución de un ámbito determinado, establezca la directiva de ejecución en Undefined .
Por ejemplo, para quitar la directiva de ejecución para todos los usuarios del equipo local:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
Para quitar la directiva de ejecución de Scope un :
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
Si no se establece ninguna directiva de ejecución en ningún ámbito, la directiva de ejecución efectiva es , que Restricted es el valor predeterminado para los clientes de Windows.
Establecer una directiva diferente para una sesión
Puede usar el parámetro ExecutionPolicy de pwsh.exe para establecer una directiva de ejecución para una nueva sesión de PowerShell. La directiva solo afecta a la sesión actual y a las sesiones secundarias.
Para establecer la directiva de ejecución para una nueva sesión, inicie PowerShell en la línea de comandos, como o desde PowerShell y, a continuación, use el parámetro ExecutionPolicy de para establecer la directiva cmd.exe de pwsh.exe ejecución.
Por ejemplo:
pwsh.exe -ExecutionPolicy AllSigned
La directiva de ejecución que establezca no se almacena en el Registro. En su lugar, se almacena en la $env:PSExecutionPolicyPreference variable de entorno . La variable se elimina al cerrar la sesión en la que se establece la directiva. No se puede cambiar la directiva editando el valor de la variable.
Durante la sesión, la directiva de ejecución que se establece para la sesión tiene prioridad sobre una directiva de ejecución establecida en el Registro para el equipo local o el usuario actual. Sin embargo, no tiene prioridad sobre la directiva de ejecución establecida mediante un directiva de grupo.
Uso directiva de grupo para administrar la directiva de ejecución
Puede usar la opción Activar la ejecución de scripts directiva de grupo para administrar la directiva de ejecución de los equipos de su empresa. La directiva de grupo configuración reemplaza las directivas de ejecución establecidas en PowerShell en todos los ámbitos.
La configuración de la directiva Activar ejecución de scripts es la siguiente:
Si deshabilita Activar la ejecución de scripts, los scripts no se ejecutarán. Esto equivale a la directiva Restricted de ejecución.
Si habilita Activar la ejecución de scripts, puede seleccionar una directiva de ejecución. La directiva de grupo configuración es equivalente a la siguiente configuración de directiva de ejecución:
Directiva de grupo Directiva de ejecución Permitir todos los scripts Unrestricted Permitir scripts locales y scripts remotos firmados RemoteSigned Permitir solo scripts firmados AllSigned Si activar la ejecución de scripts no está configurado, no tiene ningún efecto. La directiva de ejecución establecida en PowerShell es efectiva.
Los archivos PowerShellExecutionPolicy.adm y PowerShellExecutionPolicy.admx agregan la directiva Activar ejecución de scripts a los nodos Configuración del equipo y Configuración de usuario de directiva de grupo Editor en las rutas de acceso siguientes.
Para Windows XP y Windows Server 2003:
Administrative Templates\Windows Components\Windows PowerShell
Para Windows Vista y versiones posteriores de Windows:
Administrative Templates\Classic Administrative Templates\Windows Components\Windows PowerShell
Las directivas establecidas en el nodo Configuración del equipo tienen prioridad sobre las directivas establecidas en el nodo Configuración de usuario.
Para más información, consulte about_Group_Policy_Settings.
Prioridad de la directiva de ejecución
Al determinar la directiva de ejecución efectiva para una sesión, PowerShell evalúa las directivas de ejecución en el orden de precedencia siguiente:
Group Policy: MachinePolicy
Group Policy: UserPolicy
Execution Policy: Process (or pwsh.exe -ExecutionPolicy)
Execution Policy: CurrentUser
Execution Policy: LocalMachine
Administración de scripts firmados y sin firmar
En Windows, programas como Internet Explorer y Microsoft Edge un flujo de datos alternativo a los archivos que se descargan. Esto marca el archivo como "procedente de Internet". Si la directiva de ejecución de PowerShell es RemoteSigned, PowerShell no ejecutará scripts sin signo que se descarguen de Internet, lo que incluye programas de correo electrónico y mensajería instantánea.
Puede firmar el script o elegir ejecutar un script sin firmar sin cambiar la directiva de ejecución.
A partir de PowerShell 3.0, puede usar el parámetro Stream del cmdlet para detectar los archivos que están bloqueados porque se descargaron Get-Item de Internet. Use el Unblock-File cmdlet para desbloquear los scripts para que pueda ejecutarlos en PowerShell.
Para obtener más información, vea about_Signing, Get-Itemy Unblock-File.
Nota
Es posible que otros métodos de descarga de archivos no marquen los archivos como procedentes de la zona de Internet. Estos son algunos ejemplos:
curl.exeInvoke-RestMethodInvoke-WebRequest
Directiva de ejecución en Windows Server Core y Windows Nano Server
Cuando PowerShell 6 se ejecuta en Windows Server Core o Windows Nano Server en determinadas condiciones, las directivas de ejecución pueden producir el siguiente error:
AuthorizationManager check failed.
At line:1 char:1
+ C:\scriptpath\scriptname.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PowerShell usa las API del Shell de escritorio de Windows ( explorer.exe ) para validar la zona de un archivo de script. El Shell de Windows no está disponible en Windows Server Core y Windows Nano Server.
También podría obtener este error en cualquier sistema Windows si el Shell de escritorio de Windows no está disponible o no responde. Por ejemplo, durante el inicio de sesión, un script de inicio de sesión de PowerShell podría iniciar la ejecución antes de que el escritorio de Windows esté listo, lo que provocaría un error.
El uso de una directiva de ejecución de ByPass o AllSigned no requiere una comprobación de zona que evite el problema.