Compartir a través de


about_Language_Modes

Descripción breve

Explica los modos de lenguaje y su efecto en las sesiones de PowerShell.

Descripción larga

El modo de idioma de una sesión de PowerShell determina qué elementos del lenguaje de PowerShell se pueden usar en la sesión.

PowerShell admite los siguientes modos de lenguaje:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (introducido en PowerShell 3.0)
  • NoLanguage

¿Qué es un modo de lenguaje?

El modo de idioma determina los elementos de idioma permitidos en la sesión.

El modo de idioma es una propiedad de la configuración de sesión (o "punto de conexión") que se usa para crear la sesión. Todas las sesiones que usan una configuración de sesión determinada tienen el modo de idioma de la configuración de sesión.

Todas las sesiones de PowerShell tienen un modo de lenguaje. Las sesiones se crean mediante las configuraciones de sesión en el equipo de destino. El modo de idioma establecido en la configuración de sesión determina el modo de idioma de la sesión. Para especificar la configuración de sesión de una PSSession, use el parámetro ConfigurationName de cmdlets que crean una sesión.

A partir de PowerShell 7.3, puede ejecutar pwsh con el parámetro ConfigurationFile de. Esto le permite iniciar PowerShell mediante una configuración específica.

Búsqueda del modo de idioma de una sesión

Puede encontrar el modo de idioma de una sesión de FullLanguage o ConstrainedLanguage obteniendo el valor de la propiedad LanguageMode del estado de sesión.

Por ejemplo:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

Sin embargo, en sesiones con modos de RestrictedLanguage y NoLanguage, no se puede usar el operador de acceso a miembros (.) para obtener valores de propiedad. En su lugar, el mensaje de error revela el modo de idioma.

Cuando se accede $ExecutionContext.SessionState.LanguageMode en una RestrictedLanguage sesión, PowerShell devuelve los mensajes de error PropertyReferenceNotSupportedInDataSection y VariableReferenceNotSupportedInDataSection .

  • PropertyReferenceNotSupportedInDataSection: las referencias de propiedad no se permiten en el modo de idioma restringido ni en una sección Datos.
  • VariableReferenceNotSupportedInDataSection: se hace referencia a una variable a la que no se puede hacer referencia en modo de idioma restringido o se hace referencia a una sección Data.

Cuando se accede $ExecutionContext.SessionState.LanguageMode en una NoLanguage sesión, PowerShell devuelve el mensaje de error ScriptsNotAllowed .

  • ScriptsNotAllowed: este espacio de ejecución no admite la sintaxis. Esto puede deberse a que está en modo sin lenguaje.

Búsqueda del modo de idioma de una configuración de sesión

Cuando se crea una configuración de sesión mediante un archivo de configuración de sesión, la configuración de sesión tiene una propiedad LanguageMode. Para encontrar el modo de idioma, obtenga el valor de propiedad LanguageMode.

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

En otras configuraciones de sesión, puede encontrar el modo de idioma indirectamente mediante la búsqueda del modo de idioma de una sesión que se crea mediante la configuración de sesión.

Establecimiento del modo de idioma

El modo de idioma en una sesión de PowerShell se puede establecer a través de la variable integrada $ExecutionContext.

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Sin embargo, hacerlo solo es útil para experimentar con modos de lenguaje. Los modos de lenguaje están diseñados para proporcionar seguridad agregada a las sesiones de PowerShell para contextos específicos.

Los modos de lenguaje se establecen cuando se usa una directiva de control de aplicaciones del sistema o se crea una configuración de sesión.

Uso de una directiva de control de aplicaciones del sistema

PowerShell se ejecuta automáticamente en modo ConstrainedLanguage cuando se ejecuta en una directiva de control de aplicaciones del sistema. Las directivas de control de aplicaciones detectadas son AppLocker y Control de aplicaciones de Windows Defender (WDAC) en plataformas Windows.

PowerShell aplica otras restricciones además de los modos de idioma cuando detecta una directiva de control de aplicaciones. Por ejemplo, hay restricciones adicionales para la importación de puntos y módulos en una directiva.

