about_Session_Configuration_Files — 세션 구성 파일

about_Session_Configuration_Files — 세션 구성 파일

PowerShell 세션의 환경을 파일 하나로 정의하고 싶을 때가 있어요. 복잡한 C# 어셈블리나 스크립트를 짜지 않고도, .pssc 확장자의 텍스트 파일 하나면 세션 구성을 손쉽게 만들고 관리할 수 있어요. 이 문서가 바로 그 "세션 구성 파일"이 무엇인지, 어떻게 만들고 쓰고 고치고 테스트하는지 차근차근 설명해 드릴게요.

출처: about_Session_Configuration_Files

본문

요약 설명 (Short description)

세션 구성 파일은 세션 구성(다른 말로 "엔드포인트")에서 그 구성을 사용하는 세션들의 환경을 정의하는 데 쓰여요.

자세한 설명 (Long description)

이 내용은 Windows에서 실행되는 PowerShell에만 적용돼요.

"세션 구성 파일"은 .pssc 파일 이름 확장자를 가진 텍스트 파일로, 세션 구성의 속성과 값을 모아 둔 해시 테이블을 담고 있어요. 세션 구성 파일로 세션 구성의 속성을 지정하면, 그 세션 구성을 사용하는 모든 PowerShell 세션의 환경이 정의돼요.

세션 구성 파일 덕분에 복잡한 C# 어셈블리나 스크립트 없이도 커스텀 세션 구성을 쉽게 만들 수 있어요.

"세션 구성" 또는 "엔드포인트"는 로컬 컴퓨터 설정의 모음이에요. 어떤 사용자가 컴퓨터에서 세션을 만들 수 있는지, 그 세션에서 어떤 명령을 실행할 수 있는지, 세션이 권한 있는 가상 계정으로 실행되어야 하는지 같은 걸 결정하죠. 세션 구성에 대한 자세한 내용은 about_Session_Configurations 문서를 확인해 주세요.

세션 구성은 Windows PowerShell 2.0에서 처음 등장했고, 세션 구성 파일은 Windows PowerShell 3.0에서 도입됐어요. 세션 구성에 세션 구성 파일을 포함하려면 Windows PowerShell 3.0을 사용해야 해요. 다만 Windows PowerShell 2.0(및 이후 버전) 사용자도 세션 구성의 설정 영향을 받아요.

커스텀 세션 만들기 (Creating custom sessions)

세션 구성 안에서 세션 속성을 지정하면 PowerShell 세션의 여러 기능을 커스터마이즈할 수 있어요. 커스텀 runspace를 정의하는 C# 프로그램을 작성해서 세션을 커스터마이즈할 수도 있고, 세션 구성 파일로 그 세션 구성을 통해 만들어지는 세션들의 속성을 정의할 수도 있어요. 일반적으로는 C# 프로그램을 직접 쓰는 것보다 세션 구성 파일을 사용하는 쪽이 훨씬 쉬워요.

세션 구성 파일 하나로 이런 것들을 만들 수 있어요. 신뢰도 높은 사용자에게 완전한 기능을 제공하는 세션, 접근을 최소한으로 허용하는 잠긴(locked-down) 세션, 특정 작업에 필요한 모듈만 담아 특정 용도에 맞게 설계된 세션, 그리고 권한이 없는 사용자가 특정 명령만 권한 있는 계정으로 실행할 수 있는 세션까지요.

여기에 더해 세션 사용자가 scriptblock 같은 PowerShell 언어 요소를 쓸 수 있는지, 아니면 명령만 실행할 수 있는지도 관리할 수 있어요. 세션에서 실행 가능한 PowerShell 버전, 세션에 가져올 모듈, 세션 사용자가 실행할 수 있는 cmdlet·함수·별칭도 정할 수 있어요. RoleDefinitions 필드를 사용하면 그룹 멤버십에 따라 세션 안에서 사용자마다 다른 기능을 부여할 수도 있어요.

RoleDefinitions와 이 Value를 정의하는 방법에 대한 자세한 내용은 New-PSRoleCapabilityFile Cmdlet 도움말 항목을 확인해 주세요.

세션 구성 파일 만들기 (Creating a session configuration file)

세션 구성 파일을 만드는 가장 쉬운 방법은 New-PSSessionConfigurationFile cmdlet을 사용하는 거예요. 이 cmdlet은 올바른 구문과 형식을 갖춘 파일을 만들어 주고, 구성 파일 속성 값도 많이 자동으로 검증해 줘요.

세션 구성 파일에 설정할 수 있는 속성에 대한 자세한 설명은 New-PSSessionConfigurationFile cmdlet 도움말 항목을 참고해 주세요.

