Windows에서 레지스트리에 접근하고 관리하는 도구가 레지스트리 편집기(regedit.exe)와 reg.exe 명령줄 유틸리티뿐인 것은 아닙니다. PowerShell은 관리자가 레지스트리를 다룰 수 있도록 다양한 기능을 제공합니다. PowerShell을 활용하면 레지스트리 키와 값을 생성·수정·삭제할 수 있고, 특정 값을 검색하거나 원격 컴퓨터의 레지스트리에 연결하는 것도 가능합니다.
파일 시스템처럼 PowerShell로 레지스트리 탐색하기
PowerShell에서 레지스트리를 다루는 방식은 로컬 디스크의 일반 파일을 다루는 것과 매우 유사합니다. 다만 이 개념에서는 레지스트리 키가 파일에 해당하고, 레지스트리 값(매개변수)은 파일의 속성에 해당한다는 점이 다릅니다.
먼저 컴퓨터에서 사용 가능한 드라이브 목록을 확인해 보겠습니다.
get-psdrive
드라이브 문자가 할당된 일반 드라이브 외에 Registry 공급자(Registry Provider)를 통해 접근하는 특수 드라이브인 HKCU(HKEY_CURRENT_USER)와 HKLM(HKEY_LOCAL_MACHINE)이 보입니다. 일반 드라이브를 탐색하듯 레지스트리 트리도 동일한 방식으로 이동할 수 있으며, HKLM:\과 HKCU:\는 각각의 레지스트리 하이브(hive)에 접근할 때 사용됩니다.
cd HKLM:\
Dir -ErrorAction SilentlyContinue
즉, 파일과 폴더를 관리할 때 사용하는 것과 같은 PowerShell cmdlet으로 레지스트리 키와 값에 접근할 수 있습니다.
키와 값을 위한 cmdlet 구분
레지스트리 키를 다룰 때는 xxx-Item 형태의 cmdlet을 사용합니다.
Get-Item– 레지스트리 키 정보 가져오기New-Item– 새 레지스트리 키 생성Remove-Item– 레지스트리 키 삭제
레지스트리 값은 키의 속성(property)으로 취급되며, xxx-ItemProperty 형태의 cmdlet으로 관리합니다.
Get-ItemProperty– 레지스트리 값 가져오기Set-ItemProperty– 레지스트리 값 변경New-ItemProperty– 새 레지스트리 값 생성Rename-ItemProperty– 값 이름 변경Remove-ItemProperty– 레지스트리 값 삭제
특정 레지스트리 키(예: 자동 드라이버 업데이트 설정을 담당하는 키)로 이동하려면 다음 두 가지 명령 중 하나를 사용하면 됩니다.
cd HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
또는Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
PowerShell로 레지스트리 값 조회하기
주의할 점은 레지스트리 키에 저장된 값들이 중첩된 개체(nested object)가 아니라 해당 키의 속성이라는 것입니다. 즉, 하나의 레지스트리 키는 여러 개의 값을 가질 수 있습니다.
다음 명령으로 현재 레지스트리 키의 내용을 확인해 보겠습니다.
dir
또는
Get-ChildItem
이 명령은 하위 레지스트리 키와 그 속성 정보를 표시하지만, 현재 키 자체의 속성인 SearchOrderConfig 값에 대한 정보는 보여주지 않습니다.
현재 키의 값들을 확인하려면 Get-Item cmdlet을 사용합니다.
Get-Item .
또는Get-Item –Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
실행 결과를 보면 DriverSearching 키에는 SearchOrderConfig라는 단 하나의 값이 있으며 그 값은 1임을 알 수 있습니다.
레지스트리 키의 특정 값을 가져올 때는 Get-ItemProperty cmdlet을 사용합니다.
$DriverUpdate = Get-ItemProperty –Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching'
$DriverUpdate.SearchOrderConfig
이렇게 해서 SearchOrderConfig 매개변수의 값이 1이라는 결과를 얻었습니다.
PowerShell로 레지스트리 값 변경하기
SearchOrderConfig 값을 변경하려면 Set-ItemProperty cmdlet을 사용합니다.
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig -Value 0
변경이 정상적으로 적용되었는지 확인해 보겠습니다.
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig
PowerShell로 새 레지스트리 키 또는 값 만들기
새 레지스트리 키를 생성하려면 New-Item 명령을 사용합니다. 예를 들어 NewKey라는 이름의 새 키를 만들어 보겠습니다.
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
New-Item –Path $HKCU_Desktop –Name NewKey
이제 새로 만든 키 안에 새 값을 추가해 보겠습니다. REG_SZ 문자열 타입의 SuperParamString이라는 이름의 값을 만들고 filetmp1.txt를 값으로 지정합니다.
New-ItemProperty -Path $HKCU_Desktop\NewKey -Name "SuperParamString" -Value "filetmp1.txt" -PropertyType "String"
레지스트리 값에 사용할 수 있는 데이터 타입은 다음과 같습니다.
- String (REG_SZ)
- ExpandString (REG_EXPAND_SZ)
- MultiString (REG_MULTI_SZ)
- Binary (REG_BINARY)
- DWord (REG_DWORD)
- Qword (REG_QWORD)
- Unknown (지원되지 않는 레지스트리 데이터 타입)
새로 만든 키와 값이 레지스트리에 정상적으로 등록되었는지 확인합니다.
레지스트리 키 존재 여부 확인 방법
특정 레지스트리 키가 존재하는지 확인하려면 Test-Path cmdlet을 사용합니다.
Test-Path 'HKCU:\Control Panel\Desktop\NewKey'
아래 PowerShell 스크립트는 특정 레지스트리 값의 존재 여부를 확인하고, 없으면 새로 생성합니다.
$regkey='HKCU:\Control Panel\Desktop\NewKey'
$regparam='testparameter'
if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore)
{ write-host 'The registry entry already exist' }
else
{ New-ItemProperty -Path $regkey -Name $regparam -Value "woshub_test" -PropertyType "String" }
Copy-Item cmdlet을 사용하면 한 레지스트리 키의 항목을 다른 키로 복사할 수도 있습니다.
$source='HKLM:\SOFTWARE\7-zip\'
$dest = 'HKLM:\SOFTWARE\backup'
Copy-Item -Path $source -Destination $dest -Recurse
하위 키까지 모두 복사하려면 –Recurse 스위치를 추가하면 됩니다.
레지스트리 키 또는 값 삭제하기
레지스트리 키에서 특정 값을 삭제하려면 Remove-ItemProperty 명령을 사용합니다. 앞서 생성한 SuperParamString 값을 삭제해 보겠습니다.
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
Remove-ItemProperty –Path $HKCU_Desktop\NewKey –Name "SuperParamString"
레지스트리 키 전체를 내용과 함께 삭제할 수도 있습니다.
Remove-Item –Path $HKCU_Desktop\NewKey –Recurse
참고: –Recurse 스위치는 모든 하위 키를 재귀적으로 삭제하겠다는 의미입니다.
키 자체는 유지하면서 키 안의 모든 항목만 삭제하려면 다음과 같이 실행합니다.
Remove-Item –Path $HKCU_Desktop\NewKey\* –Recurse
레지스트리 키 또는 값 이름 바꾸기
레지스트리 값의 이름은 다음 명령으로 변경할 수 있습니다.
Rename-ItemProperty –path 'HKCU:\Control Panel\Desktop\NewKey' –name "SuperParamString" –newname "OldParamString"
같은 방식으로 레지스트리 키의 이름도 변경할 수 있습니다.
Rename-Item -path 'HKCU:\Control Panel\Desktop\NewKey' OldKey
PowerShell로 레지스트리 검색하기
PowerShell을 이용하면 레지스트리 내부를 검색할 수도 있습니다. 다음 스크립트는 HKCU:\Control Panel\Desktop 키에서 이름에 *dpi*가 포함된 값들을 찾아냅니다.
$Path = (Get-ItemProperty 'HKCU:\Control Panel\Desktop')
$Path.PSObject.Properties | ForEach-Object {
If($_.Name -like '*dpi*'){
Write-Host $_.Name ' = ' $_.Value
}
}
특정 이름을 가진 레지스트리 키를 찾으려면 다음 명령을 사용합니다.
Get-ChildItem -path HKLM:\ -recurse -ErrorAction SilentlyContinue | Where-Object {$_.Name -like "*woshub*"}
PowerShell로 레지스트리 키 권한 설정하기
현재 레지스트리 키의 권한은 Get-ACL cmdlet으로 확인할 수 있습니다(Get-ACL cmdlet은 파일과 폴더의 NTFS 권한 관리에도 사용됩니다).
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
$rights.Access.IdentityReference
다음 예제에서는 이 레지스트리 키의 ACL을 수정하여 기본 제공 Users 그룹에 쓰기 권한을 부여해 보겠습니다.
먼저 현재 권한을 가져옵니다.
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
권한을 부여할 사용자 또는 그룹을 지정합니다.
$idRef = [System.Security.Principal.NTAccount]"BuiltIn\Users"
권한 수준을 선택합니다.
$regRights = [System.Security.AccessControl.RegistryRights]::WriteKey
권한 상속 설정을 지정합니다.
$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None
액세스 유형(허용/거부)을 설정합니다.
$acType = [System.Security.AccessControl.AccessControlType]::Allow
액세스 규칙을 생성합니다.
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType)
새 규칙을 현재 ACL에 추가합니다.
$rights.AddAccessRule($rule)
새 권한을 레지스트리 키에 적용합니다.
$rights | Set-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
마지막으로 레지스트리 키의 ACL에 새 그룹이 추가되었는지 확인합니다.
원격 컴퓨터의 레지스트리 값 가져오기
PowerShell은 원격 컴퓨터의 레지스트리에도 접근할 수 있습니다. WinRM(Invoke-Command 또는 Enter-PSSession)을 통해 원격 컴퓨터에 연결할 수 있습니다. 원격 컴퓨터에서 레지스트리 값을 가져오는 예시는 다음과 같습니다.
Invoke-Command –ComputerName srv-fs1 –ScriptBlock {Get-ItemProperty -Path 'HKLM:\System\Setup' -Name WorkingDirectory}
또는 원격 레지스트리 연결(RemoteRegistry 서비스가 활성화되어 있어야 함)을 사용할 수도 있습니다.
$Server = "lon-fs1"
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
$RegKey= $Reg.OpenSubKey("System\Setup")
$RegValue = $RegKey.GetValue("WorkingDirectory")
팁: 도메인에 가입된 여러 컴퓨터에 동일한 레지스트리 값을 생성하거나 수정해야 한다면 GPO(그룹 정책) 기능을 활용하는 것이 더 효율적입니다.
지금까지 PowerShell을 사용하여 Windows 레지스트리 항목에 접근하고 관리하는 대표적인 예제들을 살펴보았습니다. 이 내용들은 자동화 스크립트 작성 시 그대로 활용할 수 있습니다.