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 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 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 y les impide infringirlas involuntariamente.

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 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 ejecución predeterminada.
    • Restricted para clientes de Windows.
    • RemoteSigned para servidores Windows.
  • RemoteSigned

    • Directiva de ejecución predeterminada 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 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 (.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 ámbito actual.
    • 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 directiva de ejecución predeterminada 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 .

Ámbito de la directiva de ejecución

Puede establecer una directiva de ejecución que solo sea efectiva en un ámbito determinado.

Los valores válidos para son , UserPolicy, Process, CurrentUser y LocalMachine. MachinePolicyScope LocalMachine es el valor predeterminado al establecer 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

    El Process ámbito solo afecta a la sesión actual de PowerShell. La directiva de ejecución se guarda en la variable $env:PSExecutionPolicyPreferencede entorno , 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 afecta solo al usuario actual. Se almacena en la subclave del Registro HKEY_CURRENT_USER .

  • LocalMachine

    La directiva de ejecución afecta a todos los usuarios del equipo actual. Se almacena en la subclave del Registro HKEY_LOCAL_MACHINE .

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 el conjunto de directivas de ejecución 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 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 Registro y permanece vigente 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 para el 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 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 ámbito determinado, 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 se establece ninguna directiva de ejecución en ningún ámbito, la directiva de ejecución efectiva es Restricted, que es el valor predeterminado para los 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 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 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.

Consulte también