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