about_Language_Modes
簡短描述
說明語言模式及其對PowerShell會話的影響。
詳細描述
PowerShell 會話的語言模式會決定哪些 PowerShell 語言元素可以在會話中使用。
PowerShell 支援下列語言模式:
FullLanguage
RestrictedLanguage
ConstrainedLanguage
(在 PowerShell 3.0 中引進)NoLanguage
什麼是語言模式?
語言模式會決定會話中允許的語言專案。
語言模式是用來建立會話之會話組態的屬性(或「端點」。 使用特定會話設定的所有會話都有會話設定的語言模式。
所有 PowerShell 會話都有語言模式。 會話是使用目標電腦上的會話組態所建立。 會話組態中設定的語言模式會決定會話的語言模式。 若要指定 PSSession 的會話組態,請使用 建立會話之 Cmdlet 的 ConfigurationName 參數。
從 PowerShell 7.3 開始,您可以使用 ConfigurationFile 參數執行。pwsh
這可讓您使用特定組態啟動PowerShell。
尋找會話的語言模式
您可以取得會話狀態之 LanguageMode 屬性的值,以尋找 或 ConstrainedLanguage
工作階段的語言模式FullLanguage
。
例如:
$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
不過,在具有 RestrictedLanguage
和 NoLanguage
模式的會話中,您無法使用 成員存取運算子 (.
) 來取得屬性值。
相反地,錯誤訊息會顯示語言模式。
當您在會話中執行$ExecutionContext.SessionState.LanguageMode
命令時,PowerShell 會傳回 PropertyReferenceNotSupportedInDataSection 和 VariableReferenceNotSupportedInDataSection 錯誤RestrictedLanguage
訊息。
- PropertyReferenceNotSupportedInDataSection:在受限制的語言模式或數據區段中不允許屬性參考。
- VariableReferenceNotSupportedInDataSection:無法以受限制的語言模式或數據區段參考的變數。
當您在會話中NoLanguage執行$ExecutionContext.SessionState.LanguageMode
命令時,PowerShell 會傳回 ScriptsNotAllowed 錯誤訊息。
- ScriptsNotAllowed:此 Runspace 不支持語法。 這可能是因為它處於無語言模式。
尋找會話設定的語言模式
使用會話組態檔建立會話組態時,會話組態具有 LanguageMode 屬性。 您可以取得 LanguageMode 屬性的值來尋找語言模式。
(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage
在其他會話組態上,您可以透過尋找使用會話設定所建立之會話的語言模式,間接找到語言模式。
設定語言模式
PowerShell 會話中的語言模式可以透過內 $ExecutionContext
建變數來設定。
$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
不過,這樣做只適用於測試語言模式。 語言模式的目的是為特定內容提供PowerShell工作階段的新增安全性。
當您使用系統應用程控原則或建立會話設定時,會設定語言模式。
使用系統應用程控原則
PowerShell 會在系統應用程控原則下執行時,自動以 ConstrainedLanguage
模式執行。 偵測到的應用程式控制原則是 Windows 平臺上的 AppLocker 和 Windows Defender 應用程控 (WDAC)。
當 PowerShell 偵測到應用程控原則時,除了語言模式之外,也會套用其他限制。 例如,在原則下,點來源和模組匯入還有其他限制。
在原則下啟動PowerShell工作階段時,它會以模式執行 ConstrainedLanguage
。 從 PowerShell 7.4 開始,啟動橫幅顯示會包含一則訊息,指出其正在該模式中執行。 這可讓用戶擁有可使用的互動式殼層體驗、執行 Cmdlet 和原生命令,以及存取基本語言元素。 但用戶無法存取惡意動作專案可能濫用的 PowerShell、.NET 或 COM API。
在此會話中執行的任何腳本或腳本型模組都會以 ConstrainedLanguage
模式執行。 不過,原則允許的任何腳本或腳本型模組都會以模式執行 FullLanguage
,而沒有任何條件約束。 如此一來,原則所鎖定的系統可能會有原則信任的腳本,並且以少數條件約束執行。
使用工作階段設定
PowerShell 遠端功能選擇性地支援建立自定義會話設定。
您可以設定您要用於該自訂組態的語言模式。
PowerShell Just Enough Administration (JEA) 設定會使用 NoLanguage
模式,將會話限制為僅限命令調用。 透過 JEA,遠端會話可以限制為特定使用者。 JEA 使用者僅限於執行一組已定義的命令,且無法直接存取 API、檔案系統或其他系統資源。
如需詳細資訊,請參閱 JEA 會話設定 和 New-PSSessionConfigurationFile。
語言模式功能和限制
本節說明 PowerShell 會話中的語言模式。
FullLanguage 模式
模式 FullLanguage
允許會話中的所有語言專案。
FullLanguage
是所有 Windows 版本上預設會話的默認語言模式。
RestrictedLanguage 模式
在模式中 RestrictedLanguage
,使用者可以執行命令(Cmdlet、函式、CIM 命令和工作流程),但無法使用腳本區塊。 此模式也可用來處理 所 Import-Module
載入的模組指令清單。
從 PowerShell 7.2 開始,設定系統鎖定時, New-Object
Cmdlet 會在模式中 RestrictedLanguage
停用。
根據預設,模式只允許 RestrictedLanguage
下列變數:
$PSCulture
$PSUICulture
$True
$False
$Null
模組指令清單會以 RestrictedLanguage
模式載入,並可能使用這些額外的變數:
$PSScriptRoot
$PSEdition
$EnabledExperimentalFeatures
- 任何環境變數,例如
$ENV:TEMP
只允許下列比較運算子:
-eq
(等於)-gt
(大於)-lt
(小於)
不允許指派語句、屬性參考和方法呼叫。
ConstrainedLanguage 模式
ConstrainedLanguage
mode 的設計目的是允許基本的語言專案,例如迴圈、條件式、字串展開,以及存取物件屬性。 這些限制會防止惡意執行者可能濫用的作業。
模式 ConstrainedLanguage
允許所有 Cmdlet 和 PowerShell 語言專案的子集,但會限制可使用的物件類型。
模式的功能 ConstrainedLanguage
如下所示:
- Windows 模組中的所有 Cmdlet 皆可完整運作,且可完整存取系統資源,但另有說明。
- 允許 PowerShell 腳本語言的所有元素。
- 您可以匯入 Windows 中包含的所有模組,以及模組匯出在工作階段中執行的所有命令。
- Cmdlet
Add-Type
可以載入已簽署的元件,但無法載入任意 C# 程式代碼或 Win32 API。 New-Object
Cmdlet 只能用於允許的類型(如下所列)。- PowerShell 只能使用允許的類型。 不允許其他類型。 允許類型轉換,但只有在結果為允許的類型時。
- 只有在產生的類型是允許的類型時,才能將字串輸入轉換成類型的 Cmdlet 參數。
ToString()
可以叫用允許型別的方法和 .NET 方法。- 用戶可以取得允許類型的所有屬性。 使用者只能在允許的類型上設定屬性值。
在模式中 ConstrainedLanguage
允許下列 .NET 類型。 使用者可以取得屬性、叫用方法,以及將對象轉換成這些類型。
允許的類型:
[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]
只允許下列 COM 物件類型:
Scripting.Dictionary
Scripting.FileSystemObject
VBScript.RegExp
NoLanguage 模式
PowerShell NoLanguage
模式會完全停用 PowerShell 腳本語言。
您無法執行文稿或使用變數。 您只能執行原生命令和 Cmdlet。
從 PowerShell 7.2 開始,設定系統鎖定時, New-Object
Cmdlet 會在模式中 NoLanguage
停用。