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 Administración Just Enough (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.