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 属性的值来查找 FullLanguageConstrainedLanguage 会话的语言模式。

例如:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

但是,在具有 RestrictedLanguageNoLanguage 模式的会话中,不能使用成员访问运算符 (.) 来获取属性值。 相反,错误消息会显示语言模式。

RestrictedLanguage 会话中运行 $ExecutionContext.SessionState.LanguageMode 命令时,PowerShell 将返回 PropertyReferenceNotSupportedInDataSectionVariableReferenceNotSupportedInDataSection 错误消息。

  • PropertyReferenceNotSupportedInDataSection:不允许在受限语言模式或数据节中使用属性引用。
  • VariableReferenceNotSupportedInDataSection:正在引用无法在受限语言模式或数据节中引用的变量。

在 NoLanguage 会话中运行 $ExecutionContext.SessionState.LanguageMode 命令时,PowerShell 将返回 ScriptsNotAllowed 错误消息。

  • ScriptsNotAllowed:此运行空间不支持语法。 这可能是因为它处于无语言模式。

查找会话配置的语言模式

使用会话配置文件创建会话配置时,会话配置具有 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 开始,启动横幅显示包含一条消息,指示它在该模式下运行。 这使用户可以获得可使用的交互式 shell 体验、运行 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 开始,在配置系统锁定时,将在 RestrictedLanguage 模式下禁用 New-Object cmdlet。

默认情况下,RestrictedLanguage 模式下仅允许以下变量:

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

模块清单在 RestrictedLanguage 模式下加载,并可能使用以下附加变量:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • 任何环境变量,例如 $ENV:TEMP

仅允许以下比较运算符:

  • -eq(等于)
  • -gt(大于)
  • -lt(小于)

不允许赋值语句、属性引用和方法调用。

ConstrainedLanguage 模式

ConstrainedLanguage 模式旨在允许基本的语言元素,例如循环、条件、字符串扩展和对对象属性的访问。 这些限制可防止恶意行动者滥用的操作。

ConstrainedLanguage 模式允许所有 cmdlet 和部分 PowerShell 语言元素,但会限制可以使用的对象类型。

ConstrainedLanguage 模式的功能如下所示:

  • 除非另有说明,否则 Windows 模块中的所有 cmdlet 都完全正常运行,并且对系统资源具有完全访问权限。
  • 允许 PowerShell 脚本语言的所有元素。
  • 可以导入 Windows 中包含的所有模块,并且模块导出的所有命令都在会话中运行。
  • Add-Type cmdlet 可以加载已签名的程序集,但无法加载任意 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 开始,在配置系统锁定时,将在 NoLanguage 模式下禁用 New-Object cmdlet。

另请参阅