다음을 통해 공유


about_Language_Modes

간단한 설명

언어 모드 및 PowerShell 세션에 미치는 영향에 대해 설명합니다.

자세한 설명

PowerShell 세션의 언어 모드는 세션에서 사용할 수 있는 PowerShell 언어의 요소를 결정합니다.

PowerShell은 다음 언어 모드를 지원합니다.

  • FullLanguage
  • RestrictedLanguage
  • ConstrainedLanguage (PowerShell 3.0에 도입됨)
  • NoLanguage

언어 모드란?

언어 모드는 세션에서 허용되는 언어 요소를 결정합니다.

언어 모드는 세션을 만드는 데 사용되는 세션 구성(또는 "엔드포인트")의 속성입니다. 특정 세션 구성을 사용하는 모든 세션에는 세션 구성의 언어 모드가 있습니다.

모든 PowerShell 세션에는 언어 모드가 있습니다. 세션은 대상 컴퓨터의 세션 구성을 사용하여 만들어집니다. 세션 구성에 설정된 언어 모드는 세션의 언어 모드를 결정합니다. PSSession의 세션 구성을 지정하려면 세션을 만드는 cmdlet의 ConfigurationName 매개 변수를 사용합니다.

세션의 언어 모드 찾기

세션 상태의 FullLanguage LanguageMode 속성 값을 가져오면 또는 ConstrainedLanguage 세션의 언어 모드를 찾을 수 있습니다.

예시:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

그러나 세션 및 모드에서는 RestrictedLanguage 멤버 액세스 연산자(.)를 사용하여 속성 값을 가져올 수 NoLanguage 없습니다. 대신 오류 메시지가 언어 모드를 표시합니다.

세션에서 명령을 실행하면 PowerShell은 PropertyReferenceNotSupportedInDataSectionVariableReferenceNotSupportedInDataSection 오류 메시지를 반환합니다.$ExecutionContext.SessionState.LanguageMode RestrictedLanguage

  • PropertyReferenceNotSupportedInDataSection: 속성 참조는 제한된 언어 모드 또는 데이터 섹션에서 허용되지 않습니다.
  • VariableReferenceNotSupportedInDataSection: 제한된 언어 모드에서 참조할 수 없거나 데이터 섹션이 참조되는 변수입니다.

세션에서 명령을 NoLanguage 실행 $ExecutionContext.SessionState.LanguageMode 하면 PowerShell은 ScriptsNotAllowed 오류 메시지를 반환합니다.

  • ScriptsNotAllowed: 구문은 이 Runspace에서 지원되지 않습니다. 이는 언어가 없는 모드이기 때문일 수 있습니다.

세션 구성의 언어 모드 찾기

세션 구성 파일을 사용하여 세션 구성을 만들 때 세션 구성에는 LanguageMode 속성이 있습니다. LanguageMode 속성의 값을 가져오면 언어 모드를 찾을 수 있습니다.

(Get-PSSessionConfiguration -Name Test).LanguageMode
FullLanguage

다른 세션 구성에서는 세션 구성을 사용하여 만든 세션의 언어 모드를 찾아서 언어 모드를 간접적으로 찾을 수 있습니다.

언어 모드 설정

PowerShell 세션의 언어 모드는 기본 제공 $ExecutionContext 변수를 통해 설정할 수 있습니다.

$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

그러나 이 작업은 언어 모드를 실험하는 데만 유용합니다. 언어 모드는 특정 컨텍스트에 대한 PowerShell 세션에 추가 보안을 제공하기 위한 것입니다.

언어 모드는 시스템 애플리케이션 제어 정책을 사용하거나 세션 구성을 만들 때 설정됩니다.

시스템 애플리케이션 제어 정책 사용

PowerShell은 시스템 애플리케이션 제어 정책에서 ConstrainedLanguage 실행 중일 때 모드에서 자동으로 실행됩니다. 검색된 애플리케이션 제어 정책은 Windows 플랫폼의 AppLocker 및 WDAC(Windows Defender 애플리케이션 제어)입니다.

PowerShell은 애플리케이션 제어 정책을 검색할 때 언어 모드 외에 다른 제한을 적용합니다. 예를 들어 정책에 따라 도트 소싱 및 모듈 가져오기에 대한 추가 제한 사항이 있습니다.

정책에서 PowerShell 세션이 시작되면 모드에서 ConstrainedLanguage 실행됩니다. 이 모드를 사용하면 악의적인 행위자가 악용할 수 있는 기능 및 API에 대한 액세스를 제한하면서 사용 가능한 대화형 셸 환경을 사용할 수 있습니다. 사용자는 cmdlet 및 네이티브 명령을 실행하고 기본 언어 요소에 액세스할 수 있습니다. PowerShell, .NET 및 COM API에 대한 액세스가 제한됩니다.

