about_Language_Modes

簡単な説明

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

詳細な説明

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

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

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

言語モードとは

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

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

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

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

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

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

次に例を示します。

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

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

セッションでコマンドを$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 実行されます。 PowerShell 7.4 以降、起動時のバナー表示には、そのモードで実行されていることを示すメッセージが含まれています。 これにより、ユーザーは、コマンドレットとネイティブ コマンドを実行し、基本的な言語要素にアクセスできる対話型シェル エクスペリエンスを使用できます。 ただし、悪意のあるアクターによって悪用される可能性のある PowerShell、.NET、または COM API にユーザーはアクセスできません。

このセッションで実行されるスクリプトまたはスクリプトベースのモジュールは、モードで ConstrainedLanguage 実行されます。 ただし、ポリシーで許可されているスクリプトまたはスクリプトベースのモジュールは、制約なしでモードで FullLanguage 実行されます。 これにより、ポリシーによってロックダウンされたシステムには、ポリシーによって信頼され、いくつかの制約で実行されるスクリプトを含めることができます。

セッション構成の使用

PowerShell リモート処理では、必要に応じてカスタム セッション構成の作成がサポートされます。 そのカスタム構成に必要な言語モードを設定できます。 PowerShell Just Enough 管理istration (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 メソッドを呼び出すことができます。
  • ユーザーは、許可されている型のすべてのプロパティを取得できます。 ユーザーは、許可された型でのみプロパティの値を設定できます。

次の .NET 型はモードで ConstrainedLanguage 許可されます。 ユーザーは、プロパティの取得、メソッドの呼び出し、オブジェクトのこれらの型への変換を行うことができます。

許可される型:

  • [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 無効になります。

関連項目