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 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 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 Get-ExecutionPolicy devuelve en plataformas que no Windows, el comportamiento realmente coincide porque esas plataformas no implementan Unrestricted el Seguridad de Windows Bypass Zones.

Directivas de ejecución de PowerShell

La aplicación de estas directivas solo se produce en Windows plataformas. 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 Windows clientes.
  • RemoteSigned para Windows servidor.

RemoteSigned

  • Directiva de ejecución predeterminada para Windows servidores.
  • 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-File cmdlet .
  • 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 Windows equipos cliente.
  • 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 .psm1 perfiles 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 Windows clientes y Undefined Restricted RemoteSigned para Windows Server.

Unrestricted

  • La directiva de ejecución predeterminada para equipos que no 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 Windows equipo, 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 es el valor Restricted predeterminado para Windows clientes.

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.exe
  • Invoke-RestMethod
  • Invoke-WebRequest

Directiva de ejecución en Windows Server Core y Window 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 de Windows Desktop Shell ( ) para validar explorer.exe la zona de un archivo de script. El Windows Shell 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 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 Windows Desktop 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.

Vea también

about_Environment_Variables

about_Group_Policy_Settings

about_Signing

Get-ExecutionPolicy

Get-Item

about_Pwsh

Set-ExecutionPolicy

Unblock-File