about_Providers — PowerShell 프로바이더 이해하기
about_Providers — PowerShell 프로바이더 이해하기
DOS 시절에 C: 드라이브에 들어가 파일을 살펴본 적 있으시죠? PowerShell은 그런 익숙한 '드라이브' 모양을 그대로 빌려서, 파일이 아닌 데이터에도 똑같이 접근하게 해 줘요. 레지스트리도, 환경 변수도, 인증서 저장소도 전부 드라이브처럼 열어볼 수 있는 거예요. 이걸 가능하게 해 주는 게 바로 프로바이더(Provider) 입니다. 오늘은 이 프로바이더가 뭔지, 어떻게 쓰는지 천천히 함께 살펴볼게요.
출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_providers
본문
프로바이더는 명령줄에서 쉽게 접근하기 어려운 데이터와 구성 요소에 접근할 수 있게 해 줘요. 그리고 그 데이터를 파일 시스템 드라이브처럼 일관된 형식으로 보여줘요. 덕분에 데이터 종류가 달라도, 다루는 방법은 비슷하게 유지된답니다.
프로바이더는 정확히 뭐예요?
PowerShell 프로바이더는 .NET 프로그램이에요. 특수한 데이터 저장소를 더 쉽게 보고 관리할 수 있도록 다리를 놓아 주는 역할을 해요. 이 데이터가 드라이브에 나타나고, 하드디스크처럼 경로(path)로 접근할 수 있어요.
- 프로바이더가 지원하는 내장 cmdlet을 쓰면 드라이브 안의 데이터를 관리할 수 있어요.
- 그 데이터를 위해 특별히 설계된 사용자 지정 cmdlet도 사용할 수 있죠.
- 프로바이더가 내장 cmdlet에 동적 매개변수(dynamic parameter) 를 추가해 주기도 해요. 다만 이 매개변수는 그 프로바이더의 데이터와 함께 쓸 때만 사용할 수 있어요.
기본 제공 프로바이더(Built-in providers)
PowerShell에는 서로 다른 종류의 객체에 접근할 수 있게 해 주는 기본 프로바이더들이 함께 제공돼요. 어떤 게 있는지, 각각의 드라이브와 객체 형식을 정리해 볼게요.
- Alias provider
- Drive -
Alias: - Object types - System.Management.Automation.AliasInfo
- Drive -
- Certificate provider
- Drive -
Cert: - Object types - Microsoft.PowerShell.Commands.X509StoreLocation, System.Security.Cryptography.X509Certificates.X509Certificate2
- Drive -
- Environment provider
- Drive -
Env: - Object types - System.Collections.DictionaryEntry
- Drive -
- FileSystem provider
- Drive -
C:and other depending on hardware - Object types - System.IO.FileInfo, System.IO.DirectoryInfo
- Drive -
- Function provider
- Drive -
Function: - Object types - System.Management.Automation.FunctionInfo
- Drive -
- Registry provider
- Drive -
HKLM:,HKCU: - Object types - Microsoft.Win32.RegistryKey
- Drive -
- Variable provider
- Drive -
Variable: - Object types - System.Management.Automation.PSVariable
- Drive -
- WSMan provider
- Drive -
WSMan: - Object types - Microsoft.WSMan.Management.WSManConfigContainerElement
- Drive -
직접 프로바이더를 만들 수도 있고, 다른 사람이 개발한 프로바이더를 설치해 쓸 수도 있어요. 지금 세션에서 어떤 프로바이더를 사용할 수 있는지 보고 싶으면 이렇게 입력해요.
Get-PSProvider
참고 —
Certificate,Registry,WSMan프로바이더는 Windows 플랫폼에서만 사용할 수 있어요.
프로바이더 설치와 제거
프로바이더는 보통 PowerShell 모듈을 통해 설치돼요. 모듈을 가져오면(Import) 프로바이더가 세션에 로드되는 방식이에요.
- 기본 제공 프로바이더는 제거할 수 없어요. 다른 모듈이 로드한 프로바이더만 제거할 수 있죠.
Remove-Modulecmdlet으로 현재 세션에서 프로바이더를 내릴(unload) 수 있어요. 이건 모듈을 완전히 제거하는 게 아니라, 세션에서만 사용할 수 없게 만드는 거예요.Remove-PSDrivecmdlet으로 세션의 드라이브를 제거할 수도 있어요. 드라이브 안의 데이터는 그대로 남지만, 그 세션에서는 더 이상 접근할 수 없게 되죠.
프로바이더 보기
컴퓨터에 설치된 프로바이더를 확인할 때는 이렇게 입력해요.
Get-PSProvider
출력에는 기본 제공 프로바이더와 세션에 추가한 프로바이더가 함께 나열돼요.
프로바이더 cmdlet
아래 cmdlet들은 프로바이더가 노출하는 데이터와 함께 동작하도록 설계된 것들이에요. 같은 cmdlet을 같은 방식으로 쓰면, 프로바이더가 노출하는 서로 다른 데이터들을 관리할 수 있어요. 하나의 프로바이더 데이터를 다루는 법을 익히면, 다른 프로바이더 데이터에도 같은 방법을 그대로 적용할 수 있는 거죠.
예를 들어 New-Item cmdlet은 새 항목을 만들어요. C: 드라이브(FileSystem 프로바이더가 지원)에서는 새 파일이나 폴더를 만들고, Registry 프로바이더가 지원하는 드라이브에서는 새 레지스트리 키를 만들며, Alias: 드라이브에서는 새 별칭을 만들어요.
아래 cmdlet 중 자세한 정보가 필요하면 다음과 같이 도움말을 확인해요.
Get-Help <cmdlet-name> -Detailed
- ChildItem cmdlets
- Get-ChildItem
- Content Cmdlets
- Add-Content
- Clear-Content
- Get-Content
- Set-Content
- Item Cmdlets
- Clear-Item
- Copy-Item
- Get-Item
- Invoke-Item
- Move-Item
- New-Item
- Remove-Item
- Rename-Item
- Set-Item
- ItemProperty cmdlets
- Clear-ItemProperty
- Copy-ItemProperty
- Get-ItemProperty
- Move-ItemProperty
- New-ItemProperty
- Remove-ItemProperty
- Rename-ItemProperty
- Set-ItemProperty
- Location cmdlets
- Get-Location
- Pop-Location
- Push-Location
- Set-Location
- Path cmdlets
- Join-Path
- Convert-Path
- Split-Path
- Resolve-Path
- Test-Path
- PSDrive cmdlets
- Get-PSDrive
- New-PSDrive
- Remove-PSDrive
- PSProvider Cmdlets
- Get-PSProvider
프로바이더 데이터 보기
프로바이더의 가장 큰 장점은 데이터를 익숙하고 일관된 방식으로 보여준다는 점이에요. 그 모델이 바로 파일 시스템 드라이브예요.
프로바이더 덕분에 데이터 저장소 안의 항목을 마치 파일 시스템 데이터처럼 보고, 이동하고, 변경할 수 있어요. 데이터 저장소는 자신이 지원하는 드라이브의 이름으로 접근하고요.
드라이브는 Get-PSProvider cmdlet의 기본 출력에 나타나지만, 프로바이더 드라이브에 대한 자세한 정보는 Get-PSDrive cmdlet으로 얻을 수 있어요. 예를 들어 Function: 드라이브의 모든 속성을 보려면 이렇게 해요.
Get-PSDrive Function | Format-List *
프로바이더 드라이브 안의 데이터는 파일 시스템 드라이브처럼 보고 이동할 수 있어요. 드라이브 내용을 보려면 Get-Item이나 Get-ChildItem cmdlet을 쓰면 되고, 드라이브 이름 뒤에 콜론(:)을 붙여요. Alias: 드라이브의 내용을 보려면 이렇게 입력해요.
Get-Item Alias:
다른 드라이브에 있더라도 경로에 드라이브 이름을 포함하면 그 드라이브의 데이터를 보고 관리할 수 있어요. 예를 들어 HKLM: 드라이브의 HKLM\Software 레지스트리 키를 다른 드라이브에서 보려면 이렇게 해요.
Get-ChildItem HKLM:\SOFTWARE\
드라이브로 이동하려면 Set-Location cmdlet을 써요. 드라이브 경로를 지정할 때는 콜론을 꼭 붙여야 해요. Cert: 드라이브의 루트 디렉터리로 이동하려면 이렇게 해요.
Set-Location Cert:
그리고 Cert: 드라이브의 내용을 보려면 이렇게 입력하면 돼요.
Get-ChildItem
계층 구조 데이터 이동하기
프로바이더 드라이브는 하드디스크 드라이브처럼 마음껏 이동할 수 있어요. 데이터가 항목 안에 항목이 겹치는 계층 구조로 되어 있다면, 백슬래시(\) 로 하위 항목을 표시해요. 형식은 이렇게 되죠.
drive:\location\child-location\...
예를 들어 HKLM\Software 레지스트리 키로 이동하려면 Set-Location 명령을 이렇게 써요.
Set-Location HKLM:\SOFTWARE\
전체 경로(fully qualified name)의 어떤 요소에 공백이 들어 있다면, 그 이름을 큰따옴표(")로 감싸야 해요. 공백이 포함된 전체 경로의 예시는 이렇게 생겼어요.
"C:\Program Files\Internet Explorer\iexplore.exe"
상대 참조(relative reference)도 사용할 수 있어요. 점(.) 하나는 현재 위치를 나타내요. 예를 들어 HKLM:\Software\Microsoft 레지스트리 키에 있고, HKLM:\Software\Microsoft\PowerShell 키의 하위 키를 나열하려면 이렇게 입력해요.
Get-ChildItem .\PowerShell
또한 점 두 개(..)는 현재 위치 바로 위의 디렉터리나 컨테이너를 가리켜요. 이 이중 점(..)으로 프로바이더 계층 구조를 이동할 수 있어요.
PS HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters> cd ..\..\LanmanWorkstation\Parameters
PS HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters>
프로바이더 홈(Provider home)
프로바이더에는 Home 위치도 있어요. 이 위치는 해당 프로바이더가 지원하는 모든 PSDrive가 함께 공유해요. 프로바이더의 Home 속성을 보면 확인할 수 있는데, 이렇게 조회해요.
Get-PSProvider | Format-Table Name, Home
Name Home
---- ----
Registry
Alias
Environment
FileSystem C:\Users\username
Function
Variable
Certificate
FileSystem 프로바이더가 기본값으로 Home을 가지는 유일한 프로바이더인데, 그 값은 $HOME과 같아요. 자세한 내용은 about_Automatic_Variables 문서를 참고해요.
프로바이더의 Home 디렉터리는 현재 세션 기준으로 그 속성을 이용해 직접 설정할 수도 있어요.
(Get-PSProvider FileSystem).Home = "C:\"
~ 문자는 프로바이더의 홈 디렉터리를 나타내는 데 쓸 수 있어요. 그런데 프로바이더에 Home 위치가 설정되어 있지 않으면, 이렇게 오류가 발생해요.
Cert:\> Set-Location ~
Set-Location : Home location for this provider isn't set. To set the home
location, call "(Get-PSProvider 'Certificate').Home = 'path'".
At line:1 char:1
+ Set-Location ~
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Set-Location],
PSInvalidOperationException
...
동적 매개변수 찾기
동적 매개변수는 프로바이더가 cmdlet에 추가해 주는 매개변수예요. 이 매개변수는 그 프로바이더와 함께 cmdlet을 사용할 때만 쓸 수 있어요.
예를 들어 Cert: 드라이브는 Get-Item과 Get-ChildItem cmdlet에 CodeSigningCert 매개변수를 추가해요. 이 매개변수는 Cert: 드라이브에서 Get-Item이나 Get-ChildItem을 사용할 때만 쓸 수 있는 거죠.
프로바이더가 지원하는 동적 매개변수 목록은 그 프로바이더의 도움말 파일에서 확인할 수 있어요. 이렇게 입력해요.
Get-Help <provider-name>
예를 들어 이렇게요.
Get-Help Certificate
프로바이더에 대해 더 배우기
모든 프로바이더 데이터가 드라이브에 나타나고, 이를 이동하는 방법도 같긴 하지만, 비슷한 점은 거기까지예요. 프로바이더가 노출하는 데이터 저장소는 Active Directory 위치처럼 복잡할 수도 있고, Microsoft Exchange Server 사서함처럼 다양할 수 있죠.
개별 PowerShell 프로바이더에 대한 정보는 이렇게 확인해요.
Get-Help <ProviderName>
예를 들어 이렇게요.
Get-Help Registry
프로바이더 관련 도움말 항목 목록을 보려면 이렇게 입력해요.
Get-Help * -Category Provider