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 . 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 FullLanguage sesión 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 RestrictedLanguage modos 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.

Al ejecutar el $ExecutionContext.SessionState.LanguageMode comando 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 De datos.
  • VariableReferenceNotSupportedInDataSection: se hace referencia a una variable a la que no se puede hacer referencia en modo de idioma restringido o a una sección Data.

Al ejecutar el $ExecutionContext.SessionState.LanguageMode comando en una NoLanguage sesión, PowerShell devuelve el mensaje de error ScriptsNotAllowed .

  • ScriptsNotAllowed: esta sintaxis no es compatible con este espacio de ejecución. 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 . Puede encontrar el modo de idioma obteniendo el valor de la 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 ConstrainedLanguage modo 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 ConstrainedLanguage modo . 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 ConstrainedLanguage modo. Sin embargo, cualquier script o módulo basado en scripts permitido por la directiva se ejecuta en FullLanguage modo 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 Administración istration (JEA) de PowerShell usan NoLanguage el 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.

FullLanguage Modo

El FullLanguage modo 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.

RestrictedLanguage Modo

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

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

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

  • $PSCulture
  • $PSUICulture
  • $True
  • $False
  • $Null

Los manifiestos de módulo se cargan en RestrictedLanguage modo 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.

ConstrainedLanguage Modo

ConstrainedLanguage el 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 ConstrainedLanguage modo permite todos los cmdlets y un subconjunto de elementos del lenguaje de PowerShell, pero limita los tipos de objeto que se pueden usar.

Las características del ConstrainedLanguage modo 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 Add-Type cmdlet puede cargar ensamblados firmados, pero no puede cargar código arbitrario de C# ni API de Win32.
  • El New-Object cmdlet 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 ToString() método 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.

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

Tipos permitidos:

  • [adsi]
  • [adsisearcher]
  • [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]
  • [ref]
  • [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]
  • [wmiclass]
  • [wmisearcher]
  • [X500DistinguishedName]
  • [X509Certificate]
  • [xml]

Solo se permiten los siguientes tipos de objeto COM:

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

NoLanguage Modo

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

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

Consulte también