|
||||||||||||||||||
Рецепты WMI: работа с реестром Windows
Время создания: 30.12.2017 21:19
Текстовые метки: реестр,Windows
Раздел: Script
Запись: xintrea/mytetra_db_adgaver_new/master/base/151465789078fjrqbq3f/text.html на raw.githubusercontent.com
|
||||||||||||||||||
|
||||||||||||||||||
Рецепты WMI: работа с реестром Windows Примеры кода в статье приводятся на языке VBScript для административных сценариев Windows. Класс StdRegProv Класс StdRegProv служит для работы с системным реестром Windows и располагается в пространстве имён \\root\default. При вызове различных методов класса в качестве одного из параметров часто требуется указывать шестнадцатеричное значение, определяющее корневой раздел реестра, на который должен действовать вызываемый метод. Значения, соответствующие корневым разделам реестра, удобно объявить в качестве констант в начале скрипта: const HKEY_CLASSES_ROOT = &H80000000 const HKEY_CURRENT_USER = &H80000001 const HKEY_LOCAL_MACHINE = &H80000002 const HKEY_USERS = &H80000003 const HKEY_CURRENT_CONFIG = &H80000005 const HKEY_DYN_DATA = &H80000006 'только для Windows 95 и Windows 98 Также соответствующими шестнадцатеричными значениями обозначаются права доступа на разделы или параметры реестра: const KEY_QUERY_VALUE = &H1 'запрос значения const KEY_SET_VALUE = &H2 'создание, удаление и установка значения const KEY_CREATE_SUB_KEY = &H4 'создание подразделов const KEY_ENUMERATE_SUB_KEYS = &H8 'перебор подразделов const KEY_NOTIFY = &H10 'запрос уведомлений об изменении раздела и его подразделов const KEY_CREATE_LINK = &H20 'создание связи const DELETE = &H10000 'удаление раздела const READ_CONTROL = &H20000 'комбинация STANDARD_RIGHTS_READ, KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS и KEY_NOTIFY const WRITE_DAC = &H40000 'изменение DAC дескриптора безопасности const WRITE_OWNER = &H80000 'изменение владельца дескриптора безопасности Соответствующими целыми значениями обозначаются типы данных параметров реестра: const REG_SZ = 1 const REG_EXPAND_SZ = 2 const REG_BINARY = 3 const REG_DWORD = 4 const REG_MULTI_SZ = 7 Методы класса:
Примеры скриптов Создание разделов и параметров: On Error Resume Next const HKEY_CURRENT_USER = &H80000001 'подключение к WMI Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If 'Создание разделов intRes = objReg.CreateKey(HKEY_CURRENT_USER, "MyKey\MySubKey") If intRes <> 0 Then WScript.Echo intRes & ": не удалось создать разделы реестра" WScript.Quit End If 'Создание параметров intRes = objReg.SetStringValue(HKEY_CURRENT_USER, "MyKey\MySubKey", "MyParam", "MyValue") If intRes <> 0 Then WScript.Echo intRes & ": не удалось установить параметр ""HKEY_CURRENT_USER\MyKey\MySubKey\MyParam""" WScript.Quit End If intRes = objReg.SetStringValue(HKEY_CURRENT_USER, "MyKey", "", "MyDefaultValue") If intRes <> 0 Then WScript.Echo intRes & ": не удалось установить параметр ""HKEY_CURRENT_USER\MyKey\(По умолчанию)""" WScript.Quit End If 'Вывод сообщений WScript.Echo "Созданы параметры:" WScript.Echo "HKEY_CURRENT_USER\MyKey\MySubKey\MyParam (значение ""MyValue"")" WScript.Echo "HKEY_CURRENT_USER\MyKey\(По умолчанию) (значение ""MyDefaultValue"")" Проверка разрешений: On Error Resume Next const HKEY_CURRENT_USER = &H80000001 const KEY_CREATE_SUB_KEY = &H4 'подключение к WMI Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If 'проверка прав на создание подразделов intRes = objReg.CheckAccess(HKEY_CURRENT_USER, "MyKey\MySubKey", KEY_CREATE_SUB_KEY, bGranted) If intRes <> 0 Then WScript.Echo intRes & ": не удалась проверка прав на создание подразделов ""HKEY_CURRENT_USER\MyKey\MySubKey""" WScript.Quit End If 'вывод сообщений If bGranted Then WScript.Echo "Право на создание подразделов в ""HKEY_CURRENT_USER\MyKey\MySubKey"" есть." Else WScript.Echo "Права на создание подразделов в ""HKEY_CURRENT_USER\MyKey\MySubKey"" нет." End If Удаление разделов: On Error Resume Next const HKEY_CURRENT_USER = &H80000001 'подключение к WMI Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If 'удаление разделов intRes = objReg.DeleteKey(HKEY_CURRENT_USER, "MyKey\MySubKey") If intRes <> 0 Then WScript.Echo intRes & ": не удалась удалить раздел ""HKEY_CURRENT_USER\MyKey\MySubKey""" WScript.Quit End If intRes = objReg.DeleteKey(HKEY_CURRENT_USER, "MyKey") If intRes <> 0 Then WScript.Echo intRes & ": не удалась удалить раздел ""HKEY_CURRENT_USER\MyKey""" WScript.Quit End If 'вывод сообщений WScript.Echo "Раздел ""HKEY_CURRENT_USER\MyKey"" удалён." Рекурсивный обход раздела и чтение значений: On Error Resume Next const HKEY_CURRENT_USER = &H80000001 'подключение к WMI Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If 'рекурсивный обход ветви реестра ReadKey "Software\ODBC" '************************************************************************************************** Function ReadKey(strKey) 'Чтение параметров раздела intRes = objReg.EnumValues(HKEY_CURRENT_USER, strKey, sNames, Types) If intRes <> 0 Then WScript.Echo intRes & ": не удалась прочитать раздел ""HKEY_CURRENT_USER\" & strKey & """" WScript.Quit End If If IsArray(sNames) Then i = 0 For Each Param In sNames If Types(i) = 1 Then intRes = objReg.GetStringValue(HKEY_CURRENT_USER, strKey, Param, Val) Elseif Types(i) = 2 Then intRes = objReg.GetExpandedStringValue(HKEY_CURRENT_USER, strKey, Param, Val) Elseif Types(i) = 3 Then intRes = objReg.GetBinaryValue(HKEY_CURRENT_USER, strKey, Param, Val) Elseif Types(i) = 4 Then intRes = objReg.GetDWORDValue(HKEY_CURRENT_USER, strKey, Param, Val) Elseif Types(i) = 7 Then intRes = objReg.GetMultiStringValue(HKEY_CURRENT_USER, strKey, Param, Val) End If If intRes <> 0 Then WScript.Echo intRes & ": не удалась прочитать значение параметра ""HKEY_CURRENT_USER\" & _ strKey & "\" & Param & """" WScript.Quit End If If Types(i) = 3 Then For j = 0 To UBound(Val) Val(j) = Right("00" & Hex(Val(j)), 2) Next Val = Join(Val) Elseif Types(i) = 7 Then Val = vbCrLf & Join(Val, vbCrLf) End If WScript.Echo "HKEY_CURRENT_USER\" & strKey & "\, параметр """ & Param & """ = " & Val i = i + 1 Next End If 'Обход подразделов intRes = objReg.EnumKey(HKEY_CURRENT_USER, strKey, sNames) If intRes <> 0 Then WScript.Echo intRes & ": не удалась прочитать подразделы ""HKEY_CURRENT_USER\" & strKey & """" WScript.Quit End If If IsArray(sNames) Then For Each strSubKey In sNames ReadKey strKey & "\" & strSubKey Next End If End Function Пример чтения заданного подраздела в HKEY_CURRENT_USER другого пользователя на удалённом компьютере: On Error Resume Next const HKEY_USERS = &H80000003 UserName = "SuperUser" 'имя пользователя Windows, HKEY_CURRENT_USER которого надо прочитать на другой машине CompName = "SuperComputer" 'имя компьютера, на котором надо читать реестр Key = "Software\1C\1Cv7\7.7\Titles" 'подраздел в HKEY_CURRENT_USER, который надо прочитать 'получение SID пользователя Set objWMIService = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\.\root\cimv2") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If Set colItems = objWMIService.ExecQuery("Select * from Win32_UserAccount WHERE Name = """ & UserName & """") For Each objItem in colItems strSID = Trim(objItem.SID) Exit For Next 'собственно чтение реестра Set oReg = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\" & CompName & "\root\default:StdRegProv") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If strKeyPath = strSID & "\" & Key intRes = oReg.EnumValues(HKEY_USERS, strKeyPath, arrValues) If intRes <> 0 Then WScript.Echo intRes & ": не удалась прочитать раздел ""HKEY_USERS\" & strKeyPath & """" WScript.Quit End If For i = LBound(arrValues) To UBound(arrValues) intRes = oReg.GetStringValue(HKEY_USERS, strKeyPath, arrValues(i), Val) If intRes <> 0 Then WScript.Echo intRes & ": не удалась прочитать значение параметра ""HKEY_USERS\" & _ strKeyPath & "\" & arrValues(i) & """" WScript.Quit End If WScript.Echo Val Next Людоговский Александр Перейти на главную страничку сайта (список статей, файлы для скачивания) © 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов. |
||||||||||||||||||
Так же в этом разделе:
|
||||||||||||||||||
|
||||||||||||||||||
|