about_Registry_Provider — PowerShell 레지스트리 공급자

about_Registry_Provider — PowerShell 레지스트리 공급자

윈도우에서 레지스트리를 다룰 일이 많죠? 레지스트리는 환경 변수처럼 깊이 숨어 있어서 막상 건드리려면 방법이 막연할 때가 있어요. 이 문서에서 다루는 PowerShell Registry 공급자를 쓰면 레지스트리 키와 값을 마치 파일 시스템처럼 Get-Item, Set-ItemProperty 같은 익숙한 cmdlet으로 조작할 수 있게 됩니다. 키를 만들고, 값을 바꾸고, 지우고, 보안 권한까지 — 파일처럼 생각하면 구조가 훨씬 편해져요.

출처: Microsoft Learn — about_Registry_Provider

본문

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들을 지원해요.

이 공급자가 다루는 형식 (Types exposed by this provider)

Registry 공급자는 레지스트리 데이터를 두 가지 형식 중 하나로 돌려줘요.

레지스트리 드라이브 둘러보기

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, lsGet-ChildItem의 별칭이고, cdSet-Location의 별칭이며, pwdGet-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-ItemGet-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-ItemMove-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-AclSet-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에서도 사용할 수 있지만 효과는 없습니다.

  • StringREG_SZ 값에 사용. Value 매개 변수에 [System.String] 개체를 전달해요.
  • ExpandStringREG_EXPAND_SZ 값에 사용. Value 매개 변수에 [System.String] 개체를 전달해요. 문자열에는 확장되지 않은 환경 변수 참조가 포함되어야 하며, 값이 검색될 때 확장됩니다.
  • BinaryREG_BINARY 값에 사용. Value 매개 변수에 [System.Byte[]] 개체를 전달해요.
  • DWordREG_DWORD 값에 사용. Value 매개 변수에 [System.Int32] 개체를 전달해요.
  • MultiStringREG_MULTI_SZ 값에 사용. Value 매개 변수에 [System.String[]] 개체를 전달해요.
  • QWordREG_QWORD 값에 사용. Value 매개 변수에 [System.Int64] 개체를 전달해요.
  • UnknownREG_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:

더 알아보기