about_Language_Modes
Krótki opis
Objaśnia tryby języka i ich wpływ na sesje programu PowerShell.
Długi opis
Tryb językowy sesji programu PowerShell określa, które elementy języka programu PowerShell mogą być używane w sesji.
Program PowerShell obsługuje następujące tryby językowe:
FullLanguage
RestrictedLanguage
ConstrainedLanguage
(wprowadzone w programie PowerShell 3.0)NoLanguage
Co to jest tryb językowy?
Tryb języka określa elementy języka, które są dozwolone w sesji.
Tryb językowy jest właściwością konfiguracji sesji (lub "punktu końcowego"), która jest używana do tworzenia sesji. Wszystkie sesje korzystające z określonej konfiguracji sesji mają tryb językowy konfiguracji sesji.
Wszystkie sesje programu PowerShell mają tryb językowy. Sesje są tworzone przy użyciu konfiguracji sesji na komputerze docelowym. Tryb językowy ustawiony w konfiguracji sesji określa tryb językowy sesji. Aby określić konfigurację sesji programu PSSession, użyj parametru ConfigurationName poleceń cmdlet, które tworzą sesję.
Począwszy od programu PowerShell 7.3, można uruchomić pwsh
polecenie z parametrem ConfigurationFile . Dzięki temu można uruchomić program PowerShell przy użyciu określonej konfiguracji.
Znajdowanie trybu językowego sesji
Tryb języka FullLanguage
lub ConstrainedLanguage
sesji można znaleźć, uzyskując wartość właściwości LanguageMode stanu sesji.
Na przykład:
$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Jednak w sesjach z trybami RestrictedLanguage
i NoLanguage
nie można użyć operatora dostępu do składowych (.
), aby uzyskać wartości właściwości.
Zamiast tego komunikat o błędzie wyświetla tryb języka.
Po uruchomieniu $ExecutionContext.SessionState.LanguageMode
polecenia w RestrictedLanguage
sesji program PowerShell zwraca komunikaty o błędach PropertyReferenceNotSupportedInDataSection i VariableReferenceNotSupportedInDataSection .
- PropertyReferenceNotSupportedInDataSection: odwołania do właściwości nie są dozwolone w trybie języka z ograniczeniami ani w sekcji Dane.
- VariableReferenceNotSupportedInDataSection: zmienna, do którego nie można odwoływać się w trybie języka z ograniczeniami lub do sekcji Dane jest przywoływana.
Po uruchomieniu $ExecutionContext.SessionState.LanguageMode
polecenia w NoLanguage sesji program PowerShell zwraca komunikat o błędzie ScriptsNotAllowed .
- ScriptsNotAllowed: składnia nie jest obsługiwana przez tę przestrzeń uruchomieniową. Może to być spowodowane tym, że jest w trybie bez języka.
Znajdowanie trybu językowego konfiguracji sesji
Po utworzeniu konfiguracji sesji przy użyciu pliku konfiguracji sesji konfiguracja sesji ma właściwość LanguageMode . Tryb języka można znaleźć, uzyskując wartość właściwości LanguageMode .
(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage
W innych konfiguracjach sesji można znaleźć tryb języka pośrednio, wyszukując tryb językowy sesji utworzonej przy użyciu konfiguracji sesji.
Ustawianie trybu językowego
Tryb językowy w sesji programu PowerShell można ustawić za pomocą wbudowanej $ExecutionContext
zmiennej.
$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
Jednak jest to przydatne tylko w przypadku eksperymentowania z trybami języka. Tryby językowe mają zapewnić dodatkowe zabezpieczenia sesji programu PowerShell dla określonych kontekstów.
Tryby języków są ustawiane podczas korzystania z zasad sterowania aplikacjami systemowymi lub tworzenia konfiguracji sesji.
Korzystanie z zasad kontroli aplikacji systemowych
Program PowerShell jest uruchamiany automatycznie w ConstrainedLanguage
trybie, gdy jest uruchomiony w ramach zasad kontroli aplikacji systemowych. Wykryte zasady sterowania aplikacjami to AppLocker i Windows Defender Application Control (WDAC) na platformach Windows.
Program PowerShell stosuje inne ograniczenia oprócz trybów językowych, gdy wykryje zasady kontroli aplikacji. Istnieją na przykład dodatkowe ograniczenia dotyczące określania źródła kropkowego i importowania modułów w ramach zasad.
Po uruchomieniu sesji programu PowerShell w ramach zasad jest ona uruchamiana w ConstrainedLanguage
trybie. Począwszy od programu PowerShell 7.4, wyświetlany baner uruchamiania zawiera komunikat wskazujący, że działa w tym trybie. Dzięki temu użytkownicy mogą korzystać z interaktywnego środowiska powłoki, uruchamiać polecenia cmdlet i polecenia natywne, a także uzyskiwać dostęp do podstawowych elementów języka. Użytkownik nie może jednak uzyskać dostępu do interfejsów API programu PowerShell, platformy .NET ani com, które mogą być nadużywane przez złośliwego aktora.
Każdy skrypt lub moduł oparty na skryptach wykonywany w tej sesji jest uruchamiany w ConstrainedLanguage
trybie. Jednak każdy skrypt lub moduł oparty na skryptach dozwolony przez zasady działa w FullLanguage
trybie bez żadnych ograniczeń. Dzięki temu system zablokowany przez zasady może mieć skrypty, które są zaufane przez zasady i uruchamiane z kilkoma ograniczeniami.
Korzystanie z konfiguracji sesji
Komunikacja zdalna programu PowerShell opcjonalnie obsługuje tworzenie niestandardowych konfiguracji sesji.
Możesz ustawić odpowiedni tryb językowy dla tej niestandardowej konfiguracji.
Konfiguracje programu PowerShell Just Enough Administracja istration (JEA) używają NoLanguage
trybu, aby ograniczyć sesje tylko do wywołań poleceń. W przypadku usługi JEA sesja zdalna może być ograniczona do określonych użytkowników. Użytkownicy JEA są ograniczeni do uruchamiania zdefiniowanego zestawu poleceń i nie mogą bezpośrednio uzyskiwać dostępu do interfejsów API, systemu plików ani innych zasobów systemowych.
Aby uzyskać więcej informacji, zobacz Konfiguracje sesji JEA i New-PSSessionConfigurationFile.
Funkcje i ograniczenia trybu językowego
W tej sekcji opisano tryby języka w sesjach programu PowerShell.
FullLanguage Tryb
Tryb FullLanguage
zezwala na wszystkie elementy językowe w sesji.
FullLanguage
to domyślny tryb językowy dla sesji domyślnych we wszystkich wersjach systemu Windows.
RestrictedLanguage Tryb
W RestrictedLanguage
trybie użytkownicy mogą uruchamiać polecenia (polecenia cmdlet, funkcje, polecenia CIM i przepływy pracy), ale nie mogą używać bloków skryptów. Ten tryb jest również używany do przetwarzania manifestów modułów załadowanych przez Import-Module
program .
Począwszy od programu PowerShell 7.2, New-Object
polecenie cmdlet jest wyłączone w RestrictedLanguage
trybie podczas konfigurowania blokady systemu.
Domyślnie tylko następujące zmienne są dozwolone w RestrictedLanguage
trybie:
$PSCulture
$PSUICulture
$True
$False
$Null
Manifesty modułów są ładowane w RestrictedLanguage
trybie i mogą używać następujących dodatkowych zmiennych:
$PSScriptRoot
$PSEdition
$EnabledExperimentalFeatures
- Dowolne zmienne środowiskowe, takie jak
$ENV:TEMP
Dozwolone są tylko następujące operatory porównania:
-eq
(równe)-gt
(większe niż)-lt
(mniej niż)
Instrukcje przypisania, odwołania do właściwości i wywołania metod nie są dozwolone.
ConstrainedLanguage Tryb
ConstrainedLanguage
Tryb jest przeznaczony do zezwalania na podstawowe elementy języka, takie jak pętle, warunkowe, rozszerzenie ciągu i dostęp do właściwości obiektu. Ograniczenia uniemożliwiają operacje, które mogą być nadużywane przez złośliwego aktora.
Tryb ConstrainedLanguage
zezwala na wszystkie polecenia cmdlet i podzestaw elementów języka programu PowerShell, ale ogranicza typy obiektów, które mogą być używane.
Funkcje ConstrainedLanguage
trybu są następujące:
- Wszystkie polecenia cmdlet w modułach systemu Windows są w pełni funkcjonalne i mają pełny dostęp do zasobów systemowych, z wyjątkiem zanotowania.
- Dozwolone są wszystkie elementy języka skryptów programu PowerShell.
- Wszystkie moduły zawarte w systemie Windows można zaimportować i wszystkie polecenia eksportowane przez moduły są uruchamiane w sesji.
- Polecenie
Add-Type
cmdlet może załadować podpisane zestawy, ale nie może załadować dowolnego kodu w języku C# ani interfejsów API Win32. - Polecenia
New-Object
cmdlet można używać tylko w przypadku dozwolonych typów (wymienionych poniżej). - W programie PowerShell można używać tylko dozwolonych typów. Inne typy nie są dozwolone. Konwersja typu jest dozwolona, ale tylko wtedy, gdy wynik jest dozwolonym typem.
- Parametry polecenia cmdlet, które konwertują dane wejściowe ciągu na typy, działają tylko wtedy, gdy wynikowy typ jest dozwolonym typem.
- Metody
ToString()
i metody .NET dozwolonych typów można wywołać. - Użytkownicy mogą uzyskać wszystkie właściwości dozwolonych typów. Użytkownicy mogą ustawiać wartości właściwości tylko dla dozwolonych typów.
Następujące typy platformy .NET są dozwolone w ConstrainedLanguage
trybie. Użytkownicy mogą pobierać właściwości, wywoływać metody i konwertować obiekty na te typy.
Dozwolone typy:
[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]
Dozwolone są tylko następujące typy obiektów COM:
Scripting.Dictionary
Scripting.FileSystemObject
VBScript.RegExp
NoLanguage Tryb
Tryb programu PowerShell wyłącza całkowicie język skryptów programu PowerShell NoLanguage
.
Nie można uruchamiać skryptów ani używać zmiennych. Można uruchamiać tylko natywne polecenia i polecenia cmdlet.
Począwszy od programu PowerShell 7.2, New-Object
polecenie cmdlet jest wyłączone w NoLanguage
trybie podczas konfigurowania blokady systemu.