about_Language_Modes

Descrição breve

Explica os modos de idioma e seu efeito nas sessões do PowerShell.

Descrição longa

O modo de idioma de uma sessão do PowerShell determina quais elementos da linguagem do PowerShell podem ser usados na sessão.

O PowerShell oferece suporte aos seguintes modos de idioma:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (introduzido no PowerShell 3.0)
  • NoLanguage

O que é um modo de idioma?

O modo de idioma determina os elementos de idioma permitidos na sessão.

O modo de idioma é uma propriedade da configuração da sessão (ou "ponto de extremidade") usada para criar a sessão. Todas as sessões que usam uma configuração de sessão específica têm o modo de idioma da configuração da sessão.

Todas as sessões do PowerShell têm um modo de idioma. As sessões são criadas usando as configurações de sessão no computador de destino. O modo de idioma definido na configuração da sessão determina o modo de idioma da sessão. Para especificar a configuração de sessão de um PSSession, use o parâmetro ConfigurationName dos cmdlets que criam uma sessão.

A partir do PowerShell 7.3, você pode executar pwsh com o parâmetro ConfigurationFile . Isso permite que você inicie o PowerShell usando uma configuração específica.

Localizando o modo de idioma de uma sessão

Você pode encontrar o modo de idioma de uma FullLanguage sessão ou ConstrainedLanguage obtendo o valor da propriedade LanguageMode do estado da sessão.

Por exemplo:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

No entanto, em sessões com RestrictedLanguage e NoLanguage modos, você não pode usar o operador de acesso de membro (.) para obter valores de propriedade. Em vez disso, a mensagem de erro revela o modo de idioma.

Quando você executa o comando em uma RestrictedLanguage sessão, o $ExecutionContext.SessionState.LanguageMode PowerShell retorna as mensagens de erro PropertyReferenceNotSupportedInDataSection e VariableReferenceNotSupportedInDataSection.

  • PropertyReferenceNotSupportedInDataSection: As referências de propriedade não são permitidas no modo de idioma restrito ou em uma seção de Dados.
  • VariableReferenceNotSupportedInDataSection: Uma variável que não pode ser referenciada no modo de idioma restrito ou uma seção Data está sendo referenciada.

Quando você executa o comando em uma NoLanguage sessão, o $ExecutionContext.SessionState.LanguageMode PowerShell retorna a mensagem de erro ScriptsNotAllowed.

  • ScriptsNotAllowed: A sintaxe não é suportada por este espaço de execução. Isso pode ser porque ele está no modo sem idioma.

Localizando o modo de idioma de uma configuração de sessão

Quando uma configuração de sessão é criada usando um arquivo de configuração de sessão, a configuração de sessão tem uma propriedade LanguageMode. Você pode encontrar o modo de idioma obtendo o valor da propriedade LanguageMode.

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

Em outras configurações de sessão, você pode encontrar o modo de idioma indiretamente localizando o modo de idioma de uma sessão criada usando a configuração de sessão.

Definindo o modo de idioma

O modo de idioma em uma sessão do PowerShell pode ser definido por meio da variável interna $ExecutionContext .

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

No entanto, fazer isso só é útil para experimentar modos de linguagem. Os modos de idioma destinam-se a fornecer segurança adicional às sessões do PowerShell para contextos específicos.

Os modos de idiomas são definidos quando você usa uma diretiva de controle de aplicativo do sistema ou cria uma configuração de sessão.

Usando uma política de controle de aplicativo do sistema

O PowerShell é executado automaticamente no modo quando está sendo executado sob ConstrainedLanguage uma política de controle de aplicativo do sistema. As diretivas de controle de aplicativo detectadas são AppLocker e WDAC (Windows Defender Application Control) em plataformas Windows.

O PowerShell aplica outras restrições além dos modos de idioma quando detecta uma política de controle de aplicativo. Por exemplo, há restrições adicionais ao dot-sourcing e à importação de módulos sob uma política.

Quando uma sessão do PowerShell é iniciada sob uma política, ela é executada no ConstrainedLanguage modo. A partir do PowerShell 7.4, a exibição do banner de inicialização inclui uma mensagem indicando que está sendo executado nesse modo. Isso permite que os usuários tenham uma experiência de shell interativo utilizável, executando cmdlets e comandos nativos, bem como acesso a elementos básicos de linguagem. Mas o usuário não pode acessar APIs do PowerShell, .NET ou COM que possam ser abusadas por um ator mal-intencionado.

