about_Language_Modes

Kort beskrivning

Förklarar språklägen och deras effekt på PowerShell-sessioner.

Lång beskrivning

Språkläget för en PowerShell-session avgör vilka element i PowerShell-språket som kan användas i sessionen.

PowerShell stöder följande språklägen:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (introducerades i PowerShell 3.0)
  • NoLanguage

Vad är ett språkläge?

Språkläget avgör vilka språkelement som tillåts i sessionen.

Språkläget är en egenskap för sessionskonfigurationen (eller "slutpunkten") som används för att skapa sessionen. Alla sessioner som använder en viss sessionskonfiguration har språkläget för sessionskonfigurationen.

Alla PowerShell-sessioner har ett språkläge. Sessioner skapas med hjälp av sessionskonfigurationerna på måldatorn. Språkläget som anges i sessionskonfigurationen avgör sessionens språkläge. Om du vill ange sessionskonfigurationen för en PSSession använder du parametern ConfigurationName för cmdletar som skapar en session.

Från och med PowerShell 7.3 kan du köra pwsh med parametern ConfigurationFile . På så sätt kan du starta PowerShell med hjälp av en specifik konfiguration.

Hitta språkläget för en session

Du hittar språkläget för en eller ConstrainedLanguage en FullLanguage session genom att hämta värdet för egenskapen LanguageMode för sessionstillståndet.

Till exempel:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

I sessioner med RestrictedLanguage och NoLanguage lägen kan du dock inte använda operatorn för medlemsåtkomst (.) för att hämta egenskapsvärden. I stället visas språkläget i felmeddelandet.

När du kör $ExecutionContext.SessionState.LanguageMode kommandot i en RestrictedLanguage session returnerar PowerShell felmeddelandena PropertyReferenceNotSupportedInDataSection och VariableReferenceNotSupportedInDataSection .

  • PropertyReferenceNotSupportedInDataSection: Egenskapsreferenser tillåts inte i begränsat språkläge eller i ett dataavsnitt.
  • VariableReferenceNotSupportedInDataSection: En variabel som inte kan refereras i begränsat språkläge eller ett dataavsnitt refereras till.

När du kör $ExecutionContext.SessionState.LanguageMode kommandot i en NoLanguage session returnerar PowerShell felmeddelandet ScriptsNotAllowed .

  • ScriptsNotAllowed: Syntaxen stöds inte av det här körningsutrymmet. Det kan bero på att det är i läge utan språk.

Hitta språkläget för en sessionskonfiguration

När en sessionskonfiguration skapas med en sessionskonfigurationsfil har sessionskonfigurationen en LanguageMode-egenskap . Du hittar språkläget genom att hämta värdet för egenskapen LanguageMode .

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

I andra sessionskonfigurationer kan du hitta språkläget indirekt genom att hitta språkläget för en session som skapas med hjälp av sessionskonfigurationen.

Ange språkläge

Språkläget i en PowerShell-session kan ställas in via den inbyggda $ExecutionContext variabeln.

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Att göra detta är dock bara användbart för att experimentera med språklägen. Språklägen är avsedda att ge extra säkerhet till PowerShell-sessioner för specifika kontexter.

Språklägen anges när du använder en systemprogramkontrollprincip eller skapar en sessionskonfiguration.

Använda en systemprogramkontrollprincip

PowerShell körs automatiskt i ConstrainedLanguage läge när det körs under en systemprogramkontrollprincip. De programkontrollprinciper som identifieras är AppLocker och Windows Defender Application Control (WDAC) på Windows-plattformar.

PowerShell tillämpar andra begränsningar förutom språklägen när den identifierar en programkontrollprincip. Det finns till exempel ytterligare begränsningar för dot-sourcing och modulimport under en princip.

När en PowerShell-session startas under en princip körs den i ConstrainedLanguage läge. Det här läget möjliggör en användbar interaktiv gränssnittsupplevelse samtidigt som åtkomsten till funktioner och API:er som kan missbrukas av en illvillig aktör begränsas. Användare kan köra cmdletar och interna kommandon och ha åtkomst till grundläggande språkelement. Åtkomsten till PowerShell-, .NET- och COM-API:er är begränsad.