다음 명령은 기본 값을 사용하는 세션 구성 파일을 만들어요. 파일 경로를 지정하는 Path 매개 변수 외에는 다른 매개 변수를 포함하지 않으니, 결과 파일은 기본 값만 사용해요.

New-PSSessionConfigurationFile -Path .\Defaults.pssc

새 구성 파일을 기본 텍스트 편집기에서 보려면 다음 명령을 사용해요.

Invoke-Item -Path .\Defaults.pssc

사용자가 명령은 실행할 수 있지만 PowerShell 언어의 다른 요소는 쓰지 못하는 세션 구성을 만들려면 이렇게 입력해요.

New-PSSessionConfigurationFile -LanguageMode NoLanguage
-Path .\NoLanguage.pssc

위 명령에서 LanguageMode 매개 변수를 NoLanguage로 설정하면 사용자가 스크립트를 작성하거나 실행하고, 변수를 사용하는 일을 할 수 없게 돼요.

사용자가 Get cmdlet만 쓸 수 있는 세션 구성을 만들려면 이렇게 입력해요.

New-PSSessionConfigurationFile -VisibleCmdlets Get-* -Path .\GetSessions.pssc

앞의 예시에서 VisibleCmdlets 매개 변수를 Get-*로 설정하면, 이름이 문자열 값 "Get-"으로 시작하는 cmdlet으로 사용자를 제한해요.

사용자의 자격 증명이 아니라 권한 있는 가상 계정으로 실행되는 세션 구성을 만들려면 이렇게 입력해요.

New-PSSessionConfigurationFile -RunAsVirtualAccount -Path .\VirtualAccount.pssc

사용자에게 보이는 명령이 역할 기능 파일(role capabilities file)에 지정된 세션 구성을 만들려면 이렇게 입력해요.

New-PSSessionConfigurationFile -RoleDefinitions
@{ 'CONTOSO\User' = @{ RoleCapabilities = 'Maintenance' }}
-Path .\Maintenance.pssc

세션 구성 파일 사용하기 (Using a Session Configuration File)

세션 구성을 만들 때 세션 구성 파일을 포함시킬 수 있고, 나중에 그 세션 구성에 파일을 추가할 수도 있어요.

세션 구성을 만들 때 세션 구성 파일을 포함하려면 Register-PSSessionConfiguration cmdlet의 Path 매개 변수를 사용해요.

예를 들어 다음 명령은 NoLanguage 세션 구성을 만들 때 NoLanguage.pssc 파일을 사용해요.

Register-PSSessionConfiguration -Name NoLanguage
-Path .\NoLanguage.pssc

새 NoLanguage 세션이 시작되면 사용자에게는 PowerShell 명령만 사용할 수 있게 돼요.

기존 세션 구성에 세션 구성 파일을 추가하려면 Set-PSSessionConfiguration cmdlet과 Path 매개 변수를 사용해요. 이건 지정된 세션 구성으로 만들어지는 새 세션들에 영향을 줘요. 참고로 Set-PSSessionConfiguration cmdlet은 세션 자체를 변경하지, 세션 구성 파일을 수정하는 건 아니에요.

예를 들어 다음 명령은 NoLanguage.pssc 파일을 LockedDown 세션 구성에 추가해요.

Set-PSSessionConfiguration -Name LockedDown -Path .\NoLanguage.pssc

사용자가 LockedDown 세션 구성을 사용해 세션을 만들면 cmdlet은 실행할 수 있어도, 변수를 만들거나 사용하고, 값을 할당하고, 그 외 PowerShell 언어 요소를 쓰는 일은 할 수 없어요.

다음 명령은 New-PSSession cmdlet을 사용해 Srv01 컴퓨터에서 LockedDown 세션 구성을 사용하는 세션을 만들고, 그 세션에 대한 개체 참조를 $s 변수에 저장해요. 누가 이 세션 구성을 사용해 세션을 만들 수 있는지는 세션 구성의 ACL(액세스 제어 목록)이 결정해요.

$s = New-PSSession -ComputerName Srv01 -ConfigurationName LockedDown

LockedDown 세션 구성에 NoLanguage 제약이 추가됐기 때문에, LockedDown 세션의 사용자는 PowerShell 명령과 cmdlet만 실행할 수 있어요. 예를 들어 다음 두 명령은 $s 변수가 가리키는 세션에서 명령을 실행하기 위해 Invoke-Command cmdlet을 사용해요. Get-UICulture cmdlet을 실행하고 변수를 쓰지 않는 첫 번째 명령은 성공하지만, $PSUICulture 변수의 값을 가져오는 두 번째 명령은 실패해요.

