about_Language_Modes

Kurze Beschreibung

Erläutert Sprachmodi und deren Auswirkungen auf PowerShell-Sitzungen.

Lange Beschreibung

Der Sprachmodus einer PowerShell-Sitzung bestimmt, welche Elemente der PowerShell-Sprache in der Sitzung verwendet werden können.

PowerShell unterstützt die folgenden Sprachmodi:

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (eingeführt in PowerShell 3.0)
  • NoLanguage

Was ist ein Sprachmodus?

Der Sprachmodus bestimmt die Sprachelemente, die in der Sitzung zulässig sind.

Der Sprachmodus ist eine Eigenschaft der Sitzungskonfiguration (oder "Endpunkt"), die zum Erstellen der Sitzung verwendet wird. Alle Sitzungen, die eine bestimmte Sitzungskonfiguration verwenden, weisen den Sprachmodus der Sitzungskonfiguration auf.

Alle PowerShell-Sitzungen verfügen über einen Sprachmodus. Sitzungen werden mithilfe der Sitzungskonfigurationen auf dem Zielcomputer erstellt. Der in der Sitzungskonfiguration festgelegte Sprachmodus bestimmt den Sprachmodus der Sitzung. Verwenden Sie zum Angeben der Sitzungskonfiguration einer PSSession den ConfigurationName-Parameter von Cmdlets, die eine Sitzung erstellen.

Ab PowerShell 7.3 können Sie mit dem Parameter ConfigurationFile ausführenpwsh. Auf diese Weise können Sie PowerShell mit einer bestimmten Konfiguration starten.

Suchen des Sprachmodus einer Sitzung

Sie finden den Sprachmodus einer FullLanguage oder ConstrainedLanguage einer Sitzung, indem Sie den Wert der LanguageMode-Eigenschaft des Sitzungszustands abrufen.

Zum Beispiel:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

In Sitzungen mit RestrictedLanguage und NoLanguage Modi können Sie den Memberzugriffsoperator (.) jedoch nicht verwenden, um Eigenschaftswerte abzurufen. Stattdessen zeigt die Fehlermeldung den Sprachmodus an.

Wenn Sie den $ExecutionContext.SessionState.LanguageMode Befehl in einer RestrictedLanguage Sitzung ausführen, gibt PowerShell die Fehlermeldungen PropertyReferenceNotSupportedInDataSection und VariableReferenceNotSupportedInDataSection zurück.

  • PropertyReferenceNotSupportedInDataSection: Eigenschaftsverweise sind im eingeschränkten Sprachmodus oder in einem Datenabschnitt nicht zulässig.
  • VariableReferenceNotSupportedInDataSection: Auf eine Variable, auf die im Eingeschränkten Sprachmodus nicht verwiesen werden kann, oder auf einen Datenabschnitt wird verwiesen.

Wenn Sie den $ExecutionContext.SessionState.LanguageMode Befehl in einer NoLanguage Sitzung ausführen, gibt PowerShell die Fehlermeldung "ScriptsNotAllowed " zurück.

  • ScriptsNotAllowed: Die Syntax wird von diesem Runspace nicht unterstützt. Dies liegt möglicherweise daran, dass sie sich im Modus ohne Sprache befindet.

Suchen des Sprachmodus einer Sitzungskonfiguration

Wenn eine Sitzungskonfiguration mithilfe einer Sitzungskonfigurationsdatei erstellt wird, verfügt die Sitzungskonfiguration über eine LanguageMode-Eigenschaft . Sie finden den Sprachmodus, indem Sie den Wert der LanguageMode-Eigenschaft abrufen.

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

Bei anderen Sitzungskonfigurationen können Sie den Sprachmodus indirekt finden, indem Sie den Sprachmodus einer Sitzung finden, die mit der Sitzungskonfiguration erstellt wird.

Festlegen des Sprachmodus

Der Sprachmodus in einer PowerShell-Sitzung $ExecutionContext kann über die integrierte Variable festgelegt werden.

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

Dies ist jedoch nur für das Experimentieren mit Sprachmodi nützlich. Sprachmodi sollen PowerShell-Sitzungen für bestimmte Kontexte zusätzliche Sicherheit bieten.

Sprachenmodi werden festgelegt, wenn Sie eine Systemanwendungssteuerungsrichtlinie verwenden oder eine Sitzungskonfiguration erstellen.

Verwenden einer Systemanwendungssteuerungsrichtlinie

PowerShell wird automatisch im ConstrainedLanguage Modus ausgeführt, wenn sie unter einer Systemanwendungssteuerungsrichtlinie ausgeführt wird. Die erkannten Anwendungssteuerungsrichtlinien sind AppLocker und Windows Defender Application Control (WDAC) auf Windows-Plattformen.

PowerShell wendet andere Einschränkungen neben Sprachmodi an, wenn eine Anwendungssteuerungsrichtlinie erkannt wird. Es gibt z. B. zusätzliche Einschränkungen für dot-sourcing und Modulimporte unter einer Richtlinie.

Wenn eine PowerShell-Sitzung unter einer Richtlinie gestartet wird, wird sie im ConstrainedLanguage Modus ausgeführt. Ab PowerShell 7.4 enthält die Anzeige des Startbanners eine Meldung, die angibt, dass sie in diesem Modus ausgeführt wird. Auf diese Weise können Benutzer über eine verwendbare interaktive Shellumgebung verfügen, Cmdlets und systemeigene Befehle ausführen sowie Zugriff auf grundlegende Sprachelemente. Der Benutzer kann jedoch nicht auf PowerShell-, .NET- oder COM-APIs zugreifen, die von einem böswilligen Akteur missbraucht werden könnten.

