Листинг 11.3. Энумерация параметров ветви реестра
set objFS = CreateObject("Scripting.FIleSystemObject")
'Для вывода списка содержащихся в ветви реестра параметров мы будем
'использовать файл. В нашем случае – файл enum_log.txt на диске d:\..
set objTextFile = objFS.CreateTextFile("d:\enum_log.txt", 8, True)
'подключаем объект
Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}!root/Default:StdRegProv")
'Переменная RootKey будет определять корневой раздел ветви, параметры
'которой мы будем перечислять. При этом корневые разделы идентифицируются
'в соответствии с правилами, определеннымивфайле Winreg.h. В файле
'определены следующие корневые разделы: HKEY_CLASSES_ROOT (0x80000000),
'HKEY_CURRENT_USER (0x80000001), HKEY_LOCAL_MACHINE (0x80000002),
'HKEY_USERS (0x80000003), HKEY_CURRENT_CONFIG (0x80000005), HKEY_DYN_DATA
'(0x80000006). В нашем случае будет использоваться корневой раздел
'HKEY_CURRENT_USER.
RootKey = &H80000001
Вызываем процедуру, которая и будет выполнять перечисление параметров. Для
'работы процедуры необходимы три параметра: ветвь реестра, параметры которой
'нужно перечислять (в нашем случае Control Panel\Desktop), объект,
'определяющий текстовый документ, в который будут записываться параметры
'ветви, а также корневой раздел указанной ранее ветви, записанный в нашем
'случае в параметре RootKey. После работы процедуры закрываем открытый
'текстовый файл.
call EnumV("Control Panel\Desktop", objTextFile, RootKey)
objTextFile.Close
Sub EnumV(Path, objTextFile, RootKey)
objTextFile.WriteLine ":::: Ветвь реестра: HKEY_CURRENT_USER\" & Path & vbCrLf
'Выполняем перечисление параметров, расположенных в ветви реестра
'HKEY_CURRENT_USER\Control Panel\Desktop. Для этого используется метод
'EnumValues, для работы которого необходимы следующие параметры:
'– Корневой раздел ветви (в нашем случае параметр RootKey)
'– Остальной путь к ветви реестра (в нашем случае параметр RootKey,
'указываемый при вызове процедуры).
' – Переменная, в которую будут помещаться содержащиеся в ветви реестра
'параметры. В нашем случае назовем эту переменную Names
' – Переменная, в которую будет помещаться идентификатор типа параметра.
'В нашем случае назовем ее Types.
obj.EnumValues RootKey, Path, Names, Types
'Проверяем, существуют ли в указанной ветви реестра параметры. Во-первых,
'проверяется равенство нулю переменной Names, содержащей названия
'параметров. А во-вторых, проверяем на равенство нулю переменную Types.
'Переменные нужно проверять именно на равенство нулю, так как ноль
'возвращается методом EnumValues в случае ошибки.
if not IsNull(Names) and not IsNull(Types) Then
'Выполняем цикл, количество итераций которого указывается границами
'переменной types (количеством элементов в переменной types, так как это
'массив). Иными словами, выполняем цикл столько раз, сколько переменных было
'найдено в указанной ветви реестра.
for i = lbound(types) to ubound(types)
'При этом мы будем выполнять запись в текстовый файл в зависимости
'от типа переменной, указанного в переменной types. Для этого будем
'использовать выражение select case из-за особенности метода EnumValues.
'Особенностью этого метода является способ указания типа найденной
'переменной. Для этого используется массив types (в нашем случае),
'в который помещаются идентификаторы типа переменной, определенные
'в файле Winreg.h. Возможны следующие идентификаторы:
'1 – определяет переменную строкового типа;
'2 – определяет переменную расширенного строкового типа;
'3 – определяет переменную REG_BINARY-типа;
'4 – определяетпеременную REG_DWORD-типа;
'7 – определяет переменную REG_MULTI_SZ-типа.
select case types(i)
'Проверяем тип параметра и в зависимости от этого типа используем
'разные методы для получения значения параметра. Все методы для
'получения значений параметров реестра также описаны в классе
'StdRegProv. Мы используем следующие методы.
'GetStringValue – получение значения строкового типа.
'GetExpandedStringValue – получение значения расширенного строкового типа.
'GetBinaryValue – получение значения параметра REG_BINARY-типа.
'GetDWordValue – получение значения параметра REG_DWORD-типа.
'GetMultiStringValue – получение значения параметра REG_MULTI_SZ-типа.
Читать дальше