Sdílet prostřednictvím


about_Language_Modes

Krátký popis

Vysvětluje režimy jazyka a jejich vliv na relace PowerShellu.

Dlouhý popis

Režim jazyka relace PowerShellu určuje, které prvky jazyka PowerShellu lze v relaci použít.

PowerShell podporuje následující režimy jazyka:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (zavedený v PowerShellu 3.0)
  • NoLanguage

Co je režim jazyka?

Režim jazyka určuje prvky jazyka, které jsou povoleny v relaci.

Režim jazyka je vlastnost konfigurace relace (neboli koncového bodu), která se používá k vytvoření relace. Všechny relace, které používají konkrétní konfiguraci relace, mají režim jazyka konfigurace relace.

Všechny relace PowerShellu mají režim jazyka. Relace se vytvářejí pomocí konfigurací relací v cílovém počítači. Režim jazyka nastavený v konfiguraci relace určuje režim jazyka relace. Pokud chcete zadat konfiguraci relace psSession, použijte parametr ConfigurationName rutin, které vytvářejí relaci.

Počínaje PowerShellem 7.3 můžete spustit pwsh s parametrem ConfigurationFile. To vám umožní spustit PowerShell pomocí konkrétní konfigurace.

Vyhledání jazykového režimu relace

Režim jazyka FullLanguage nebo relace ConstrainedLanguage můžete najít získáním hodnoty vlastnosti LanguageMode stavu relace.

Například:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

V relacích s režimy RestrictedLanguage a NoLanguage ale nemůžete k získání hodnot vlastností použít operátor přístupu členů (.). Místo toho chybová zpráva odhalí režim jazyka.

Při přístupu $ExecutionContext.SessionState.LanguageMode v RestrictedLanguage relaci Vrátí PowerShell PropertyReferenceNotSupportedInDataSection a VariableReferenceNotSupportedInDataSection chybové zprávy.

  • PropertyReferenceNotSupportedInDataSection: Odkazy na vlastnosti nejsou povoleny v režimu omezeného jazyka nebo v části Data.
  • VariableReferenceNotSupportedInDataSection: Proměnná, na kterou nelze odkazovat v režimu omezeného jazyka nebo na oddíl Data.

Při přístupu $ExecutionContext.SessionState.LanguageMode v NoLanguage relaci vrátí PowerShell chybovou zprávu ScriptsNotAllowed .

  • ScriptsNotAllowed: Tento runspace nepodporuje syntaxi. Důvodem může být to, že je v režimu bez jazyka.

Vyhledání jazykového režimu konfigurace relace

Při vytvoření konfigurace relace pomocí konfiguračního souboru relace má konfigurace relace vlastnost LanguageMode. Režim jazyka můžete najít získáním hodnoty vlastnosti LanguageMode.

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

V jiných konfiguracích relací můžete režim jazyka najít nepřímo vyhledáním jazykového režimu relace vytvořené pomocí konfigurace relace.

Nastavení jazykového režimu

Režim jazyka v relaci PowerShellu je možné nastavit prostřednictvím integrované $ExecutionContext proměnné.

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

To je ale užitečné jenom pro experimentování s režimy jazyka. Jazykové režimy jsou určené k zajištění přidaného zabezpečení relací PowerShellu pro konkrétní kontexty.

Režimy jazyků se nastaví při použití zásad řízení systémových aplikací nebo vytvoření konfigurace relace.

Použití zásad řízení systémových aplikací

PowerShell se automaticky spustí v ConstrainedLanguage režimu, když běží v zásadách řízení systémových aplikací. Zjištěné zásady řízení aplikací jsou AppLocker a Windows Defender Application Control (WDAC) na platformách Windows.

PowerShell použije další omezení kromě režimů jazyka, když zjistí zásady řízení aplikací. Existují například další omezení pro import dot-sourcing a modulů v rámci zásad.

Když se spustí relace PowerShellu v rámci zásad, spustí se v ConstrainedLanguage režimu. Od PowerShellu 7.4 obsahuje úvodní banner zprávu, která indikuje, že je spuštěná v daném režimu. To umožňuje uživatelům používat použitelné interaktivní prostředí, spouštění rutin a nativní příkazy a také přístup k základním prvkům jazyka. Uživatel ale nemůže získat přístup k rozhraním API powershellu, .NET nebo com, která by mohla zneužít škodlivý aktér.

Jakýkoli skript nebo modul založený na skriptech spuštěný v této relaci se spouští v režimu ConstrainedLanguage. Jakýkoli skript nebo modul založený na skriptech, které zásady povolují, se ale spouští v režimu FullLanguage bez jakýchkoli omezení. Díky tomu může mít systém uzamčený zásadami skripty, které zásady důvěřují, a spouštět s několika omezeními.

Použití konfigurace relace