Jedes skriptbasierte oder skriptbasierte Modul, das in dieser Sitzung ausgeführt wird, wird im ConstrainedLanguage Modus ausgeführt. Jedes skript- oder skriptbasierte Modul, das von der Richtlinie zugelassen wird, wird jedoch ohne Einschränkungen im FullLanguage Modus ausgeführt. Auf diese Weise kann ein durch die Richtlinie gesperrtes System Skripts aufweisen, die von der Richtlinie als vertrauenswürdig eingestuft und mit wenigen Einschränkungen ausgeführt werden.

Verwenden einer Sitzungskonfiguration

PowerShell-Remoting unterstützt optional das Erstellen von benutzerdefinierten Sitzungskonfigurationen. Sie können den gewünschten Sprachmodus für diese benutzerdefinierte Konfiguration festlegen. PowerShell Just Enough Administration (JEA)-Konfigurationen verwenden NoLanguage den Modus, um Sitzungen nur auf Befehlsaufrufe zu beschränken. Mit JEA kann die Remotesitzung auf bestimmte Benutzer beschränkt werden. Die JEA-Benutzer sind auf die Ausführung einer definierten Gruppe von Befehlen beschränkt und können nicht direkt auf APIs, das Dateisystem oder andere Systemressourcen zugreifen.

Weitere Informationen finden Sie unter JEA-Sitzungskonfigurationen und New-PSSessionConfigurationFile.

Features und Einschränkungen für den Sprachmodus

In diesem Abschnitt werden die Sprachmodi in PowerShell-Sitzungen beschrieben.

FullLanguage Modus

Der FullLanguage Modus lässt alle Sprachelemente in der Sitzung zu. FullLanguage ist der Standardsprachenmodus für Standardsitzungen in allen Versionen von Windows.

RestrictedLanguage Modus

Im RestrictedLanguage Modus können Benutzer Befehle (Cmdlets, Funktionen, CIM-Befehle und Workflows) ausführen, skriptblöcke jedoch nicht verwenden. Dieser Modus wird auch zum Verarbeiten von Modulmanifesten verwendet, die von Import-Module.

Ab PowerShell 7.2 ist das New-Object Cmdlet im RestrictedLanguage Modus deaktiviert, wenn die Systemsperre konfiguriert ist.

Standardmäßig sind nur die folgenden Variablen im RestrictedLanguage Modus zulässig:

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

Modulmanifeste werden im RestrictedLanguage Modus geladen und können diese zusätzlichen Variablen verwenden:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • Beliebige Umgebungsvariablen, z. B. $ENV:TEMP

Es sind nur die folgenden Vergleichsoperatoren zulässig:

  • -eq (gleich)
  • -gt (größer als)
  • -lt (kleiner als)

Zuordnungsanweisungen, Eigenschaftsverweise und Methodenaufrufe sind nicht zulässig.

ConstrainedLanguage Modus

ConstrainedLanguage der Modus ist so konzipiert, dass grundlegende Sprachelemente wie Schleifen, Bedingte, Zeichenfolgenerweiterung und Zugriff auf Objekteigenschaften zulässig sind. Die Einschränkungen verhindern Vorgänge, die von einem böswilligen Akteur missbraucht werden könnten.

Der ConstrainedLanguage Modus lässt alle Cmdlets und eine Teilmenge von PowerShell-Sprachelementen zu, beschränkt jedoch die Objekttypen, die verwendet werden können.

Die Features des ConstrainedLanguage Modus sind wie folgt:

  • Alle Cmdlets in Windows-Modulen sind voll funktionsfähig und haben vollständigen Zugriff auf Systemressourcen, außer wie angegeben.
  • Alle Elemente der PowerShell-Skriptsprache sind zulässig.
  • Alle in Windows enthaltenen Module können importiert werden und alle Befehle, die von den Modulen exportiert werden, in der Sitzung ausgeführt werden.
  • Das Add-Type Cmdlet kann signierte Assemblys laden, jedoch keinen beliebigen C#-Code oder Win32-APIs laden.
  • Das New-Object Cmdlet kann nur für zulässige Typen verwendet werden (siehe unten).
  • Nur zulässige Typen können in PowerShell verwendet werden. Andere Typen sind nicht zulässig. Die Typkonvertierung ist zulässig, aber nur, wenn das Ergebnis ein zulässiger Typ ist.
  • Cmdlet-Parameter, die Zeichenfolgeneingaben in Typen konvertieren, funktionieren nur, wenn der resultierende Typ ein zulässiger Typ ist.
  • Die ToString() Methode und die .NET-Methoden zulässiger Typen können aufgerufen werden.
  • Benutzer können alle Eigenschaften zulässiger Typen abrufen. Benutzer können die Werte von Eigenschaften nur für zulässige Typen festlegen.

Die folgenden .NET-Typen sind im ConstrainedLanguage Modus zulässig. Benutzer können Eigenschaften abrufen, Methoden aufrufen und Objekte in diese Typen konvertieren.

Zulässige 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]

Es sind nur die folgenden COM-Objekttypen zulässig:

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

NoLanguage Modus

Im PowerShell-Modus NoLanguage wird die PowerShell-Skriptingsprache vollständig deaktiviert. Sie können keine Skripte ausführen oder Variablen verwenden. Sie können nur systemeigene Befehle und Cmdlets ausführen.

Ab PowerShell 7.2 ist das New-Object Cmdlet im NoLanguage Modus deaktiviert, wenn die Systemsperre konfiguriert ist.

Siehe auch