다음을 통해 공유


WMI 작업: 레지스트리

레지스트리에 대한 WMI 작업은 레지스트리 키와 값을 만들고 수정합니다. 다른 예제는 https://www.microsoft.com/technet에서 TechNet ScriptCenter를 참조하세요.

이 항목에 표시된 스크립트 예제는 로컬 컴퓨터에서만 데이터를 가져옵니다. 스크립트를 사용하여 원격 컴퓨터에서 데이터를 가져오는 방법에 대한 자세한 내용은 원격 컴퓨터에서 WMI에 연결을 참조하세요.

다음 절차에서 스크립트를 실행하는 방법을 설명합니다.

스크립트를 실행하려면

  1. 코드를 복사하고 확장명이 .vbs인 파일(예: filename.vbs)에 저장합니다. 텍스트 편집기가 파일에 .txt 확장명을 추가하지 않는지 확인합니다.
  2. 명령 프롬프트 창을 열고 파일을 저장한 디렉터리로 이동합니다.
  3. 명령 프롬프트에 cscript filename.vbs를 입력합니다.
  4. 이벤트 로그에 액세스할 수 없는 경우 관리자 권한 명령 프롬프트에서 실행 중인지 확인합니다. 보안 이벤트 로그와 같은 일부 이벤트 로그는 UAC(사용자 액세스 제어)로 보호될 수 있습니다.

참고

기본적으로 cscript는 명령 프롬프트 창에 스크립트의 출력을 표시합니다. WMI 스크립트는 많은 양의 출력을 생성할 수 있으므로 출력을 파일로 리디렉션할 수 있습니다. 명령 프롬프트에서 cscript filename.vbs > outfile.txt를 입력하여 filename.vbs 스크립트의 출력을 outfile.txt로 리디렉션합니다.

다음 표에는 로컬 컴퓨터에서 다양한 형식의 데이터를 가져오는 데 사용할 수 있는 스크립트 예제가 나와 있습니다.

어떻게 할까요? WMI 클래스 또는 메서드
WMI를 사용하여 레지스트리 키 값을 읽을 수 있나요? root\default 네임스페이스에 있는 StdRegProv 클래스를 사용합니다. 시스템 레지스트리 공급자는 메서드 및 이벤트 공급자일 뿐이므로 이 클래스의 인스턴스를 가져올 수 없습니다. 그러나 EnumKey 또는 EnumValue와 같은 메서드를 통해 레지스트리 데이터를 가져올 수 있습니다. root\cimv2 네임스페이스에 있는 Win32_Registry는 레지스트리 전체에 대한 데이터(예: 규모)를 가져옵니다.
VB
const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Console"
strValueName = "HistoryBufferSize"
oReg.GetDWORDValue HKEY_CURRENT_USER,strKeyPath,strValueName,dwValue
WScript.Echo "Current History Buffer Size: " & dwValue
PowerShell
$HKEY_CURRENT_USER =2147483649
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key = "Console"
$Value = "HistoryBufferSize"
$results = $reg.GetDWORDValue($HKEY_CURRENT_USER, $Key, $value)
"Current History Buffer Size: {0}" -f $results.uValue
새 레지스트리 키를 만들 수 있나요?

root\default 네임스페이스에 있는 StdRegProv 클래스와 CreateKey 메서드를 사용합니다.

VB
              
              const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." Set objReg=GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 

strKeyPath = "SOFTWARE\NewKey" objReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath WScript.Echo "Created registry key HKEY_LOCAL_MACHINE\SOFTWARE\NewKey"

PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key     = "SOFTWARE\NewKey"
$results   = $reg.CreateKey($HKEY_LOCAL_MACHINE, $Key)
If ($results.Returnvalue -eq 0) {"Key created"} 
키 아래에 새 레지스트리 값을 만들 수 있나요?

root\default 네임스페이스에 있는 StdRegProv 클래스와 CreateKey 메서드를 사용합니다. 그런 다음 SetDWORDValue와 같이 값이 어떤 레지스트리 데이터 형식인지에 따라 Set 메서드 중 하나를 사용합니다. Set 메서드는 값이 아직 없는 경우 값을 만듭니다. 자세한 내용은 레지스트리 데이터 형식을 WMI 데이터 형식에 매핑을 참조하세요.

VB
Const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\NewKey"
strComputer = "."
Set objReg=GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strValueName = "Example_Expanded_String_Value"
strValue = "%PATHEXT%"
objReg.SetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
WScript.Echo "Example expanded_String_Value at " & "HKEY_LOCAL_MACHINE\SOFTWARE\NewKey"
PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$ValueName = "Example_Expanded_String_Value"
$Value     = "%PATHEXT%"
$Key       = "SOFTWARE\NewKey"
$results   = $reg.SetExpandedStringValue($HKEY_LOCAL_MACHINE, $Key, $ValueName, $Value)
If ($results.Returnvalue -eq 0) {"Value created"}
레지스트리를 읽는 스크립트를 작성하려고 할 때 Invalid Class 오류가 발생하지 않도록 할 수 있나요?

