次の方法で共有


about_Language_Modes

簡単な説明

言語モードと PowerShell セッションへの影響について説明します。

長い説明

PowerShell セッションの言語モードによって、セッションで使用できる PowerShell 言語の要素が決まります。

PowerShell では、次の言語モードがサポートされています。

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (PowerShell 3.0 で導入)
  • NoLanguage

言語モードとは

言語モードは、セッションで許可される言語要素を決定します。

言語モードは、セッションの作成に使用されるセッション構成 (または "エンドポイント") のプロパティです。 特定のセッション構成を使用するすべてのセッションには、セッション構成の言語モードがあります。

すべての PowerShell セッションには言語モードがあります。 セッションは、ターゲット コンピューター上のセッション構成を使用して作成されます。 セッション構成で設定された言語モードによって、セッションの言語モードが決まります。 PSSession のセッション構成を指定するには、セッションを作成するコマンドレットの ConfigurationName パラメーターを使用します。

PowerShell 7.3 以降では、ConfigurationFile パラメーターを使用して を実行pwshできます。 これにより、特定の構成を使用して PowerShell を起動できます。

セッションの言語モードの検索

セッション状態の LanguageMode プロパティの値をFullLanguage取得することで、 または ConstrainedLanguage セッションの言語モードを見つけることができます。

例:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

ただし、 モードと NoLanguage モードを使用RestrictedLanguageするセッションでは、メンバー アクセス演算子 (.) を使用してプロパティ値を取得することはできません。 代わりに、エラー メッセージによって言語モードが表示されます。

セッションでコマンドを$ExecutionContext.SessionState.LanguageMode実行すると、PowerShell は PropertyReferenceNotSupportedInDataSection エラー メッセージと VariableReferenceNotSupportedInDataSection エラー メッセージを返します。RestrictedLanguage

  • PropertyReferenceNotSupportedInDataSection: 制限付き言語モードまたは Data セクションでは、プロパティ参照は許可されません。
  • VariableReferenceNotSupportedInDataSection: 制限付き言語モードまたは Data セクションで参照できない変数が参照されています。

セッションで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 実行されます。 このモードでは、悪意のあるアクターによって悪用される可能性がある機能と API へのアクセスを制限しながら、使用可能な対話型シェル エクスペリエンスを実現できます。 ユーザーはコマンドレットとネイティブ コマンドを実行し、基本的な言語要素にアクセスできます。 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 、ユーザーはコマンド (コマンドレット、関数、CIM コマンド、ワークフロー) を実行できますが、スクリプト ブロックを使用することはできません。 このモードは、 によって Import-Module読み込まれたモジュール マニフェストの処理にも使用されます。

PowerShell 7.2 以降では、 New-Object システム ロックダウンが構成されている場合、このコマンドレットはモードで RestrictedLanguage 無効になります。

既定では、モードでは RestrictedLanguage 次の変数のみが許可されます。

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

モジュール マニフェストはモードで RestrictedLanguage 読み込まれ、次の追加変数を使用できます。

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • 環境変数 (例: ) $ENV:TEMP

次の比較演算子のみが許可されます。

  • -eq (等しい)
  • -gt (より大きい)
  • -lt (より小さい)

代入ステートメント、プロパティ参照、およびメソッド呼び出しは許可されません。

ConstrainedLanguage モード

ConstrainedLanguage mode は、ループ、条件、文字列展開、オブジェクト プロパティへのアクセスなどの基本的な言語要素を許可するように設計されています。 この制限により、悪意のあるアクターによって悪用される可能性のある操作が防止されます。

モードでは ConstrainedLanguage 、すべてのコマンドレットと PowerShell 言語要素のサブセットが許可されますが、使用できるオブジェクトの種類は制限されます。

モードの ConstrainedLanguage 機能は次のとおりです。

  • Windows モジュールのすべてのコマンドレットは完全に機能し、特に記載されている場合を除き、システム リソースに完全にアクセスできます。
  • PowerShell スクリプト言語のすべての要素が許可されます。
  • Windows に含まれるすべてのモジュールをインポートでき、モジュールがエクスポートするすべてのコマンドがセッションで実行されます。
  • コマンドレットは Add-Type 署名されたアセンブリを読み込むことができますが、任意の C# コードまたは Win32 API を読み込むできません。
  • コマンドレットは New-Object 、許可された型でのみ使用できます (以下に示します)。
  • PowerShell では、許可されている型のみを使用できます。 その他の型は許可されていません。 型変換は許可されますが、結果が許可された型の場合にのみ許可されます。
  • 文字列入力を型に変換するコマンドレット パラメーターは、結果の型が許可された型である場合にのみ機能します。
  • 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 スクリプト言語が完全に無効になります。 スクリプトを実行したり、変数を使用したりすることはできません。 ネイティブ コマンドとコマンドレットのみを実行できます。

PowerShell 7.2 以降では、 New-Object システム ロックダウンが構成されている場合、このコマンドレットはモードで NoLanguage 無効になります。

こちらもご覧ください