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

不過,在具有 RestrictedLanguageNoLanguage 模式的會話中,您無法使用 成員存取運算子.) 來取得屬性值。 相反地,錯誤訊息會顯示語言模式。

當您在會話中執行$ExecutionContext.SessionState.LanguageMode命令時,PowerShell 會傳回 PropertyReferenceNotSupportedInDataSectionVariableReferenceNotSupportedInDataSection 錯誤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 管理員 istration (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 停用。

另請參閱