Invoke-Command -Session $s {Get-UICulture}
en-US

Invoke-Command -Session $s {$PSUICulture}
The syntax is not supported by this runspace. This might be
because it is in no-language mode.
+ CategoryInfo          : ParserError: ($PSUICulture:String) [],
ParseException
+ FullyQualifiedErrorId : ScriptsNotAllowed

세션 구성 파일 편집하기 (Editing a session configuration file)

RunAsVirtualAccountRunAsVirtualAccountGroups를 제외한 세션 구성의 모든 설정은, 세션 구성이 사용하는 세션 구성 파일을 편집해서 수정할 수 있어요. 그러려면 먼저 세션 구성 파일의 활성 사본을 찾아야 해요.

세션 구성에서 세션 구성 파일을 사용하면 PowerShell이 세션 구성 파일의 활성 사본을 만들어 로컬 컴퓨터의 $PSHOME\SessionConfig 디렉터리에 저장해요.

세션 구성 파일의 활성 사본 위치는 세션 구성 개체의 ConfigFilePath 속성에 저장돼요.

다음 명령은 NoLanguage 세션 구성의 세션 구성 파일 위치를 가져와요.

(Get-PSSessionConfiguration -Name NoLanguage).ConfigFilePath

그 명령은 다음과 비슷한 파일 경로를 반환해요.

C:\WINDOWS\System32\WindowsPowerShell\v1.0\SessionConfig\
NoLanguage_0c115179-ff2a-4f66-a5eb-e56e5692ba22.pssc

.pssc 파일은 아무 텍스트 편집기에서나 편집할 수 있어요. 저장을 하면 그 세션 구성을 사용하는 모든 새 세션에 적용돼요.

RunAsVirtualAccountRunAsVirtualAccountGroups 설정을 수정해야 한다면, 세션 구성을 등록 해제하고 편집된 값을 담은 세션 구성 파일을 다시 등록해야 해요.

세션 구성 파일 테스트하기 (Testing a session configuration file)

Test-PSSessionConfigurationFile cmdlet을 사용해 수동으로 편집한 세션 구성 파일을 테스트해요. 이건 꽤 중요해요. 파일 구문과 값이 유효하지 않으면 사용자가 그 세션 구성으로 세션을 만들 수 없거든요.

예를 들어 다음 명령은 NoLanguage 세션 구성의 활성 세션 구성 파일을 테스트해요.

Test-PSSessionConfigurationFile -Path C:\WINDOWS\System32\
WindowsPowerShell\v1.0\SessionConfig\
NoLanguage_0c115179-ff2a-4f66-a5eb-e56e5692ba22.pssc

구성 파일의 구문과 값이 유효하면 Test-PSSessionConfigurationFileTrue를 반환하고, 유효하지 않으면 cmdlet이 False를 반환해요.

Test-PSSessionConfigurationFile로는 New-PSSessionConfiguration cmdlet이 만든 파일을 포함해 어떤 세션 구성 파일이든 테스트할 수 있어요. 자세한 내용은 Test-PSSessionConfigurationFile cmdlet 도움말 항목을 참고해 주세요.

세션 구성 파일 제거하기 (Removing a session configuration file)

세션 구성에서 세션 구성 파일을 제거할 수는 없어요. 대신 기본 설정을 사용하는 새 파일로 그 파일을 교체하면 되는데, 이러면 원래 구성 파일이 쓰던 설정이 사실상 취소돼요.

세션 구성 파일을 교체하려면 기본 설정을 사용하는 새 세션 구성 파일을 만든 다음, Set-PSSessionConfiguration cmdlet으로 커스텀 세션 구성 파일을 새 파일로 교체해요.

예를 들어 다음 명령은 Default 세션 구성 파일을 만든 뒤, NoLanguage 세션 구성의 활성 세션 구성 파일을 교체해요.

New-PSSessionConfigurationFile -Path .\Default.pssc
Set-PSSessionConfiguration -Name NoLanguage
-Path .\Default.pssc

이 명령들이 끝나면 NoLanguage 세션 구성은 그 세션 구성으로 만들어진 모든 세션에 전체 언어 지원(기본 설정)을 제공하게 돼요.

세션 구성의 속성 보기 (Viewing the Properties of a Session Configuration)