StdRegProv 클래스에 액세스할 때 root\default 네임스페이스를 사용합니다. StdRegProv는 cimv2 네임스페이스에 포함되지 않으므로 "root\cimv2:StdRegProv"에 연결하려고 하면 "Invalid Class" 오류가 발생합니다.

VB
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set oReg=GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 
strKeyPath = "Console"
strValueName = "HistoryBufferSize"
oReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, strValueName, dwValue
Wscript.Echo "Current History Buffer Size: " & dwValue
특정 레지스트리 키에 대한 보안을 확인할 수 있나요?

root\default 네임스페이스에 있는 StdRegProv 클래스와 CheckAccess 메서드를 사용합니다. 스크립트 또는 애플리케이션을 실행하는 현재 사용자의 액세스 권한만 확인할 수 있습니다. 지정된 다른 사용자의 액세스 권한은 확인할 수 없습니다.

이진 레지스트리 값을 읽고 쓸 수 있나요?

"Root\Default" 네임스페이스에 있는 StdRegProv 클래스와 GetBinaryValueSetBinaryValue 메서드를 사용합니다. RegEdt32 유틸리티에 일련의 바이트 16진수 값으로 표시되는 레지스트리 값은 REG_BINARY 데이터 형식입니다. 자세한 내용은 레지스트리 데이터 형식을 WMI 데이터 형식에 매핑을 참조하세요. 다음 VBScript 코드 예제에서는 이진 값을 사용하여 새 키를 만듭니다. 이진 값은 Hex에 지정된 iValues 바이트 배열에 제공됩니다.

VB
              
              const HKEY_LOCAL_MACHINE = &H80000002 strKeyPath = "SOFTWARE\NewKey" strComputer = "." iValues = Array(&H01,&Ha2,&H10) Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath strKeyPath = "SOFTWARE\NewKey" BinaryValueName = "Example Binary Value" 

oReg.SetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,BinaryValueName,iValues

다음 스크립트는 이진 값을 읽습니다.

VB
const HKEY_LOCAL_MACHINE = &H80000002 
strKeyPath = "SOFTWARE\NewKey"
strValueName = "Example Binary Value"
strComputer = "."
dim iValues(3)
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.GetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,iValues
For i = lBound(iValues) to uBound(iValues)
Wscript.Echo iValues(i)
Next
PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$ValueName = "Example Binary Value"
$Values     = @(0x54, 0x46, 0x4C)
$Key       = "SOFTWARE\NewKey"
$results   = $reg.GetBinaryValue($HKEY_LOCAL_MACHINE, $Key, $ValueName)
Foreach ($byte in $results.uvalue) {"{0}" -f $byte.tostring("x")}
여러 문자열을 포함하는 레지스트리 값을 읽고 쓸 수 있나요?

"root\default" 네임스페이스에 있는 StdRegProv 클래스와 GetMultiStringValueSetMultiStringValue 메서드를 사용합니다. RegEdt32 유틸리티에 공백으로 구분된 일련의 문자열로 표시되는 레지스트리 키는 REG_MULTI_SZ 데이터 형식입니다. 자세한 내용은 레지스트리 데이터 형식을 WMI 데이터 형식에 매핑을 참조하세요. 다음 VBScript 코드 예제에서는 새 키와 새 다중 문자열 값을 만듭니다.

VB
const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\NewKey"
MultValueName = "Example Multistring Value"
strComputer = "."
iValues = Array("string1", "string2")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath
oReg.SetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,MultValueName,iValues
PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key       = "SOFTWARE\NewKey"
$ValueName = "Example MultiString Value"
$Values     = @("Thomas", "Susan", "Rebecca")
$Key       = "SOFTWARE\NewKey"
$results   = $reg.SetMultiStringValue($HKEY_LOCAL_MACHINE, $Key, $ValueName, $Values)
If ($results.Returnvalue -eq 0) {"Value Set"} 

다음 스크립트는 다중 문자열 값을 읽습니다.

VB
const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\NewKey"
strComputer = "."
iValues = Array("string1", "string2")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
MultValueName = "Example Multistring Value"
oReg.GetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,MultValueName,iValues
For Each strValue In iValues
WScript.echo strValue
Next
PowerShell
# Define Constants
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key       = "SOFTWARE\NewKey"
$ValueName = "Example MultiString Value"
$results   = $reg.GetMultiStringValue($HKEY_LOCAL_MACHINE, $Key, $ValueName)
$results.svalue
레지스트리 키를 제거할 수 있나요?

root\default 네임스페이스에 있는 StdRegProv 클래스와 CreateKey 메서드를 사용합니다.

PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key     = "SOFTWARE\NewKey"
$results   = $reg.DeleteKey($HKEY_LOCAL_MACHINE, $Key)
If ($results.Returnvalue -eq 0) {"Key Removed"} 

스크립트 및 애플리케이션에 대한 WMI 작업

WMI C++ 애플리케이션 예제

TechNet ScriptCenter

시스템 레지스트리 수정

StdRegProv