Поделиться через


Задачи WMI: реестр

Задачи WMI для реестра создают и изменяют разделы и значения реестра. Другие примеры см. в центре сценариев TechNet по адресу https://www.microsoft.com/technet.

Примеры скриптов, показанные в этом разделе, получают данные только с локального компьютера. Дополнительные сведения о том, как использовать скрипт для получения данных с удаленных компьютеров, см. в статье Подключение к 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? Используйте класс StdRegProv , расположенный в корневом пространстве имен по умолчанию. Невозможно получить экземпляры этого класса, так как поставщик системного реестра является только методом и поставщиком событий. Однако данные реестра можно получить с помощью таких методов, как EnumKey или EnumValue. Win32_Registry, расположенный в пространстве имен root\cimv2, получает данные о реестре в целом, например о его размере.
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
... создать новый раздел реестра?

Используйте класс 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"} 
... создать новое значение реестра в разделе?

Используйте класс StdRegProv , расположенный в корневом пространстве имен по умолчанию, и метод CreateKey . Затем используйте один из методов Set в зависимости от типа данных реестра, например SetDWORDValue. Методы 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"}
... не возникает ошибка недопустимого класса при попытке написать скрипт для чтения реестра?

Используйте корневое пространство имен по умолчанию при доступе к классу StdRegProv . StdRegProv не является частью пространства имен cimv2, поэтому при попытке подключения к root\cimv2:StdRegProv возникает ошибка "Недопустимый класс".

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
... проверка безопасность в определенном разделе реестра?

Используйте класс StdRegProv , расположенный в корневом пространстве имен по умолчанию, и метод CheckAccess . Вы можете проверка права доступа только для текущего пользователя, выполняющего скрипт или приложение. Вы не можете проверка права доступа для другого указанного пользователя.

... чтение и запись двоичных значений реестра?

Используйте класс StdRegProv , расположенный в пространстве имен Root\Default, а также методы GetBinaryValue и SetBinaryValue . Значения реестра, отображаемые в служебной программе RegEdt32 в виде ряда шестнадцатеричных значений байтов, находятся в формате REG_BINARY данных. Дополнительные сведения см. в разделе Сопоставление типа данных реестра с типом данных WMI. В следующем примере кода VBScript создается новый ключ с двоичным значением. Двоичное значение предоставляется в массиве байтов iValues , указанном в шестнадцатеричном формате.

VB
              
              const HKEY_LOCAL_MACHINE = &H80000002 strKeyPath = "SOFTWARE\NewKey" strComputer = "." iValues = Array(&H01;&Ha2,&H10) Set oReg=GetObject("winmgmt"s:{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")}
... чтение и запись значений реестра, содержащих несколько строк?

Используйте класс StdRegProv , расположенный в корневом пространстве имен по умолчанию, а также методы GetMultiStringValue и SetMultiStringValue . Разделы реестра, которые отображаются в служебной программе RegEdt32 в виде ряда строк, разделенных пробелами, имеют формат данных REG_MULTI_SZ . Дополнительные сведения см. в разделе Сопоставление типа данных реестра с типом данных WMI. В следующем примере кода VBScript создается новый ключ и новое значение multistring.

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"} 

Следующий скрипт считывает значение multistring.

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
... удалить раздел реестра?

Используйте класс StdRegProv , расположенный в корневом пространстве имен по умолчанию и методах DeleteKey .

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

Изменение системного реестра

StdRegProv