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
ただし、 RestrictedLanguage
モードと NoLanguage
モードのセッションでは、 member-access 演算子 (.
) を使用してプロパティ値を取得することはできません。
代わりに、エラー メッセージによって言語モードが表示されます。
RestrictedLanguage
セッションで $ExecutionContext.SessionState.LanguageMode
コマンドを実行すると、PowerShell は PropertyReferenceNotSupportedInDataSection および VariableReferenceNotSupportedInDataSection エラー メッセージを返します。
- PropertyReferenceNotSupportedInDataSection: 制限付き言語モードまたは Data セクションでは、プロパティ参照は許可されません。
- VariableReferenceNotSupportedInDataSection: 制限付き言語モードまたは Data セクションで参照できない変数が参照されています。
NoLanguage セッションで $ExecutionContext.SessionState.LanguageMode
コマンドを実行すると、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 Administration (JEA) 構成では、 NoLanguage
モードを使用して、セッションをコマンド呼び出しのみに制限します。 JEA では、リモート セッションを特定のユーザーに制限できます。 JEA ユーザーは、定義された一連のコマンドの実行に限定されており、API、ファイル システム、またはその他のシステム リソースに直接アクセスすることはできません。
詳細については、「
言語モードの機能と制限事項
このセクションでは、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
モードで無効になります。
関連項目
PowerShell