Cuando se inicia una sesión de PowerShell en una directiva, se ejecuta en modo ConstrainedLanguage. A partir de PowerShell 7.4, la presentación del banner de inicio incluye un mensaje que indica que se está ejecutando en ese modo. Esto permite a los usuarios tener una experiencia de shell interactiva utilizable, ejecutar cmdlets y comandos nativos, así como acceder a elementos de lenguaje básicos. Pero el usuario no puede acceder a las API de PowerShell, .NET o COM que podrían ser abusadas por un actor malintencionado.

Cualquier script o módulo basado en scripts ejecutado en esta sesión se ejecuta en modo ConstrainedLanguage. Sin embargo, cualquier script o módulo basado en scripts permitido por la directiva se ejecuta en modo FullLanguage sin restricciones. De este modo, un sistema bloqueado por directiva puede tener scripts de confianza para la directiva y ejecutarse con pocas restricciones.

Uso de una configuración de sesión

La comunicación remota de PowerShell admite opcionalmente la creación de configuraciones de sesión personalizadas. Puede establecer el modo de idioma que desee para esa configuración personalizada. Las configuraciones de Just Enough Administration (JEA) de PowerShell usan NoLanguage modo para restringir solo las sesiones a las invocaciones de comandos. Con JEA, la sesión remota se puede restringir a usuarios específicos. Los usuarios de JEA se limitan a ejecutar un conjunto definido de comandos y no pueden acceder directamente a las API, al sistema de archivos ni a otros recursos del sistema.

Para obtener más información, consulte configuraciones de sesión de JEA y New-PSSessionConfigurationFile.

Características y limitaciones del modo de lenguaje

En esta sección se describen los modos de lenguaje en las sesiones de PowerShell.

modo FullLanguage

El modo FullLanguage permite todos los elementos de idioma de la sesión. FullLanguage es el modo de idioma predeterminado para las sesiones predeterminadas en todas las versiones de Windows.

modo RestrictedLanguage

En RestrictedLanguage modo, los usuarios pueden ejecutar comandos (cmdlets, funciones, comandos CIM y flujos de trabajo), pero no pueden usar scriptsblocks. Este modo también se usa para procesar manifiestos de módulos cargados por Import-Module.

A partir de PowerShell 7.2, el cmdlet New-Object se deshabilita en modo RestrictedLanguage cuando se configura el bloqueo del sistema.

De forma predeterminada, solo se permiten las siguientes variables en modo RestrictedLanguage:

  • $PSCulture
  • $PSUICulture
  • $true
  • $false
  • $null

Los manifiestos de módulo se cargan en modo RestrictedLanguage y pueden usar estas variables adicionales:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Cualquier variable de entorno, como $env:TEMP

Solo se permiten los siguientes operadores de comparación:

  • -eq (igual)
  • -gt (mayor que)
  • -lt (menor que)

No se permiten instrucciones de asignación, referencias de propiedad ni llamadas a métodos.

modo ConstrainedLanguage

ConstrainedLanguage modo está diseñado para permitir elementos de lenguaje básicos, como bucles, condicionales, expansión de cadenas y acceso a propiedades de objeto. Las restricciones impiden las operaciones que podrían ser abusadas por un actor malintencionado.

El modo ConstrainedLanguage permite todos los cmdlets y un subconjunto de elementos de lenguaje de PowerShell, pero limita los tipos de objeto que se pueden usar.

Las características del modo ConstrainedLanguage son las siguientes:

  • Todos los cmdlets de los módulos de Windows son totalmente funcionales y tienen acceso completo a los recursos del sistema, excepto como se indica.
  • Se permiten todos los elementos del lenguaje de scripting de PowerShell.
  • Todos los módulos incluidos en Windows se pueden importar y todos los comandos que los módulos exportan se ejecutan en la sesión.
  • El cmdlet Add-Type puede cargar ensamblados firmados, pero no puede cargar código arbitrario de C# ni API de Win32.
  • El cmdlet New-Object solo se puede usar en tipos permitidos (enumerados a continuación).
  • Solo se pueden usar tipos permitidos en PowerShell. No se permiten otros tipos. Se permite la conversión de tipos, pero solo cuando el resultado es un tipo permitido.
  • Los parámetros de cmdlet que convierten la entrada de cadena en tipos solo funcionan cuando el tipo resultante es un tipo permitido.
  • Se puede invocar el método ToString() y los métodos .NET de tipos permitidos.
  • Los usuarios pueden obtener todas las propiedades de los tipos permitidos. Los usuarios solo pueden establecer los valores de las propiedades en los tipos permitidos.