Vzdálené komunikace PowerShellu volitelně podporuje vytváření vlastních konfigurací relací. Pro tuto vlastní konfiguraci můžete nastavit požadovaný režim jazyka. Konfigurace technologie PowerShell Just Enough Administration (JEA) používají režim NoLanguage k omezení relací pouze na vyvolání příkazů. U funkce JEA je možné vzdálenou relaci omezit na konkrétní uživatele. Uživatelé JEA jsou omezeni na spuštění definované sady příkazů a nemají přímý přístup k rozhraním API, systému souborů nebo jiným systémovým prostředkům.

Další informace naleznete v tématu konfigurace relace JEA a New-PSSessionConfigurationFile.

Funkce a omezení jazykového režimu

Tato část popisuje režimy jazyka v relacích PowerShellu.

režim FullLanguage

Režim FullLanguage povoluje všechny prvky jazyka v relaci. FullLanguage je výchozí režim jazyka pro výchozí relace ve všech verzích Windows.

režim RestrictedLanguage

V RestrictedLanguage režimu můžou uživatelé spouštět příkazy (rutiny, funkce, příkazy CIM a pracovní postupy), ale nemůžou používat skriptovací bloky. Tento režim se používá také ke zpracování manifestů modulů načtených Import-Module.

Počínaje PowerShellem 7.2 je rutina New-Object při konfiguraci uzamčení systému zakázaná v režimu RestrictedLanguage.

Ve výchozím nastavení jsou v režimu RestrictedLanguage povoleny pouze následující proměnné:

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

Manifesty modulů se načítají v režimu RestrictedLanguage a mohou používat tyto další proměnné:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Libovolná proměnná prostředí, například $env:TEMP

Jsou povoleny pouze následující relační operátory:

  • -eq (rovná se)
  • -gt (větší než)
  • -lt (menší než)

Příkazy přiřazení, odkazy na vlastnosti a volání metod nejsou povoleny.

režim ConstrainedLanguage

ConstrainedLanguage režim je navržený tak, aby umožňoval základní jazykové prvky, jako jsou smyčky, podmíněné výrazy, rozšíření řetězců a přístup k vlastnostem objektu. Omezení brání operacím, které by mohl zneužít škodlivý aktér.

Režim ConstrainedLanguage povoluje všechny rutiny a podmnožinu elementů jazyka PowerShellu, ale omezuje typy objektů, které je možné použít.

Funkce režimu ConstrainedLanguage jsou následující:

  • Všechny rutiny v modulech Windows jsou plně funkční a mají úplný přístup k systémovým prostředkům s výjimkou toho, jak je uvedeno.
  • Jsou povoleny všechny prvky skriptovacího jazyka PowerShellu.
  • Všechny moduly zahrnuté ve Windows je možné importovat a všechny příkazy, které moduly exportují v relaci.
  • Rutina Add-Type může načíst podepsaná sestavení, ale nemůže načíst libovolný kód jazyka C# nebo rozhraní API Win32.
  • Rutinu New-Object lze použít pouze u povolených typů (uvedených níže).
  • V PowerShellu je možné použít jenom povolené typy. Jiné typy nejsou povolené. Převod typu je povolen, ale pouze v případě, že je výsledkem povolený typ.
  • Parametry rutiny, které převádějí řetězcový vstup na typy, fungují pouze v případech, kdy je výsledný typ povolený.
  • Je možné vyvolat ToString() metodu a metody .NET povolených typů.
  • Uživatelé můžou získat všechny vlastnosti povolených typů. Uživatelé mohou nastavit hodnoty vlastností pouze u povolených typů.

Důležité

Pokud chcete zajistit, aby ConstrainedLanguage se tento režim nedá obejít, musíte použít ConstrainedLanguage režim v režimu Uzamčení systému s ovládacím prvek aplikace pro firmy. Další informace o tom, jak PowerShell podporuje AppLocker a Řízení aplikací, najdete v tématu Použití řízení aplikací k zabezpečení PowerShellu.

Následující typy .NET jsou povoleny v režimu ConstrainedLanguage. Uživatelé mohou získat vlastnosti, vyvolat metody a převést objekty na tyto typy.

Povolené typy:

  • [adsi] (jenom Windows)
  • [adsisearcher] (jenom 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] (jenom Windows)
  • [wmiclass] (jenom Windows)
  • [wmisearcher] (jenom Windows)
  • [X500DistinguishedName]
  • [X509Certificate]
  • [xml]

Jsou povoleny pouze následující typy objektů MODELU COM:

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

Zvláštní případy:

  • [ref] - Přetypování objektu na typ [ref] nebo [Management.Automation.PSReference] není povoleno. Ostatní použití jsou povolená.

režim NoLanguage

PowerShell NoLanguage režim úplně zakáže skriptovací jazyk PowerShellu. Nemůžete spouštět skripty ani používat proměnné. Můžete spouštět pouze nativní příkazy a rutiny.

Počínaje PowerShellem 7.2 je rutina New-Object při konfiguraci uzamčení systému zakázaná v režimu NoLanguage.

Viz také