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 (Just Enough Administration) van PowerShell gebruiken NoLanguage
de modus om sessies alleen te beperken tot 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 wijze
De FullLanguage
modus staat alle taalelementen in de sessie toe.
FullLanguage
is de standaardtaalmodus voor standaardsessies in alle versies van Windows.
RestrictedLanguage wijze
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-Module
zijn 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 wijze
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 wijze
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.