about_Registry_Provider — PowerShell 레지스트리 공급자
about_Registry_Provider — PowerShell 레지스트리 공급자
윈도우에서 레지스트리를 다룰 일이 많죠? 레지스트리는 환경 변수처럼 깊이 숨어 있어서 막상 건드리려면 방법이 막연할 때가 있어요. 이 문서에서 다루는 PowerShell Registry 공급자를 쓰면 레지스트리 키와 값을 마치 파일 시스템처럼 Get-Item, Set-ItemProperty 같은 익숙한 cmdlet으로 조작할 수 있게 됩니다. 키를 만들고, 값을 바꾸고, 지우고, 보안 권한까지 — 파일처럼 생각하면 구조가 훨씬 편해져요.
본문
Provider name
Registry
Drives
HKLM:, HKCU:
Capabilities
ShouldProcess, UseTransactions
개요 (Short description)
레지스트리 키(key), 항목(entry), 값(value)에 접근할 수 있게 해 줍니다.
상세 설명 (Detailed description)
이 내용은 윈도우에서 실행되는 PowerShell에만 적용돼요.
PowerShell Registry 공급자는 레지스트리 키, 항목, 값을 PowerShell 안에서 가져오고, 추가하고, 바꾸고, 지우고, 삭제하는 데 사용합니다.
레지스트리 드라이브는 컴퓨터의 레지스트리 키와 하위 키(subkey)로 이루어진 계층적 네임스페이스예요. 여기서 주의할 점이 하나 있어요. 레지스트리 항목(entry)과 값(value)은 이 계층의 구성 요소가 아니라, 각 키의 속성(property) 입니다. 디렉터리 트리 안에 파일이 있는 게 아니라, 각 폴더에 붙어 있는 "속성" 같은 존재라는 뜻이에요.
Registry 공급자는 다음 cmdlet들을 지원해요.
Get-Location(링크)Set-Location(링크)Get-Item(링크)Get-ChildItem(링크)Invoke-Item(링크)Move-Item(링크)New-Item(링크)Remove-Item(링크)Clear-ItemProperty(링크)Get-ItemProperty(링크)New-ItemProperty(링크)Remove-ItemProperty(링크)Set-ItemProperty(링크)Get-Acl(링크)Set-Acl(링크)
이 공급자가 다루는 형식 (Types exposed by this provider)
Registry 공급자는 레지스트리 데이터를 두 가지 형식 중 하나로 돌려줘요.
- 레지스트리 키:
Microsoft.Win32.RegistryKey(관련 .NET 문서) - 레지스트리 값:
PSCustomObject(관련 .NET 문서)
레지스트리 드라이브 둘러보기
Registry 공급자는 데이터 저장소를 두 개의 기본 드라이브로 노출합니다.
HKLM:—HKEY_LOCAL_MACHINE하이브에 매핑HKCU:—HKEY_CURRENT_USER하이브에 매핑
레지스트리를 다룰 땐 먼저 현재 위치를 HKLM: 드라이브로 바꾸면 돼요.
Set-Location HKLM:
다시 파일 시스템 드라이브로 돌아가려면 드라이브 이름을 입력해요.
Set-Location C:
다른 PowerShell 드라이브에 있더라도 Registry 공급자를 쓸 수 있어요. 다른 위치에서 레지스트리 키를 참조하려면 경로에 드라이브 이름(HKLM:, HKCU:)을 쓰면 되고, 레지스트리 드라이브의 한 단계(level)를 나타낼 땐 백슬래시(\)나 슬래시(/)를 사용합니다.
PS C:\> cd HKLM:\Software
참고
PowerShell은 공급자 경로를 다룰 때 익숙한 별칭을 제공해요.
dir,ls는Get-ChildItem의 별칭이고,cd는Set-Location의 별칭이며,pwd는Get-Location의 별칭입니다.
마지막 예시는 Registry 공급자를 탐색할 수 있는 또 다른 경로 문법을 보여줘요. 이 문법은 공급자 이름 뒤에 콜론 두 개 :: 를 쓰는데, 매핑된 드라이브 이름 HKLM 대신 전체 하이브 이름을 사용할 수 있게 해 줍니다.
cd "Registry::HKEY_LOCAL_MACHINE\Software"
레지스트리 키의 내용 보기
레지스트리는 키(key), 하위 키(subkey), 항목(entry)으로 나뉘어요. 레지스트리 구조가 궁금하다면 레지스트리 구조 문서(Structure of the Registry)를 참고하세요.
레지스트리 드라이브에서 각 키는 하나의 컨테이너예요. 키는 얼마든지 많은 키를 포함할 수 있고, 부모 키를 가진 레지스트리 키를 하위 키(subkey) 라고 불러요. 키 목록을 보려면 Get-ChildItem을 쓰고, 키 경로로 이동하려면 Set-Location을 사용하면 됩니다.
레지스트리 값은 레지스트리 키의 속성(attribute) 입니다. 레지스트리 드라이브에서는 이를 항목 속성(Item Property) 이라고 불러요. 즉 레지스트리 키 하나는 자식 키(children keys)도, 항목 속성(item properties)도 가질 수 있습니다.
아래 예시는 Get-Item과 Get-ChildItem의 차이를 보여줍니다. "Spooler" 레지스트리 키에 Get-Item을 쓰면 그 키의 속성을 볼 수 있어요.
Get-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\Spooler
Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
Name Property
---- --------
Spooler DependOnService : {RPCSS, http}
Description : @%systemroot%\system32\spoolsv.exe,-2
DisplayName : @%systemroot%\system32\spoolsv.exe,-1
ErrorControl : 1
FailureActions : {16, 14, 0, 0...}
Group : SpoolerGroup
ImagePath : C:\WINDOWS\System32\spoolsv.exe
ObjectName : LocalSystem
RequiredPrivileges : {SeTcbPrivilege, SeImpersonatePrivilege, ...
ServiceSidType : 1
Start : 2
Type : 27
여기서 헷갈리기 쉬운 부분이 있어요. 각 레지스트리 키는 하위 키도 가질 수 있는데, Get-Item을 쓰면 그 키의 속성만 보여주고 하위 키는 표시하지 않습니다. 반면 Get-ChildItem은 "Spooler" 키의 하위 키들을 각각의 속성과 함께 보여줘요. Get-ChildItem을 쓸 땐 부모 키의 속성은 나타나지 않는 점이 차이예요.
Get-ChildItem -Path HKLM:\SYSTEM\CurrentControlSet\Services\Spooler
Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Spooler
Name Property
---- --------
Performance Close : PerfClose
Collect : PerfCollect
Collect Timeout : 2000
Library : C:\Windows\System32\winspool.drv
Object List : 1450
Open : PerfOpen
Open Timeout : 4000
Security Security : {1, 0, 20, 128...}
Get-Item은 현재 위치에서도 사용할 수 있어요. 아래 예시는 "Spooler" 레지스트리 키로 이동해서 항목 속성을 가져옵니다. 점 .은 현재 위치를 나타내요.
cd HKLM:\System\CurrentControlSet\Services\Spooler
Get-Item .
Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
Name Property
---- --------
Spooler DependOnService : {RPCSS, http}
Description : @%systemroot%\system32\spoolsv.exe,-2
...
이 절에서 다룬 cmdlet에 대한 자세한 내용은 다음 문서를 참고하세요.
레지스트리 키의 값 보기
레지스트리 키의 값은 각 키의 속성으로 저장돼요. Get-ItemProperty cmdlet은 지정한 이름의 레지스트리 키 속성을 봅니다. 결과는 지정한 속성을 담은 PSCustomObject예요.
아래 예시는 모든 속성을 보기 위해 Get-ItemProperty를 쓰고, 결과를 변수에 저장해서 원하는 속성 값에 접근하고 있어요.
$p = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Spooler
$p.DependOnService
RPCSS
http
-Name 매개 변수에 값을 지정하면 그 속성들만 골라내서 PSCustomObject로 돌려줘요. 아래 예시는 -Name 매개 변수를 쓸 때와 안 쓸 때의 출력 차이를 보여줍니다.
Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Wbem
BUILD : 17134.1
Installation Directory : C:\WINDOWS\system32\WBEM
MOF Self-Install Directory : C:\WINDOWS\system32\WBEM\MOF
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wbem
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
PSChildName : Wbem
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Wbem -Name BUILD
BUILD : 17134.1
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wbem
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
PSChildName : Wbem
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
PowerShell 5.0부터는 Get-ItemPropertyValue cmdlet이 지정한 속성의 값만 돌려줍니다.
Get-ItemPropertyValue -Path HKLM:\SOFTWARE\Microsoft\Wbem -Name BUILD
17134.1
이 절에서 쓴 cmdlet의 자세한 내용은 다음 문서를 참고하세요.
레지스트리 키의 값 바꾸기
Set-ItemProperty cmdlet은 레지스트리 키와 연결된 값을 설정해요. 아래 예시는 spooler 서비스의 시작 유형을 수동(manual)으로 바꿉니다. 그다음 Set-Service cmdlet으로 다시 자동(Automatic)으로 되돌리고 있어요.
Get-Service spooler | Select-Object Name, StartMode
Name StartType
---- ---------
spooler Automatic
$path = "HKLM:\SYSTEM\CurrentControlSet\Services\Spooler\"
Set-ItemProperty -Path $path -Name Start -Value 3
Get-Service spooler | Select-Object Name, StartMode
Name StartType
---- ---------
spooler Manual
Set-Service -Name Spooler -StartupType Automatic
각 레지스트리 키에는 기본 값(default value) 이 있어요. 이 기본 값을 바꾸려면 Set-Item이나 Set-ItemProperty를 쓰면 됩니다.
Set-ItemProperty -Path HKLM:\SOFTWARE\Contoso -Name "(default)" -Value "one"
Set-Item -Path HKLM:\SOFTWARE\Contoso -Value "two"
이 절에서 쓴 cmdlet의 자세한 내용은 다음 문서를 참고하세요.
레지스트리 키와 값 만들기
New-Item cmdlet은 지정한 이름으로 새 레지스트리 키를 만듭니다. 내부적으로 New-Item cmdlet을 호출하는 mkdir 함수를 써도 돼요.
mkdir ContosoCompany
Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Name Property
---- --------
ContosoCompany
New-ItemProperty cmdlet으로는 지정한 레지스트리 키 안에 값을 만들 수 있어요. 아래 예시는 ContosoCompany 레지스트리 키에 새 DWORD 값을 만듭니다.
$path = "HKLM:\SOFTWARE\ContosoCompany"
New-ItemProperty -Path $path -Name Test -Type DWord -Value 1
참고
그 밖에 허용되는 형식 값은 이 문서의 동적 매개 변수(Dynamic parameters) 절을 확인하세요.
cmdlet 사용법이 더 궁금하다면 New-ItemProperty 문서를 보세요.
레지스트리 키와 값 복사하기
Registry 공급자에서 Copy-Item cmdlet은 레지스트리 키와 값을 복사하고, Copy-ItemProperty cmdlet은 레지스트리 값만 복사해요. 아래 명령은 "Contoso" 레지스트리 키와 그 속성을 지정한 위치 HKLM:\Software\Fabrikam으로 복사합니다.
여기서 동작을 정확히 이해해야 해요. Copy-Item은 대상 키가 없으면 만들어 줍니다. 대상 키가 이미 존재하면, Copy-Item은 소스 키의 복사본을 대상 키의 자식 항목(하위 키)으로 만듭니다.
Copy-Item -Path HKLM:\Software\Contoso -Destination HKLM:\Software\Fabrikam
아래 명령은 Copy-ItemProperty cmdlet으로 "Contoso" 키의 "Server" 값을 "Fabrikam" 키로 복사해요.
$source = "HKLM:\SOFTWARE\Contoso"
$dest = "HKLM:\SOFTWARE\Fabrikam"
Copy-ItemProperty -Path $source -Destination $dest -Name Server
이 절에서 쓴 cmdlet의 자세한 내용은 다음 문서를 참고하세요.
레지스트리 키와 값 이동하기
Move-Item과 Move-ItemProperty cmdlet은 "Copy" 대응 cmdlet과 비슷하게 동작해요. 대상이 존재하면 Move-Item은 소스 키를 대상 키의 하위 키로 옮기고, 대상 키가 없으면 소스 키를 대상 경로로 이동시킵니다.
아래 명령은 "Contoso" 키를 HKLM:\SOFTWARE\Fabrikam 경로로 옮겨요.
Move-Item -Path HKLM:\SOFTWARE\Contoso -Destination HKLM:\SOFTWARE\Fabrikam
이 명령은 HKLM:\SOFTWARE\ContosoCompany의 모든 속성을 HKLM:\SOFTWARE\Fabrikam으로 이동합니다.
$source = "HKLM:\SOFTWARE\Contoso"
$dest = "HKLM:\SOFTWARE\Fabrikam"
Move-ItemProperty -Path $source -Destination $dest -Name *
이 절에서 쓴 cmdlet의 자세한 내용은 다음 문서를 참고하세요.
레지스트리 키와 값 이름 바꾸기
파일과 폴더를 다루듯 레지스트리 키와 값의 이름도 바꿀 수 있어요. Rename-Item은 레지스트리 키를, Rename-ItemProperty는 레지스트리 값의 이름을 바꿉니다.
$path = "HKLM:\SOFTWARE\Contoso"
Rename-ItemProperty -Path $path -Name ContosoTest -NewName FabrikamTest
Rename-Item -Path $path -NewName Fabrikam
보안 설명자 바꾸기
Get-Acl과 Set-Acl cmdlet으로 레지스트리 키에 대한 접근을 제한할 수 있어요. 아래 예시는 HKLM:\SOFTWARE\Contoso 레지스트리 키에 전체 제어(full control) 권한을 가진 새 사용자를 추가합니다.
$acl = Get-Acl -Path HKLM:\SOFTWARE\Contoso
$rule = New-Object System.Security.AccessControl.RegistryAccessRule `
("CONTOSO\jsmith", "FullControl", "Allow")
$acl.SetAccessRule($rule)
$acl | Set-Acl -Path HKLM:\SOFTWARE\Contoso
더 많은 예시와 cmdlet 사용법은 다음 문서를 참고하세요.
레지스트리 키와 값 제거·비우기
포함된 항목을 지우려면 Remove-Item을 씁니다. 항목 안에 다른 것이 들어 있으면 제거 확인을 묻는 프롬프트가 나와요. 아래 예시는 HKLM:\SOFTWARE\Contoso 키를 삭제하려는 상황입니다.
dir HKLM:\SOFTWARE\Contoso\
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Contoso
Name Property
---- --------
ChildKey
Remove-Item -Path HKLM:\SOFTWARE\Contoso
Confirm
The item at HKLM:\SOFTWARE\Contoso has children and the -Recurse
parameter wasn't specified. If you continue, all children will be removed
with the item. Are you sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):
묻는 프롬프트 없이 포함된 항목까지 지우고 싶다면 -Recurse 매개 변수를 지정하세요.
Remove-Item -Path HKLM:\SOFTWARE\Contoso -Recurse
HKLM:\SOFTWARE\Contoso 안의 모든 항목을 지우되 Contoso 자체는 남기고 싶다면, 뒤에 백슬래시 \ 다음에 와일드카드를 붙이면 돼요.
Remove-Item -Path HKLM:\SOFTWARE\Contoso\* -Recurse
이 명령은 HKLM:\SOFTWARE\Contoso 레지스트리 키에서 "ContosoTest" 레지스트리 값을 삭제합니다.
Remove-ItemProperty -Path HKLM:\SOFTWARE\Contoso -Name ContosoTest
Clear-Item은 키의 모든 레지스트리 값을 비웁니다. 아래 예시는 HKLM:\SOFTWARE\Contoso 키에서 모든 값을 비워요. 특정 속성만 비우고 싶으면 Clear-ItemProperty를 사용하세요.
Get-Item .\Contoso\
Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Name Property
---- --------
Contoso Server : {a, b, c}
HereString : {This is text which contains
newlines. It also contains "quoted" strings}
(default) : 1
Clear-Item .\Contoso\
Get-Item .\Contoso\
Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Name Property
---- --------
Contoso
더 많은 예시와 cmdlet 사용법은 다음 문서를 참고하세요.
동적 매개 변수 (Dynamic parameters)
동적 매개 변수는 PowerShell 공급자가 추가하는 cmdlet 매개 변수로, 해당 cmdlet이 공급자가 활성화된 드라이브 안에서 사용될 때만 쓸 수 있어요.
Type
레지스트리 값의 데이터 형식을 설정하거나 변경합니다. 기본값은 String(REG_SZ)이에요.
이 매개 변수는 Set-ItemProperty cmdlet에서는 설계된 대로 동작하고, 레지스트리 드라이브의 Set-Item cmdlet에서도 사용할 수 있지만 효과는 없습니다.
String—REG_SZ값에 사용.Value매개 변수에[System.String]개체를 전달해요.ExpandString—REG_EXPAND_SZ값에 사용.Value매개 변수에[System.String]개체를 전달해요. 문자열에는 확장되지 않은 환경 변수 참조가 포함되어야 하며, 값이 검색될 때 확장됩니다.Binary—REG_BINARY값에 사용.Value매개 변수에[System.Byte[]]개체를 전달해요.DWord—REG_DWORD값에 사용.Value매개 변수에[System.Int32]개체를 전달해요.MultiString—REG_MULTI_SZ값에 사용.Value매개 변수에[System.String[]]개체를 전달해요.QWord—REG_QWORD값에 사용.Value매개 변수에[System.Int64]개체를 전달해요.Unknown—REG_RESOURCE_LIST값처럼 지원되지 않는 레지스트리 데이터 형식을 나타내요.
파이프라인 사용하기
공급자 cmdlet은 파이프라인 입력을 받아들여요. 파이프라인을 쓰면 공급자 데이터를 한 cmdlet에서 다른 공급자 cmdlet으로 보내 작업을 단순화할 수 있습니다. 공급자 cmdlet과 파이프라인을 어떻게 함께 쓰는지는 이 문서 전반에 걸쳐 나오는 cmdlet 참고 문서를 확인하는 게 좋아요.
도움말 보기
Windows PowerShell 3.0부터는 파일 시스템 드라이브에서 공급자 cmdlet이 어떻게 동작하는지 설명하는 사용자 지정 도움말 항목을 받을 수 있어요.
파일 시스템 드라이브에 맞춰진 도움말 항목을 보려면, 파일 시스템 드라이브에서 Get-Help 명령을 실행하거나 Path 매개 변수로 파일 시스템 드라이브를 지정하세요.
Get-Help Get-ChildItem
Get-Help Get-ChildItem -Path HKLM:
더 알아보기
- about_Providers — PowerShell 공급자 개념 전반
- 원문(GitHub 소스): about_Registry_Provider.md