about_Language_Modes

简短说明

介绍语言模式及其对 PowerShell 会话的影响。

详细说明

PowerShell 会话的语言模式部分确定可在会话中使用 PowerShell 语言的元素。

PowerShell 支持以下语言模式:

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

什么是语言模式?

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

语言模式实际上是用于创建会话的会话 (或) 终结点"属性。 使用特定会话配置的所有会话都有会话配置的语言模式。

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

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

语言模式

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

Full Language (FullLanguage)

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

受限语言 (RestrictedLanguage)

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

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

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

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

  • $PSScriptRoot
  • $PSEdition PowerShell Core 中的 ()
  • $EnabledExperimentalFeatures PowerShell Core 中的 ()

仅允许以下比较运算符:

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

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

无语言 (NoLanguage)

仅可通过 API 使用 NoLanguage 模式。 NoLanguage 模式表示不允许任何格式的脚本文本。 这会阻止使用 AddScript () 方法,该方法将发送要分析和执行的 PowerShell 脚本片段。 只能使用 AddCommand ()() AddParameter ,而不会通过分析器进行分析。

受约束语言 (约束语言)

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

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

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

ConstrainedLanguage 模式的功能如下所示:

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

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

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

  • 在 PowerShell 工作流中,可以编写和运行以 PowerShell 语言 (编写的脚本工作流) 。 不支持基于 XAML 的工作流,并且不能在脚本工作流中运行 XAML,例如使用 Invoke-Expression -Language XAML 。 此外,工作流无法调用其他工作流,但允许嵌套工作流。

  • Add-Typecmdlet 可以加载已签名的程序集,但不能加载任意 C# 代码或 Win32 API。

  • New-Objectcmdlet 只能用于下面列出的允许 (类型) 。

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

  • 允许类型转换,但仅在结果为允许的类型时进行。

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

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

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

    • 脚本编写。字典
    • Scripting.FileSystemObject
    • VBScript

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

允许的类型:

  • AliasAttribute
  • AllowEmptyCollectionAttribute
  • AllowEmptyStringAttribute
  • AllowNullAttribute
  • Array
  • Bool
  • 字节
  • char
  • CmdletBindingAttribute
  • DateTime
  • Decimal
  • DirectoryEntry
  • DirectorySearcher
  • Double
  • FLOAT
  • Guid
  • Hashtable
  • int
  • Int16
  • long
  • ManagementClass
  • System.management.managementobject
  • ManagementObjectSearcher
  • NullString
  • OutputTypeAttribute
  • ParameterAttribute
  • PSCredential
  • PSDefaultValueAttribute
  • PSListModifier
  • PSObject
  • PSPrimitiveDictionary
  • PSReference
  • PSTypeNameAttribute
  • 正则表达式
  • SByte
  • 字符串
  • 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

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

查找会话的语言模式

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

例如:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

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

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

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

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

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

另请参阅