Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 Windows 레지스트리 완벽하게 관리하기: 키·값 조회, 생성, 수정, 삭제 방법

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 레지스트리 항목에 접근하고 관리하는 대표적인 예제들을 살펴보았습니다. 이 내용들은 자동화 스크립트 작성 시 그대로 활용할 수 있습니다.