이 세션에서 실행되는 스크립트 또는 스크립트 기반 모듈은 모드에서 ConstrainedLanguage 실행됩니다. 그러나 정책에서 허용하는 스크립트 또는 스크립트 기반 모듈은 제약 조건 없이 모드에서 FullLanguage 실행됩니다. 이렇게 하면 정책에 의해 잠긴 시스템에는 정책에서 신뢰하고 몇 가지 제약 조건으로 실행되는 스크립트가 있을 수 있습니다.

세션 구성 사용

PowerShell 원격은 필요에 따라 사용자 지정 세션 구성 만들기를 지원합니다. 해당 사용자 지정 구성에 원하는 언어 모드를 설정할 수 있습니다. PowerShell JEA(Just Enough Administration) 구성은 모드를 사용하여 NoLanguage 세션을 명령 호출로만 제한합니다. JEA를 사용하면 원격 세션을 특정 사용자로 제한할 수 있습니다. JEA 사용자는 정의된 명령 집합을 실행하도록 제한되며 API, 파일 시스템 또는 기타 시스템 리소스에 직접 액세스할 수 없습니다.

자세한 내용은 JEA 세션 구성New-PSSessionConfigurationFile을 참조하세요.

언어 모드 기능 및 제한 사항

이 섹션에서는 PowerShell 세션의 언어 모드에 대해 설명합니다.

FullLanguage 모드

모드는 FullLanguage 세션의 모든 언어 요소를 허용합니다. FullLanguage 는 모든 버전의 Windows에서 기본 세션에 대한 기본 언어 모드입니다.

RestrictedLanguage 모드

모드에서 RestrictedLanguage 사용자는 명령(cmdlet, 함수, CIM 명령 및 워크플로)을 실행할 수 있지만 스크립트 블록을 사용할 수는 없습니다. 이 모드는 로 로드된 Import-Module모듈 매니페스트를 처리하는 데도 사용됩니다.

PowerShell 7.2 New-Object 부터 시스템 잠금이 구성되면 cmdlet이 모드에서 RestrictedLanguage 비활성화됩니다.

기본적으로 다음 변수만 모드에서 RestrictedLanguage 허용됩니다.

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

모듈 매니페스트는 모드로 RestrictedLanguage 로드되며 다음과 같은 추가 변수를 사용할 수 있습니다.

  • $PSScriptRoot
  • $PSEdition
  • $EnabledExperimentalFeatures
  • 모든 환경 변수(예: $ENV:TEMP

다음 비교 연산자만 허용됩니다.

  • -eq (같음)
  • -gt (보다 큼)
  • -lt (보다 작음)

할당 문, 속성 참조 및 메서드 호출은 허용되지 않습니다.

ConstrainedLanguage 모드

ConstrainedLanguage 모드는 루프, 조건부, 문자열 확장 및 개체 속성에 대한 액세스와 같은 기본 언어 요소를 허용하도록 설계되었습니다. 이 제한은 악의적인 행위자가 악용할 수 있는 작업을 방지합니다.

이 모드는 ConstrainedLanguage 모든 cmdlet 및 PowerShell 언어 요소의 하위 집합을 허용하지만 사용할 수 있는 개체 유형을 제한합니다.

모드의 ConstrainedLanguage 기능은 다음과 같습니다.

  • Windows 모듈의 모든 cmdlet은 완벽하게 작동하며 명시된 경우를 제외하고 시스템 리소스에 완전히 액세스할 수 있습니다.
  • PowerShell 스크립팅 언어의 모든 요소가 허용됩니다.
  • Windows에 포함된 모든 모듈을 가져올 수 있으며 모듈이 내보내는 모든 명령은 세션에서 실행됩니다.
  • PowerShell 워크플로에서 스크립트 워크플로(PowerShell 언어로 작성된 워크플로)를 작성하고 실행할 수 있습니다.
  • XAML 기반 워크플로는 지원되지 않으며 을 사용하여 Invoke-Expression -Language XAML스크립트 워크플로에서 XAML을 실행할 수 없습니다. 또한 중첩된 워크플로는 허용되지만 워크플로는 다른 워크플로를 호출할 수 없습니다.
  • cmdlet은 Add-Type 서명된 어셈블리를 로드할 수 있지만 임의의 C# 코드 또는 Win32 API를 로드할 수는 없습니다.
  • cmdlet은 New-Object 허용되는 형식(아래 나열됨)에서만 사용할 수 있습니다.
  • PowerShell에서는 허용되는 형식만 사용할 수 있습니다. 다른 형식은 허용되지 않습니다. 형식 변환은 허용되지만 결과가 허용되는 형식인 경우에만 허용됩니다.
  • 문자열 입력을 형식으로 변환하는 Cmdlet 매개 변수는 결과 형식이 허용되는 형식인 경우에만 작동합니다.
  • 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]
  • [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]
  • [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 스크립팅 언어를 완전히 사용하지 않도록 설정합니다. 스크립트를 실행하거나 변수를 사용할 수 없습니다. 네이티브 명령 및 cmdlet만 실행할 수 있습니다.

PowerShell 7.2 New-Object 부터 시스템 잠금이 구성되면 cmdlet이 모드에서 NoLanguage 비활성화됩니다.

참고 항목