about_Language_Modes

Korte beschrijving

Hierin worden taalmodi en hun effect op PowerShell-sessies uitgelegd.

Lange beschrijving

De taalmodus van een PowerShell-sessie bepaalt welke elementen van de PowerShell-taal in de sessie kunnen worden gebruikt.

PowerShell ondersteunt de volgende taalmodi:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (geïntroduceerd in PowerShell 3.0)
  • NoLanguage

Wat is een taalmodus?

De taalmodus bepaalt de taalelementen die zijn toegestaan in de sessie.

De taalmodus is een eigenschap van de sessieconfiguratie (of 'eindpunt') die wordt gebruikt om de sessie te maken. Alle sessies die een bepaalde sessieconfiguratie gebruiken, hebben de taalmodus van de sessieconfiguratie.

Alle PowerShell-sessies hebben een taalmodus. Sessies worden gemaakt met behulp van de sessieconfiguraties op de doelcomputer. De taalmodus die in de sessieconfiguratie is ingesteld, bepaalt de taalmodus van de sessie. Als u de sessieconfiguratie van een PSSession wilt opgeven, gebruikt u de ConfigurationName-parameter van cmdlets die een sessie maken.

Vanaf PowerShell 7.3 kunt u uitvoeren pwsh met de parameter ConfigurationFile . Hiermee kunt u PowerShell starten met behulp van een specifieke configuratie.

De taalmodus van een sessie zoeken

U kunt de taalmodus van een FullLanguage of ConstrainedLanguage sessie vinden door de waarde van de eigenschap LanguageMode van de sessiestatus op te halen.

Voorbeeld:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

In sessies met RestrictedLanguage en NoLanguage modi kunt u echter niet de operator voor lidtoegang (.) gebruiken om eigenschapswaarden op te halen. In plaats daarvan wordt in het foutbericht de taalmodus weergegeven.

Wanneer u de $ExecutionContext.SessionState.LanguageMode opdracht in een RestrictedLanguage sessie uitvoert, retourneert PowerShell de foutberichten PropertyReferenceNotSupportedInDataSection en VariableReferenceNotSupportedInDataSection .

  • PropertyReferenceNotSupportedInDataSection: Eigenschapsverwijzingen zijn niet toegestaan in de modus beperkte taal of in een sectie Gegevens.
  • VariableReferenceNotSupportedInDataSection: er wordt verwezen naar een variabele waarnaar niet kan worden verwezen in de modus voor beperkte taal of naar een sectie Gegevens.

Wanneer u de $ExecutionContext.SessionState.LanguageMode opdracht in een NoLanguage sessie uitvoert, retourneert PowerShell het foutbericht ScriptsNotAllowed .

  • ScriptsNotAllowed: De syntaxis wordt niet ondersteund door deze runspace. Dit kan komen doordat deze zich in de modus zonder taal bevindt.

De taalmodus van een sessieconfiguratie zoeken

Wanneer een sessieconfiguratie wordt gemaakt met behulp van een sessieconfiguratiebestand, heeft de sessieconfiguratie een LanguageMode-eigenschap . U kunt de taalmodus vinden door de waarde van de eigenschap LanguageMode op te halen.

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

In andere sessieconfiguraties kunt u de taalmodus indirect vinden door de taalmodus te vinden van een sessie die is gemaakt met behulp van de sessieconfiguratie.

De taalmodus instellen

De taalmodus in een PowerShell-sessie $ExecutionContext kan worden ingesteld via de ingebouwde variabele.

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Dit is echter alleen nuttig voor het experimenteren met taalmodi. Taalmodi zijn bedoeld om extra beveiliging te bieden voor PowerShell-sessies voor specifieke contexten.

Talenmodi worden ingesteld wanneer u een systeemtoepassingsbeheerbeleid gebruikt of een sessieconfiguratie maakt.

Een systeemtoepassingsbeheerbeleid gebruiken

PowerShell wordt automatisch uitgevoerd in ConstrainedLanguage de modus wanneer deze wordt uitgevoerd onder een systeemtoepassingsbeheerbeleid. Het gedetecteerde beleid voor toepassingsbeheer is AppLocker en Windows Defender Application Control (WDAC) op Windows-platforms.

PowerShell past andere beperkingen toe naast taalmodi wanneer een toepassingsbeheerbeleid wordt gedetecteerd. Er zijn bijvoorbeeld extra beperkingen voor het importeren van dot-sourcing en modules onder een beleid.

Wanneer een PowerShell-sessie wordt gestart onder een beleid, wordt deze uitgevoerd in ConstrainedLanguage de modus. Vanaf PowerShell 7.4 bevat de weergave van de opstartbanner een bericht dat aangeeft dat deze in die modus wordt uitgevoerd. Hierdoor kunnen gebruikers een bruikbare interactieve shell-ervaring hebben, cmdlets en systeemeigen opdrachten uitvoeren, evenals toegang tot basistaalelementen. Maar de gebruiker heeft geen toegang tot PowerShell-, .NET- of COM-API's die kunnen worden misbruikt door een kwaadwillende actor.