Alla skript- eller skriptbaserade moduler som körs i den här sessionen körs i ConstrainedLanguage läge. Alla skript- eller skriptbaserade moduler som tillåts av principen körs dock i FullLanguage läge utan några begränsningar. På så sätt kan ett system som är låst av en princip ha skript som är betrodda av principen och som körs med få begränsningar.

Använda en sessionskonfiguration

PowerShell-fjärrkommunikation kan också ha stöd för att skapa anpassade sessionskonfigurationer. Du kan ange det språkläge som du vill ha för den anpassade konfigurationen. Jea-konfigurationer (Just Enough Administration) i PowerShell använder NoLanguage läget för att begränsa sessioner till endast kommandoanrop. Med JEA kan fjärrsessionen begränsas till specifika användare. JEA-användarna är begränsade till att köra en definierad uppsättning kommandon och kan inte komma åt API:er, filsystemet eller andra systemresurser direkt.

Mer information finns i JEA-sessionskonfigurationer och New-PSSessionConfigurationFile.

Funktioner och begränsningar i språkläge

I det här avsnittet beskrivs språklägena i PowerShell-sessioner.

FullLanguage Läge

Läget FullLanguage tillåter alla språkelement i sessionen. FullLanguage är standardspråkläget för standardsessioner i alla versioner av Windows.

RestrictedLanguage Läge

I RestrictedLanguage läge kan användare köra kommandon (cmdletar, funktioner, CIM-kommandon och arbetsflöden), men kan inte använda skriptblock. Det här läget används också för att bearbeta modulmanifest som läses in av Import-Module.

Från och med PowerShell 7.2 inaktiveras cmdleten New-Object i RestrictedLanguage läge när systemlåsning har konfigurerats.

Som standard tillåts endast följande variabler i RestrictedLanguage läge:

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

Modulmanifest läses in i RestrictedLanguage läge och kan använda följande ytterligare variabler:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Alla miljövariabler, till exempel $ENV:TEMP

Endast följande jämförelseoperatorer är tillåtna:

  • -eq (lika)
  • -gt (större än)
  • -lt (mindre än)

Tilldelningsuttryck, egenskapsreferenser och metodanrop är inte tillåtna.

ConstrainedLanguage Läge

ConstrainedLanguage läget är utformat för att tillåta grundläggande språkelement som loopar, villkor, strängexpansion och åtkomst till objektegenskaper. Begränsningarna förhindrar åtgärder som kan missbrukas av en illvillig aktör.

Läget ConstrainedLanguage tillåter alla cmdletar och en delmängd av PowerShell-språkelement, men begränsar de objekttyper som kan användas.

ConstrainedLanguage Funktionerna i läget är följande:

  • Alla cmdletar i Windows-moduler är fullt funktionella och har fullständig åtkomst till systemresurser, förutom vad som anges.
  • Alla element i PowerShell-skriptspråket är tillåtna.
  • Alla moduler som ingår i Windows kan importeras och alla kommandon som modulerna exporterar körs i sessionen.
  • Cmdleten Add-Type kan läsa in signerade sammansättningar, men den kan inte läsa in godtycklig C#-kod eller Win32-API:er.
  • Cmdleten New-Object kan endast användas på tillåtna typer (visas nedan).
  • Endast tillåtna typer kan användas i PowerShell. Andra typer är inte tillåtna. Typkonvertering tillåts, men endast när resultatet är en tillåten typ.
  • Cmdlet-parametrar som konverterar strängindata till typer fungerar endast när den resulterande typen är en tillåten typ.
  • Metoden ToString() och .NET-metoderna för tillåtna typer kan anropas.
  • Användare kan hämta alla egenskaper för tillåtna typer. Användare kan endast ange egenskapernas värden för tillåtna typer.

Följande .NET-typer tillåts i ConstrainedLanguage läge. Användare kan hämta egenskaper, anropa metoder och konvertera objekt till dessa typer.

Tillåtna typer:

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

Endast följande COM-objekttyper tillåts:

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

NoLanguage Läge

PowerShell-läget NoLanguage inaktiverar PowerShell-skriptspråket helt. Du kan inte köra skript eller använda variabler. Du kan bara köra interna kommandon och cmdletar.

Från och med PowerShell 7.2 inaktiveras cmdleten New-Object i NoLanguage läge när systemlåsning har konfigurerats.

Se även