当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于语言模式

作者:精品下载站 日期:2024-12-14 02:21:54 浏览:16 分类:玩电脑

关于语言模式


简短描述

解释语言模式及其对 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 是所有 Windows 版本上默认会话的默认语言模式。

    限制语言模式

    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 模式允许所有 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

            无语言模式

            PowerShell NoLanguage 模式完全禁用 PowerShell 脚本语言。您无法运行脚本或使用变量。您只能运行本机命令和 cmdlet。

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

            参见

            • about_Session_Configuration_Files
            • about_Session_Configurations

            您需要 登录账户 后才能发表评论

            取消回复欢迎 发表评论:

            关灯