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 los archivos de configuración de PowerShell. No es necesario establecer directivas de ejecución en el perfil de PowerShell. La directiva de ejecución de una sesión determinada solo se almacena en memoria y se pierde cuando se cierra la sesión.
La directiva de ejecución no es un sistema de seguridad que restringe las acciones del usuario. Por ejemplo, los usuarios pueden escribir fácilmente bypass 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 y les impide infringirlas involuntariamente.
En equipos que no son Windows, la default directiva de ejecución es Unrestricted y no se puede cambiar. El Set-ExecutionPolicy
cmdlet está disponible, pero PowerShell muestra un mensaje de consola que no se admite. Aunque Get-ExecutionPolicy
devuelve Unrestricted en plataformas que no son de Windows, el comportamiento realmente coincide Bypass porque esas plataformas no implementan las Seguridad de Windows Zones.
Directivas de ejecución de PowerShell
El cumplimiento 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 pide antes de ejecutar scripts de publicadores que aún no ha clasificado como de confianza o que no es 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 mayor 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 default ejecución.
- Restricted para clientes de Windows.
- RemoteSigned para servidores Windows.
RemoteSigned
- Directiva default de ejecución para equipos con Windows Server.
- Los scripts se pueden ejecutar.
- Requiere una firma digital de un editor de confianza en scripts y archivos de configuración que se descargan desde Internet, lo que incluye programas de mensajería instantánea y correo electrónico.
- No requiere firmas digitales en scripts escritos en el equipo local y no descargados de Internet.
- Ejecuta scripts que se descargan de Internet y no están firmados, si los scripts se desbloquean, como mediante el
Unblock-File
cmdlet . - Riesgos para ejecutar scripts sin firmar desde orígenes distintos de Internet y scripts firmados que podrían ser malintencionados.
Restricted
- Directiva default de ejecución 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 (
.ps1xml
), los archivos de script de módulo (.psm1
) y los perfiles de PowerShell (.ps1
).
Undefined
- No hay ninguna directiva de ejecución establecida en el objeto actual scope.
- Si la directiva de ejecución en todos los ámbitos es Undefined, la directiva de ejecución efectiva es Restricted para los clientes de Windows y RemoteSigned para Windows Server.
Unrestricted
- La default directiva de ejecución para equipos que no son Windows y no se puede cambiar.
- Los scripts sin firmar se pueden ejecutar. Existe el riesgo de ejecutar scripts malintencionados.
- Advierte al usuario antes de ejecutar scripts y archivos de configuración que no proceden 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 a Internet, es posible que los scripts identificados por una ruta de acceso UNC no puedan ejecutarse con la directiva de ejecución RemoteSigned .
Directiva de ejecución scope
Puede establecer una directiva de ejecución que solo sea efectiva en un determinado scope.
Los valores válidos para son , UserPolicy, Process, CurrentUser y LocalMachine. MachinePolicyScope LocalMachine es cuando default se establece una directiva de ejecución.
Los Scope valores se enumeran en orden de prioridad. 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 precedencia.
Para obtener más información, vea Set-ExecutionPolicy.
MachinePolicy
Establezca por una directiva de grupo para todos los usuarios del equipo.
UserPolicy
Establezca por una directiva de grupo para el usuario actual del equipo.
Process
La Processscope única afecta a la sesión actual de PowerShell. La directiva de ejecución se guarda en la variable
$env:PSExecutionPolicyPreference
de entorno , en lugar del archivo de configuración. Cuando se cierra la sesión de PowerShell, se eliminan la variable y el valor.CurrentUser
La directiva de ejecución afecta solo al usuario actual. Se almacena en el archivo de configuración CurrentUser .
LocalMachine
La directiva de ejecución afecta a todos los usuarios del equipo actual. Se almacena en el archivo de configuración AllUsers .
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 prioridad:
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 determinado scope, use el Scope parámetro de Get-ExecutionPolicy
.
Por ejemplo, el siguiente comando obtiene la directiva de ejecución para CurrentUserscope:
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 entra en vigor 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 archivo de configuración y permanece vigente hasta que vuelva a cambiarlo.
Si establece la directiva de ejecución para Processscope, no se guarda en el archivo de configuración. La directiva de ejecución se conserva hasta que se cierran los procesos secundarios y actuales process .
Nota:
En Windows Vista y versiones posteriores de Windows, para ejecutar comandos que cambien la directiva de ejecución para el equipo local, LocalMachinescope, 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 determinado scope:
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 aún 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 se puede invalidar mediante la directiva de ejecución para el usuario actual.
Eliminación de la directiva de ejecución
Para quitar la directiva de ejecución de un determinado scope, establezca la directiva Undefinedde ejecución en .
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 un Scopeobjeto :
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
Si no hay ninguna directiva de ejecución establecida en , scopela directiva de ejecución efectiva es Restricted, que es para los default clientes de Windows.
Establecimiento de una directiva diferente para una sesión
Puede usar el parámetro ExecutionPolicy de para establecer una directiva de pwsh.exe
ejecución para una nueva sesión de PowerShell. La directiva afecta solo 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 cmd.exe
o desde PowerShell, y use el parámetro ExecutionPolicy de para establecer la directiva de pwsh.exe
ejecución.
Por ejemplo:
pwsh.exe -ExecutionPolicy AllSigned
La directiva de ejecución que establezca no se almacena en el archivo de configuración. 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 que se establece en el archivo de configuración del equipo local o el usuario actual. Sin embargo, no tiene prioridad sobre la directiva de ejecución establecida mediante una directiva de grupo.
Uso de directiva de grupo para administrar la directiva de ejecución
Puede usar la configuración de Directiva de grupo Activar ejecución de scripts para administrar la directiva de ejecución de los equipos de la empresa. La configuración de directiva de grupo invalida 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 ejecutan. Esto equivale a la directiva de Restricted ejecución.
Si habilita Activar ejecución de script, puede seleccionar una directiva de ejecución. La configuración de directiva de grupo 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 los scripts locales y los scripts firmados remotos RemoteSigned Permitir solo scripts firmados AllSigned Si no está configurada la opción Activar la ejecución de scripts, 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 del usuario en la 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 obtener más información, vea 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 prioridad siguiente:
Group Policy: MachinePolicy
Group Policy: UserPolicy
Execution Policy: Process (or pwsh.exe -ExecutionPolicy)
Execution Policy: LocalMachine
Execution Policy: CurrentUser
Administración de scripts firmados y sin firmar
En Windows, los programas como Internet Explorer y Microsoft Edge agregan 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 firmar que se descargan de Internet, lo que incluye programas de mensajería instantánea y correo electrónico.
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 Get-Item
cmdlet para detectar archivos bloqueados porque se descargaron desde 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-Item y 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.exe
Invoke-RestMethod
Invoke-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 api en el 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 puede 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.