세션 구성 파일을 사용하는 세션 구성을 나타내는 세션 구성 개체에는, 그 세션 구성을 발견하고 분석하기 좋게 해 주는 추가 속성이 있어요. (아래에 보이는 형식 이름에는 서식이 지정된 보기 정의가 포함돼 있다는 점에 주의하세요.) 속성을 보려면 Get-PSSessionConfiguration cmdlet을 실행하고 반환된 데이터를 Get-Member cmdlet에 파이프로 넘기면 돼요.

Get-PSSessionConfiguration NoLanguage | Get-Member
TypeName: Microsoft.PowerShell.Commands.PSSessionConfigurationCommands
#PSSessionConfiguration

Name                          MemberType     Definition
----                          ----------     ----------
Equals                        Method         bool Equals(System.O...
GetHashCode                   Method         int GetHashCode()
GetType                       Method         type GetType()
ToString                      Method         string ToString()
Architecture                  NoteProperty   System.String Archit...
Author                        NoteProperty   System.String Author...
AutoRestart                   NoteProperty   System.String AutoRe...
Capability                    NoteProperty   System.Object[] Capa...
CompanyName                   NoteProperty   System.String Compan...
configfilepath                NoteProperty   System.String config...
Copyright                     NoteProperty   System.String Copyri...
Enabled                       NoteProperty   System.String Enable...
ExactMatch                    NoteProperty   System.String ExactM...
ExecutionPolicy               NoteProperty   System.String Execut...
Filename                      NoteProperty   System.String Filena...
GUID                          NoteProperty   System.String GUID=0...
ProcessIdleTimeoutSec         NoteProperty   System.String Proces...
IdleTimeoutms                 NoteProperty   System.String IdleTi...
lang                          NoteProperty   System.String lang=e...
LanguageMode                  NoteProperty   System.String Langua...
MaxConcurrentCommandsPerShell NoteProperty   System.String MaxCon...
MaxConcurrentUsers            NoteProperty   System.String MaxCon...
MaxIdleTimeoutMs              NoteProperty   System.String MaxIdl...
MaxMemoryPerShellMB           NoteProperty   System.String MaxMem...
MaxProcessesPerShell          NoteProperty   System.String MaxPro...
MaxShells                     NoteProperty   System.String MaxShells
MaxShellsPerUser              NoteProperty   System.String MaxShe...
Name                          NoteProperty   System.String Name=N...
PSVersion                     NoteProperty   System.String PSVersion
ResourceUri                   NoteProperty   System.String Resour...
RunAsPassword                 NoteProperty   System.String RunAsP...
RunAsUser                     NoteProperty   System.String RunAsUser
SchemaVersion                 NoteProperty   System.String Schema...
SDKVersion                    NoteProperty   System.String SDKVer...
OutputBufferingMode           NoteProperty   System.String Output...
SessionType                   NoteProperty   System.String Sessio...
UseSharedProcess              NoteProperty   System.String UseSha...
SupportsOptions               NoteProperty   System.String Suppor...
xmlns                         NoteProperty   System.String xmlns=...
XmlRenderingType              NoteProperty   System.String XmlRen...
Permission                    ScriptProperty System.Object Permis...

이런 속성 덕분에 특정 세션 구성을 쉽게 찾을 수 있어요. 예를 들어 ExecutionPolicy 속성을 사용해 RemoteSigned 실행 정책을 지원하는 세션을 가진 세션 구성을 찾을 수 있어요. 다만 ExecutionPolicy 속성은 세션 구성 파일을 사용하는 세션에만 존재하므로, 이 명령이 모든 조건에 맞는 세션 구성을 반환하지는 않을 수 있다는 점을 참고해 주세요.

Get-PSSessionConfiguration | Where-Object {$_.ExecutionPolicy -eq "RemoteSigned"}

다음 명령은 RunAsUser가 Exchange 관리자인 세션 구성을 가져와요.

 Get-PSSessionConfiguration | Where-Object {$_.RunAsUser -eq "Exchange01\Admin01"}

구성과 연결된 역할 정의에 대한 정보를 보려면 Get-PSSessionCapability cmdlet을 사용해요. 이 cmdlet으로 특정 엔드포인트에서 특정 사용자가 이용할 수 있는 명령과 환경을 파악할 수 있어요.

참고 사항 (Notes)

세션 구성은 "빈"(empty) 세션이라고 부르는 세션 유형도 지원해요. Empty 세션 유형을 사용하면 선택한 명령만으로 커스텀 세션을 만들 수 있어요. 빈 세션에 모듈·함수·스크립트를 추가하지 않으면 그 세션은 식에만 제한되고 실용적으로 쓸모가 없을 수 있어요. SessionType 속성이 지금 빈 세션을 다루고 있는지 아닌지를 알려줘요.

더 알아보기