Elke script- of scriptmodule die in deze sessie wordt uitgevoerd, wordt uitgevoerd in ConstrainedLanguage de modus. Elke door het beleid toegestane script- of scriptmodule wordt echter zonder beperkingen uitgevoerd in FullLanguage de modus. Op deze manier kan een systeem dat is vergrendeld door beleid scripts bevatten die worden vertrouwd door het beleid en met weinig beperkingen worden uitgevoerd.

Een sessieconfiguratie gebruiken

Externe communicatie met PowerShell biedt optioneel ondersteuning voor het maken van aangepaste sessieconfiguraties. U kunt de gewenste taalmodus voor die aangepaste configuratie instellen. UA-configuraties (PowerShell Just Enough Beheer istration) gebruiken NoLanguage de modus om sessies te beperken tot alleen aanroepen van opdrachten. Met JEA kan de externe sessie worden beperkt tot specifieke gebruikers. De JEA-gebruikers zijn beperkt tot het uitvoeren van een gedefinieerde set opdrachten en hebben geen rechtstreeks toegang tot API's, het bestandssysteem of andere systeembronnen.

Zie JEA-sessieconfiguraties en New-PSSessionConfigurationFile voor meer informatie.

Taalmodusfuncties en -beperkingen

In deze sectie worden de taalmodi in PowerShell-sessies beschreven.

FullLanguage Modus

De FullLanguage modus staat alle taalelementen in de sessie toe. FullLanguage is de standaardtaalmodus voor standaardsessies in alle versies van Windows.

RestrictedLanguage Modus

In RestrictedLanguage de modus kunnen gebruikers opdrachten uitvoeren (cmdlets, functies, CIM-opdrachten en werkstromen), maar kunnen ze geen scriptblokken gebruiken. Deze modus wordt ook gebruikt voor het verwerken van modulesmanifesten die door Import-Modulezijn geladen.

Vanaf PowerShell 7.2 wordt de cmdlet uitgeschakeld in RestrictedLanguage de New-Object modus wanneer systeemvergrendeling is geconfigureerd.

Standaard zijn alleen de volgende variabelen toegestaan in RestrictedLanguage de modus:

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

Modulemanifesten worden geladen in RestrictedLanguage de modus en kunnen gebruikmaken van deze aanvullende variabelen:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Omgevingsvariabelen, zoals $ENV:TEMP

Alleen de volgende vergelijkingsoperatoren zijn toegestaan:

  • -eq (gelijk aan)
  • -gt (groter dan)
  • -lt (kleiner dan)

Toewijzingsinstructies, eigenschapsverwijzingen en methode-aanroepen zijn niet toegestaan.

ConstrainedLanguage Modus

ConstrainedLanguage de modus is ontworpen om basistaalelementen zoals lussen, voorwaarden, tekenreeksuitbreiding en toegang tot objecteigenschappen toe te staan. De beperkingen verhinderen bewerkingen die kunnen worden misbruikt door een kwaadwillende actor.

De ConstrainedLanguage modus staat alle cmdlets en een subset van PowerShell-taalelementen toe, maar beperkt de objecttypen die kunnen worden gebruikt.

De functies van ConstrainedLanguage de modus zijn als volgt:

  • Alle cmdlets in Windows-modules zijn volledig functioneel en hebben volledige toegang tot systeembronnen, behalve zoals vermeld.
  • Alle elementen van de PowerShell-scripttaal zijn toegestaan.
  • Alle modules die zijn opgenomen in Windows, kunnen worden geïmporteerd en alle opdrachten die door de modules worden geëxporteerd in de sessie.
  • De Add-Type cmdlet kan ondertekende assembly's laden, maar kan geen willekeurige C#-code of Win32-API's laden.
  • De New-Object cmdlet kan alleen worden gebruikt voor toegestane typen (hieronder vermeld).
  • Alleen toegestane typen kunnen worden gebruikt in PowerShell. Andere typen zijn niet toegestaan. Typeconversie is toegestaan, maar alleen wanneer het resultaat een toegestaan type is.
  • Cmdlet-parameters waarmee tekenreeksinvoer wordt geconverteerd naar typen, werken alleen wanneer het resulterende type een toegestaan type is.
  • De ToString() methode en de .NET-methoden van toegestane typen kunnen worden aangeroepen.
  • Gebruikers kunnen alle eigenschappen van toegestane typen ophalen. Gebruikers kunnen de waarden van eigenschappen alleen instellen voor toegestane typen.

De volgende .NET-typen zijn toegestaan in ConstrainedLanguage de modus. Gebruikers kunnen eigenschappen ophalen, methoden aanroepen en objecten naar deze typen converteren.

Toegestane typen:

  • [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]

Alleen de volgende COM-objecttypen zijn toegestaan:

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

NoLanguage Modus

In de PowerShell-modus wordt de taal voor PowerShell-scripts NoLanguage volledig uitgeschakeld. U kunt geen scripts uitvoeren of variabelen gebruiken. U kunt alleen systeemeigen opdrachten en cmdlets uitvoeren.

Vanaf PowerShell 7.2 wordt de cmdlet uitgeschakeld in NoLanguage de New-Object modus wanneer systeemvergrendeling is geconfigureerd.

Zie ook