Importante

Debe usar ConstrainedLanguage el modo en modo bloqueo del sistema con App Control para empresas para asegurarse de que ConstrainedLanguage no se puede omitir el modo. Para obtener más información sobre cómo PowerShell admite AppLocker y App Control, consulte Uso del control de aplicaciones para proteger PowerShell.

Los siguientes tipos de .NET se permiten en modo ConstrainedLanguage. Los usuarios pueden obtener propiedades, invocar métodos y convertir objetos en estos tipos.

Tipos permitidos:

  • [adsi] (solo Windows)
  • [adsisearcher] (solo Windows)
  • [Alias]
  • [AllowEmptyCollection]
  • [AllowEmptyString]
  • [AllowNull]
  • [ArgumentCompleter]
  • [ArgumentCompletions]
  • [array]
  • [bigint]
  • [bool]
  • [byte]
  • [char]
  • [cimclass]
  • [cimconverter]
  • [ciminstance]
  • [CimSession]
  • [cimtype]
  • [CmdletBinding]
  • [cultureinfo]
  • [datetime]
  • [decimal]
  • [double]
  • [DscLocalConfigurationManager]
  • [DscProperty]
  • [DscResource]
  • [ExperimentAction]
  • [Experimental]
  • [ExperimentalFeature]
  • [float]
  • [guid]
  • [hashtable]
  • [int]
  • [int16]
  • [int32]
  • [int64]
  • [ipaddress]
  • [IPEndpoint]
  • [long]
  • [mailaddress]
  • [Microsoft.PowerShell.Commands.ModuleSpecification]
  • [NoRunspaceAffinity]
  • [NullString]
  • [Object[]]
  • [ObjectSecurity]
  • [ordered]
  • [OutputType]
  • [Parameter]
  • [PhysicalAddress]
  • [pscredential]
  • [pscustomobject]
  • [PSDefaultValue]
  • [pslistmodifier]
  • [psobject]
  • [psprimitivedictionary]
  • [PSTypeNameAttribute]
  • [regex]
  • [sbyte]
  • [securestring]
  • [semver]
  • [short]
  • [single]
  • [string]
  • [SupportsWildcards]
  • [switch]
  • [timespan]
  • [uint]
  • [uint16]
  • [uint32]
  • [uint64]
  • [ulong]
  • [uri]
  • [ushort]
  • [ValidateCount]
  • [ValidateDrive]
  • [ValidateLength]
  • [ValidateNotNull]
  • [ValidateNotNullOrEmpty]
  • [ValidateNotNullOrWhiteSpace]
  • [ValidatePattern]
  • [ValidateRange]
  • [ValidateScript]
  • [ValidateSet]
  • [ValidateTrustedData]
  • [ValidateUserDrive]
  • [version]
  • [void]
  • [WildcardPattern]
  • [wmi] (solo Windows)
  • [wmiclass] (solo Windows)
  • [wmisearcher] (solo Windows)
  • [X500DistinguishedName]
  • [X509Certificate]
  • [xml]

Solo se permiten los siguientes tipos de objeto COM:

  • Scripting.Dictionary
  • Scripting.FileSystemObject
  • VBScript.RegExp

Casos especiales:

  • [ref] - No se permite convertir un objeto en el tipo [ref] o [Management.Automation.PSReference] no. Se permiten otros usos.

modo NoLanguage

El modo de NoLanguage de PowerShell deshabilita completamente el lenguaje de scripting de PowerShell. No se pueden ejecutar scripts ni usar variables. Solo puede ejecutar comandos y cmdlets nativos.

A partir de PowerShell 7.2, el cmdlet New-Object se deshabilita en modo NoLanguage cuando se configura el bloqueo del sistema.

Consulte también