Qualquer script ou módulo baseado em script executado nesta sessão é executado no ConstrainedLanguage modo. No entanto, qualquer script ou módulo baseado em script permitido pela política é executado no FullLanguage modo sem quaisquer restrições. Dessa forma, um sistema bloqueado pela política pode ter scripts confiáveis para a política e executados com poucas restrições.

Usando uma configuração de sessão

A comunicação remota do PowerShell opcionalmente dá suporte à criação de configurações de sessão personalizadas. Você pode definir o modo de idioma desejado para essa configuração personalizada. As configurações do PowerShell Just Enough Administration (JEA) usam NoLanguage o modo para restringir as sessões somente a chamadas de comando. Com o JEA, a sessão remota pode ser restrita a usuários específicos. Os usuários do JEA estão limitados a executar um conjunto definido de comandos e não podem acessar diretamente as APIs, o sistema de arquivos ou outros recursos do sistema.

Para obter mais informações, consulte Configurações de sessão JEA e New-PSSessionConfigurationFile.

Recursos e limitações do modo de idioma

Esta seção descreve os modos de idioma em sessões do PowerShell.

FullLanguage modo

O FullLanguage modo permite todos os elementos de linguagem na sessão. FullLanguage é o modo de idioma padrão para sessões padrão em todas as versões do Windows.

RestrictedLanguage modo

No RestrictedLanguage modo, os usuários podem executar comandos (cmdlets, funções, comandos CIM e fluxos de trabalho), mas não podem usar blocos de script. Esse modo também é usado para processar manifestos de módulos carregados pelo Import-Module.

A partir do PowerShell 7.2, o cmdlet é desabilitado no RestrictedLanguage modo quando o New-Object bloqueio do sistema é configurado.

Por padrão, somente as seguintes variáveis são permitidas no RestrictedLanguage modo:

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

Os manifestos de módulo são carregados no RestrictedLanguage modo e podem usar estas variáveis adicionais:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Quaisquer variáveis de ambiente, como $ENV:TEMP

Apenas os seguintes operadores de comparação são permitidos:

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

Instruções de atribuição, referências de propriedade e chamadas de método não são permitidas.

ConstrainedLanguage modo

ConstrainedLanguage é projetado para permitir elementos básicos de linguagem, como loops, condicionais, expansão de cadeia de caracteres e acesso a propriedades de objeto. As restrições impedem operações que possam ser abusadas por um ator mal-intencionado.

O ConstrainedLanguage modo permite todos os cmdlets e um subconjunto de elementos de linguagem do PowerShell, mas limita os tipos de objeto que podem ser usados.

Os recursos do ConstrainedLanguage modo são os seguintes:

  • Todos os cmdlets nos módulos do Windows são totalmente funcionais e têm acesso completo aos recursos do sistema, exceto conforme observado.
  • Todos os elementos da linguagem de script do PowerShell são permitidos.
  • Todos os módulos incluídos no Windows podem ser importados e todos os comandos que os módulos exportam são executados na sessão.
  • O Add-Type cmdlet pode carregar assemblies assinados, mas não pode carregar código C# arbitrário ou APIs Win32.
  • O New-Object cmdlet pode ser usado somente em tipos permitidos (listados abaixo).
  • Somente tipos permitidos podem ser usados no PowerShell. Outros tipos não são permitidos. A conversão de tipo é permitida, mas somente quando o resultado é um tipo permitido.
  • Os parâmetros de cmdlet que convertem a entrada de cadeia de caracteres em tipos funcionam somente quando o tipo resultante é um tipo permitido.
  • O ToString() método e os métodos .NET de tipos permitidos podem ser chamados.
  • Os usuários podem obter todas as propriedades dos tipos permitidos. Os usuários podem definir os valores das propriedades somente em tipos permitidos.

Os seguintes tipos .NET são permitidos no ConstrainedLanguage modo. Os usuários podem obter propriedades, invocar métodos e converter objetos para esses 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]

Somente os seguintes tipos de objeto COM são permitidos:

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

NoLanguage modo

O modo do PowerShell NoLanguage desabilita completamente a linguagem de script do PowerShell. Você não pode executar scripts ou usar variáveis. Você só pode executar comandos e cmdlets nativos.

A partir do PowerShell 7.2, o cmdlet é desabilitado no NoLanguage modo quando o New-Object bloqueio do sistema é configurado.

Confira também