about_Language_Modes

简短说明

说明语言模式及其对 PowerShell 会话的影响。

长说明

PowerShell 会话的语言模式部分决定了可在会话中使用 PowerShell 语言的哪些元素。

PowerShell 支持以下语言模式:

  • FullLanguage
  • ConstrainedLanguage PowerShell 3.0) 中引入的 (
  • RestrictedLanguage
  • NoLanguage

什么是语言模式?

语言模式确定会话中允许的语言元素。

语言模式实际上是用于创建会话的会话配置 (或“endpoint”) 的属性。 使用特定会话配置的所有会话都具有会话配置的语言模式。

所有 PowerShell 会话都具有语言模式,包括使用 New-PSSession cmdlet 创建的 PSSession、使用 ComputerName 参数的临时会话以及启动 PowerShell 时显示的默认会话。

远程会话是使用远程计算机上的会话配置创建的。 会话配置中设置的语言模式确定会话的语言模式。 若要指定 PSSession 的会话配置,请使用创建会话的 cmdlet 的 ConfigurationName 参数。

语言模式

本部分介绍 PowerShell 会话中的语言模式。

完整语言 (FullLanguage)

FullLanguage 模式允许会话中的所有语言元素。 FullLanguage是所有版本的 Windows 上默认会话的默认语言模式,但Windows RT除外。

受限语言 (RestrictedLanguage)

RestrictedLanguage 模式下,用户可以 (cmdlet、函数、CIM 命令和工作流) 运行命令,但不允许使用脚本块。

从 PowerShell 7.2 开始,配置系统锁定时, New-Object 该 cmdlet 处于 RestrictedLanguage 禁用模式。

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

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

使用模式的 RestrictedLanguage 模块清单也允许以下附加变量:

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures

仅允许以下比较运算符:

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

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

没有语言 (NoLanguage)

NoLanguage 模式只能通过 API 使用。 NoLanguage 模式意味着不允许任何窗体的脚本文本。 这排除了使用 AddScript () 方法, 该方法发送要分析和执行的 PowerShell 脚本片段。 只能使用不通过分析器的 AddCommand () AddParameter ()

从 PowerShell 7.2 开始,配置系统锁定时, New-Object 该 cmdlet 处于 NoLanguage 禁用模式。

约束语言 (约束语言)

ConstrainedLanguage 模式允许所有 cmdlet 和所有 PowerShell 语言元素,但会限制允许的类型。

ConstrainedLanguage模式旨在支持Windows RT上的 UMCI (用户模式代码完整性) 。 它是Windows RT上唯一受支持的语言模式,但在所有受支持的系统上都可用。

UMCI 仅允许在基于Windows RT的设备上安装 Microsoft 签名和 Microsoft 认证的应用来保护 ARM 设备。 ConstrainedLanguage 模式可防止用户使用 PowerShell 规避或违反 UMCI。

模式的功能 ConstrainedLanguage 如下所示:

  • Windows 模块和其他 UMCI 批准的 cmdlet 中的所有 cmdlet 都完全正常运行,并且对系统资源具有完全访问权限,但另有说明。

  • 允许 PowerShell 脚本语言的所有元素。

  • 可以导入 Windows 中包含的所有模块,以及模块导出在会话中运行的所有命令。

  • cmdlet Add-Type 可以加载已签名的程序集,但它无法加载任意 C# 代码或 Win32 API。

  • New-Object cmdlet 只能在以下) 列出的允许类型上使用 (。

  • 在 PowerShell 中,只能使用下面列出的) (允许的类型。 不允许使用其他类型的类型。

  • 允许类型转换,但仅当结果为允许类型时。

  • 仅当生成的类型是允许的类型时,将字符串输入转换为类型的 Cmdlet 参数才有效。

  • ToString()可以调用下面列出的允许类型的方法和 .NET 方法 () 。 无法调用其他方法。

  • 用户可以获取允许类型的所有属性。 用户只能在 Core 类型上设置属性值。 仅允许以下 COM 对象:

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

ConstrainedLanguage 模式下允许以下类型。 用户可以获取属性、调用方法并将对象转换为这些类型。

允许的类型:

  • [AliasAttribute]
  • [AllowEmptyCollectionAttribute]
  • [AllowEmptyStringAttribute]
  • [AllowNullAttribute]
  • [Array]
  • [Bool]
  • [byte]
  • [char]
  • [CmdletBindingAttribute]
  • [DateTime]
  • [decimal]
  • [DirectoryEntry]
  • [DirectorySearcher]
  • [double]
  • [float]
  • [Guid]
  • [Hashtable]
  • [int]
  • [Int16]
  • [long]
  • [ManagementClass]
  • [ManagementObject]
  • [ManagementObjectSearcher]
  • [NullString]
  • [OutputTypeAttribute]
  • [ParameterAttribute]
  • [PSCredential]
  • [PSDefaultValueAttribute]
  • [PSListModifier]
  • [PSObject]
  • [PSPrimitiveDictionary]
  • [PSReference]
  • [PSTypeNameAttribute]
  • [Regex]
  • [SByte]
  • [String]
  • [SupportsWildcardsAttribute]
  • [SwitchParameter]
  • [System.Globalization.CultureInfo]
  • [System.Net.IPAddress]
  • [System.Net.Mail.MailAddress]
  • [System.Numerics.BigInteger]
  • [System.Security.SecureString]
  • [TimeSpan]
  • [UInt16]
  • [UInt32]
  • [UInt64]

查找会话配置的语言模式

使用会话配置文件创建会话配置时,会话配置具有 LanguageMode 属性。 可以通过获取 LanguageMode 属性的值来查找语言模式。

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

在其他会话配置中,可以通过查找使用会话配置创建的会话的语言模式来间接查找语言模式。

注意

会话配置是基于 WSMan 的 PowerShell 远程处理功能。 它们仅在使用 New-PSSessionInvoke-Commandcmdlet Enter-PSSession 连接到远程 Windows 计算机时使用。 该 Get-PSSessionConfiguration cmdlet 仅在 Windows 计算机上可用。

查找会话的语言模式

可以通过获取会话状态的 LanguageMode 属性的值来查找会话的语言ConstrainedLanguage模式FullLanguage

例如:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

但是,在具有 RestrictedLanguageNoLanguage 模式的会话中,不能使用点方法获取属性值。 相反,错误消息会显示语言模式。

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

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

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

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

另请参阅