1 (изменено: ankar84, 2013-10-24 17:16:06)

Тема: VBScript: Сбор всех настроек Internet Explorer из реестра

Задача в следующем:
1. Необходимо получить все пользовательские настройки Internet Explorer
2. Создать сводную таблицу по всем пользователям и всем настройкам (например, столбцы это настройки - параметры реестра, а строки логины пользователей)

Первую часть начали решать в лоб. То есть заносим в файл с разделителем "|" (так как такой не встречается ни в каких параметрах настроек IE) все ветки реестра с параметрами, отвечающие за настройки IE. Затем открываем в Excel c разделителем | и получаем вроде бы то что нам нужно.


strComputer = "." ' Скорее всего для этой задачи не понадобится

Set objNet = WScript.CreateObject("WScript.NetWork") 'Объект для получения имени пользователя
Set WshShell = WScript.CreateObject("WScript.Shell") '
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Объект для файловой системы (нужен для результирующего файла)
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") ' Подключение к реестру

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 REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7

ResultPath = "d:\"
ResultFileName = objNet.UserName & ".txt"
Const Internet_Settings = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"

Function ReadKey(strKey)
    'Чтение параметров раздела
    intRes = objReg.EnumValues(HKEY_CURRENT_USER, strKey, sNames, Types)
    If intRes <> 0 Then
        ScriptError = True
    End If
    If IsArray(sNames) Then
        i = 0
        For Each Param In sNames
            If Types(i) = REG_SZ Then
                intRes = objReg.GetStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            Elseif Types(i) = REG_EXPAND_SZ Then
                intRes = objReg.GetExpandedStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            Elseif Types(i) = REG_BINARY Then
                intRes = objReg.GetBinaryValue(HKEY_CURRENT_USER, strKey, Param, Val)
            Elseif Types(i) = REG_DWORD Then
                intRes = objReg.GetDWORDValue(HKEY_CURRENT_USER, strKey, Param, Val)
                Val = Right("00000000" & LCase(Hex(Val)), 8)
            Elseif Types(i) = REG_MULTI_SZ Then
                intRes = objReg.GetMultiStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            End If
            If intRes <> 0 Then
                ScriptError = True
            End If
            ' Дополнительные преобразования бинарного и многострочного типов
            If Types(i) = REG_BINARY Then
                For j = 0 To UBound(Val)
                    Val(j) = Right("00" & Hex(Val(j)), 2)
                Next
                Val = Join(Val)
            Elseif Types(i) = REG_MULTI_SZ Then
                Val = vbCrLf & Join(Val, vbCrLf)
            End If
            'Вот сюда нужно добавить функцию записи полученного значения в файл в нужном нам формате
            objResult.WriteLine "HKEY_CURRENT_USER\" & strKey & "\" & Param & "|" & Val
            i = i + 1
        Next
    End If
    'Обход подразделов
    intRes = objReg.EnumKey(HKEY_CURRENT_USER, strKey, sNames)
    If intRes <> 0 Then
        ScriptError = True
    End If
    If IsArray(sNames) Then
        For Each strSubKey In sNames
            ReadKey strKey & "\" & strSubKey
        Next
    End If
End Function


on Error resume Next
Set objResult = objFSO.CreateTextFile(ResultPath & ResultFileName, True)
objResult.WriteLine "Parameter|Value"
ReadKey Internet_Settings

Set objNet = Nothing
Set objFSO = Nothing
WScript.Quit 0

Но данный метод скорее всего не подойдет по одной простой причине: параметров настроек IE у разных пользователей - разное. То есть в итоге с таким способом мы не сможем получить таблицу, у которой столбцы - это параметры. Так как у одного пользователя есть в реестре тот или иной параметр, а у другого его нет. Значит значения этих параметров у этих пользователей в сводной таблице будут сдвинуты.
Прошу у знатаков помощи по данному вопросу:
1. Есть ли способ как-то привести полученные данные к унифицированному виду? То есть для всех пользователей одно количество столбцов?
2. Есть ли идеи как реализовать задачу другим способом?

2

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

Может стоит подумать о том, чтобы выгружать скриптом данные в одну некую базу данных с таблицами, в которых будут сохранятся отдельными полями и путь к ключу, и имя ключа, и его тип, и значение. Например, в Firebird / MS SQL/ MS Access. А задачу предоставления удобоваримого просмотра данных переложить на плечи некоего построителя отчетов, работающего с данной БД. Или по таблицам строить хранимыми процедурами некую сводную таблицу/вьюшку.

WBR. Roman

3

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

ankar84, в чём глобальный замысел? Посмотреть-сравнить визуально?

4

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

alexii пишет:

ankar84, в чём глобальный замысел? Посмотреть-сравнить визуально?

Да, если вкратце, то именно в этом.
в результате нужно получить весь спектр настроек ИЕ и понять насколько и в чем они отличаются у разных типов пользователей (тип в данном случае, это род занятий\деятельности пользователя) для создания единой унифицированной групповой политики настройки ИЕ.
То есть, если определенные настройки одинаковые для всех пользователей - принимать их за стандарт и вбивать в политику.
Если какая-то настройка у какого-то пользователя отличается, разбираться нужно ли ему это, и если нужна, выделение в отдельную политику либо на ОУшку или с фильтрацией по группе безопасности.

Rom5 пишет:

Может стоит подумать о том, чтобы выгружать скриптом данные в одну некую базу данных с таблицами, в которых будут сохранятся отдельными полями и путь к ключу, и имя ключа, и его тип, и значение.


Идея интересная, и возможно одна из немногих правильная в нашем случае.
Но по работе с БД при помощи VBS совсем нет опыта. Подскажите, где можно почитать по этому поводу. Или может быть  конкретный пример скриптика под какую-либо БД.

5

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

Как компромисс между таблицей и базой данных рискнул бы предложить XML. И формировать скриптом не трудно, и опрашивать (при желании) можно почти как БД, и визуализировать с помощью .hta.

6

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

Serge Yolkin пишет:

Как компромисс между таблицей и базой данных рискнул бы предложить XML. И формировать скриптом не трудно, и опрашивать (при желании) можно почти как БД, и визуализировать с помощью .hta.

Честно говоря, вывод в формате XML и был самой первой идеей для получения настроек.
Предполагаемый формат был примерно такой:

<HKEY_CURRENT_USER>
     <Software>
          <Microsoft>
               <Internet Explorer>
                    <Parameter Name>Parameter1</Parameter Name>
                    <Parameter Value>Value1</Parameter Value>
                    <Parameter Type>DWORD</Parameter Type>
               </Internet Explorer>
          </Microsoft>
     </Software>
</HKEY_CURRENT_USER>

Но я столкнулся со большими сложностями при парсинге ветки реестра. Есть я ее распарсил и заполнил массив.
Первый элемент массива это открывающийся тег <HKEY_CURRENT_USER>, последний элемент массива это закрыающийся тег </HKEY_CURRENT_USER> и так далее..
Но сложность оказалась в том, что в этот массив мне нужно было в середину вставить еще и параметры, количество которых заранее не известно. И поэтому эту идею пришлось перечеркнуть.

Но если у Вас есть предложение как сделать вывод в XML, я буду очень рад его рассмотреть.

Получать данные из XML собирался с помощью PowerShell.

Что такое

визуализировать с помощью .hta

не представляю, надеюсь немного объясните.
Спасибо!

7

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

Предполагаемый формат был примерно такой

Красиво, но парсить сложно. Я бы сделал примитивнее:

<root>
  <user id="[userName1]">
    <param
     key="HKCU/Software/Microsoft/Internet Explorer/Parameter1"
     type="DWORD"
     value="Value1" />
    <param
     key="HKCU/Software/Microsoft/Internet Explorer/Parameter2"
     type="DWORD"
     value="Value2" />
    ...
  </user>
  <user id="[userName2]">
    ...
  </user>
  ...
</root>

Одни и те же параметры имеют одно и то же значение атрибута key, сравниваем значения.

Про визуализацию: HTA (HTML+скрипты) предоставляет довольно простые инструменты для работы с XML, по крайней мере, сделать выборку тэгов по какому-либо признаку (название атрибута или его значение) скриптом и вывести это средствами HTML вполне можно.

8

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

ankar84 пишет:
Serge Yolkin пишет:

Как компромисс между таблицей и базой данных рискнул бы предложить XML...

...Но сложность оказалась в том, что в этот массив мне нужно было в середину вставить еще и параметры, количество которых заранее не известно...

При использовании Microsoft.XMLDOM и его методов createElement, appendСhild, setAttribute и т. д. данная задача решается достаточно тривиально. Использование XML + HTA я нахожу весьма привлекательным, но эту тему я знаю слишком поверхностно, хотелось бы увидеть решение от Serge Yolkin.

ankar84 пишет:

...Подскажите, где можно почитать по этому поводу. Или может быть  конкретный пример скриптика под какую-либо БД.

По работе с базами данных есть информация на этом сайте: http://www.script-coding.com/ADO.html, http://forum.script-coding.com/viewtopic.php?id=6837, про SQL неплохо написано здесь: http://www.sql.ru/docs/sql/u_sql/
Я себе представляю решение следующим образом. Для сбора информации в базу данных (в данном случае dump.mdb), расположенную на сетевом диске, на каждом из ПК пользователей запускается скрипт dump.vbs. Данные всех пользователей сваливаются в одну таблицу settings. После этого для формирования "сводной" таблицы pivotsettings в этой же базе данных запускается скрипт pivot.vbs. Значения ключей размещаются в отдельных для каждого пользователя полях.

Скрипт из 1 поста я особо не менял, просто добавил функционал работы с БД.
dump.vbs:

strComputer = "." ' Скорее всего для этой задачи не понадобится

Set objNet = WScript.CreateObject("WScript.NetWork") 'Объект для получения имени пользователя
Set WshShell = WScript.CreateObject("WScript.Shell") '
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Объект для файловой системы (нужен для результирующего файла)
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") ' Подключение к реестру

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 REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7

REM ResultPath = "d:\"
REM ResultFileName = objNet.UserName & ".txt"
Const Internet_Settings = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"

Function ReadKey(strKey)
    'Чтение параметров раздела
    intRes = objReg.EnumValues(HKEY_CURRENT_USER, strKey, sNames, Types)
    If intRes <> 0 Then
        ScriptError = True
    End If
    If IsArray(sNames) Then
        i = 0
        For Each Param In sNames
            If Types(i) = REG_SZ Then
                intRes = objReg.GetStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            Elseif Types(i) = REG_EXPAND_SZ Then
                intRes = objReg.GetExpandedStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            Elseif Types(i) = REG_BINARY Then
                intRes = objReg.GetBinaryValue(HKEY_CURRENT_USER, strKey, Param, Val)
            Elseif Types(i) = REG_DWORD Then
                intRes = objReg.GetDWORDValue(HKEY_CURRENT_USER, strKey, Param, Val)
                Val = Right("00000000" & LCase(Hex(Val)), 8)
            Elseif Types(i) = REG_MULTI_SZ Then
                intRes = objReg.GetMultiStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            End If
            If intRes <> 0 Then
                ScriptError = True
            End If
            ' Дополнительные преобразования бинарного и многострочного типов
            If Types(i) = REG_BINARY Then
                For j = 0 To UBound(Val)
                    Val(j) = Right("00" & Hex(Val(j)), 2)
                Next
                Val = Join(Val)
            Elseif Types(i) = REG_MULTI_SZ Then
                Val = vbCrLf & Join(Val, vbCrLf)
            End If
            'Вот сюда нужно добавить функцию записи полученного значения в файл в нужном нам формате
            REM objResult.WriteLine "HKEY_CURRENT_USER\" & strKey & "\" & Param & "|" & Val
            con.execute "INSERT INTO [settings] ([user], [key], [type], [value]) VALUES ('" & replace(username, "'", "''") & "', 'HKEY_CURRENT_USER\" & replace(strKey & "\" & Param, "'", "''") & "', " & Types(i) & ", '" & replace(Val, "'", "''") & "');"
            i = i + 1
        Next
    End If
    'Обход подразделов
    intRes = objReg.EnumKey(HKEY_CURRENT_USER, strKey, sNames)
    If intRes <> 0 Then
        ScriptError = True
    End If
    If IsArray(sNames) Then
        For Each strSubKey In sNames
            ReadKey strKey & "\" & strSubKey
        Next
    End If
End Function

' если скрипт запущен из %windir%\system32\ под win x64 - перезапуск из %windir%\syswow64\
with createobject("WScript.Shell")
    if replace(lcase(wscript.path), lcase(.expandenvironmentstrings("%windir%\")), "") = "system32" then
        cmdln = replace(lcase(wscript.fullname), "system32", "syswow64")
        if createobject("scripting.filesystemobject").fileexists(cmdln) then
            cmdln = cmdln & " """ & wscript.scriptfullname & """"
            for each arg in wscript.arguments
                cmdln = cmdln & " """ & arg & """"
            next
            .run cmdln
            wscript.quit
            end if
    end if
end with
' путь к БД
dbpath = "\\DELL\Transfer\dump.mdb"
' соединение / создание БД
set cat = createobject("adox.catalog")
constr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source='" & dbpath & "';Mode=ReadWrite|Share Deny None;"
if not objFSO.fileexists(dbpath) then
    cat.create constr
else
    cat.activeconnection = constr
end if
set con = cat.activeconnection
' проверка наличия таблицы
hastable = false
for each elt in cat.tables
    if elt.name = "settings" then
        hastable = true
        exit for
    end if
next
' запрос на создание таблицы
if not hastable then
    con.execute "CREATE TABLE [settings] ([user] LONGTEXT, [key] LONGTEXT, [type] SHORT, [value] LONGTEXT);"
end if
username = objNet.UserName

REM on Error resume Next
REM Set objResult = objFSO.CreateTextFile(ResultPath & ResultFileName, True)
REM objResult.WriteLine "Parameter|Value"
ReadKey Internet_Settings

Set objNet = Nothing
Set objFSO = Nothing
msgbox "completed"
con.close
set con = nothing
set cat = nothing
WScript.Quit 0

pivot.vbs:

' если скрипт запущен из %windir%\system32\ под win x64 - перезапуск из %windir%\syswow64\
with createobject("WScript.Shell")
    if replace(lcase(wscript.path), lcase(.expandenvironmentstrings("%windir%\")), "") = "system32" then
        cmdln = replace(lcase(wscript.fullname), "system32", "syswow64")
        if createobject("scripting.filesystemobject").fileexists(cmdln) then
            cmdln = cmdln & " """ & wscript.scriptfullname & """"
            for each arg in wscript.arguments
                cmdln = cmdln & " """ & arg & """"
            next
            .run cmdln
            wscript.quit
            end if
    end if
end with
' путь к БД
dbpath = "\\DELL\Transfer\dump.mdb"
' соединение
set cat = createobject("adox.catalog")
cat.activeconnection = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source='" & dbpath & "';Mode=ReadWrite|Share Deny None;"
set con = cat.activeconnection
' работа со сводной таблицей pivotsettings 
hastable = false
for each elt in cat.tables
    if elt.name = "pivotsettings" then
        hastable = true
        exit for
    end if
next
' если таблица есть - запрос на удаление таблицы
if hastable then
    con.execute "DROP TABLE [pivotsettings];"
end if
' создание таблицы c записями неповторяющихся ключей и типов
con.execute "CREATE TABLE [pivotsettings] ([key] LONGTEXT, [type] SHORT);"
con.execute "INSERT INTO [pivotsettings] ([key], [type]) SELECT DISTINCT [key], [type] FROM [settings];"
set rs = con.execute("SELECT DISTINCT [user] FROM [settings];")
' добавление полей для каждого из пользователей
rs.movefirst
do until rs.eof
    value = rs.fields("user").value
    con.execute "ALTER TABLE [pivotsettings] ADD [" & value & "] LONGTEXT;"
    rs.movenext
loop
' обновление значений ключей для каждого из пользователей
rs.movefirst
do until rs.eof
    value = rs.fields("user").value
    con.execute "UPDATE [pivotsettings], [settings] SET [pivotsettings].[" & value & "] = [settings].[value] WHERE [settings].[user] = '" & replace(value, "'", "''") & "' And [settings].[key] = [pivotsettings].[key] And [settings].[type] = [pivotsettings].[type];"
    rs.movenext
loop
set rs = nothing
con.close
set con = nothing
set cat = nothing
msgbox "completed"

Решение несколько "топорное" (Do Loop + SQL), с невысоким быстродействием (порядка 1000 записей для 3 пользователей у меня заливались в сводную таблицу около четверти минуты), но рабочее. Далее полученную таблицу pivotsettings можно допилить в соответствии с требованиями, или импортировать в Excel, упомянутый в 1 посте. Одним словом, тему визуализации я не затрагиваю.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

9

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

omegastripes пишет:

При использовании Microsoft.XMLDOM и его методов...

Ну, да, или MSXML2.DOMDocument, а уважаемый ankar84 чем создавал?

omegastripes пишет:

хотелось бы увидеть решение от Serge Yolkin

Увы, на решения сейчас катастрофически нет времени, но могу предложить рабочий пример-недоделку:

<job id="sfx"><comment>

!!!  Сохраните этот текст как файл с раширением .wsf и запустите  !!!

</comment><object id="a" progid="Shell.Application" />
<object id="f" progid="Scripting.FileSystemObject" />
<object id="s" progid="ADODB.Stream" />
<object id="x" progid="MSXML2.DOMDocument" />
<script type="text/jscript" language="JScript">
var c=getResource('b'),d=f.getBaseName(/filename="(.+)"/.exec(c)[1]),
r=x.createElement('root'),y=0,
z=f.getSpecialFolder(2)+'\\'+f.getBaseName(f.getTempName())+'.zip';
r.text=c.replace(/^\s*(.+\s+){4}/,''),r.dataType='bin.base64';
s.type=1,s.open(),s.write(r.nodeTypedValue),s.saveToFile(z),s.close();
if(f.fileExists(z)){while(f.folderExists(d+(y?' '+y:'')))y++;
f.createFolder(d+(y?' '+y:''));
for(var i=0;i<a.nameSpace(z).items().count;i++){
a.nameSpace(f.getAbsolutePathName(d+(y?' '+y:''))).copyHere(
a.nameSpace(z).items().item(i),0);}f.deleteFile(z);}
</script><resource id="b">

MIME-Version: 1.0
Content-Type: application/octet-stream; name="xA10.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="xA10.zip"

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

</resource></job>

Мои благодарности уважаемым Rumata и mozers, за помощь при создании.
В режиме Attrib можно что-то сравнивать и анализировать...

10 (изменено: mozers, 2013-10-30 21:39:10)

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

ИМХО сравнивать все таки удобнее в Excel. Вариант, конечно, тормознутый (это за счет того что данные сразу в Excel вставляются) но простой до безобразия.

On Error Resume Next

arrComputers = Array("PC1", "PC2", "PC3")

Set objNet = WScript.CreateObject("WScript.NetWork") 'Объект для получения имени пользователя
Set WshShell = WScript.CreateObject("WScript.Shell") '
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'Объект для файловой системы (нужен для результирующего файла)

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 REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7

Const Internet_Settings = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"

Set objXL = WScript.CreateObject("Excel.Application")
objXL.Visible = True
objXL.Workbooks.Add
objXL.ScreenUpdating = False

col = 2

For Each strComputer In arrComputers
    objXL.Cells(1, col).Value = strComputer
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") ' Подключение к реестру
    ReadKey Internet_Settings
    col = col + 1
Next
objXL.Cells.Columns.AutoFit
objXL.ActiveSheet.Sort.Apply
objXL.ScreenUpdating = True

Function ReadKey(strKey)
    'Чтение параметров раздела
    intRes = objReg.EnumValues(HKEY_CURRENT_USER, strKey, sNames, Types)
    If intRes <> 0 Then
        ScriptError = True
    End If
    If IsArray(sNames) Then
        i = 0
        For Each Param In sNames
            If Types(i) = REG_SZ Then
                intRes = objReg.GetStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            ElseIf Types(i) = REG_EXPAND_SZ Then
                intRes = objReg.GetExpandedStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            ElseIf Types(i) = REG_BINARY Then
                intRes = objReg.GetBinaryValue(HKEY_CURRENT_USER, strKey, Param, Val)
            ElseIf Types(i) = REG_DWORD Then
                intRes = objReg.GetDWORDValue(HKEY_CURRENT_USER, strKey, Param, Val)
                Val = Right("00000000" & LCase(Hex(Val)), 8)
            ElseIf Types(i) = REG_MULTI_SZ Then
                intRes = objReg.GetMultiStringValue(HKEY_CURRENT_USER, strKey, Param, Val)
            End If
            If intRes <> 0 Then
                ScriptError = True
            End If
            ' Дополнительные преобразования бинарного и многострочного типов
            If Types(i) = REG_BINARY Then
                For j = 0 To UBound(Val)
                    Val(j) = Right("00" & Hex(Val(j)), 2)
                Next
                Val = Join(Val)
            ElseIf Types(i) = REG_MULTI_SZ Then
                Val = vbCrLf & Join(Val, vbCrLf)
            End If
            '------------------------------------------------------------
            found = False
            For Row = 1 To objXL.ActiveSheet.UsedRange.Rows.Count
                If objXL.Cells(Row, 1).Value = "HKEY_CURRENT_USER\" & strKey & "\" & Param Then
                    With objXL.Cells(Row, col)
                    .NumberFormat = "@"
                    .Value = Val
                    End With
                    found = True
                End If
            Next
            If Not found Then
                objXL.Cells(Row, 1).Value = "HKEY_CURRENT_USER\" & strKey & "\" & Param
                    With objXL.Cells(Row, col)
                    .NumberFormat = "@"
                    .Value = Val
                    End With
            End If
            '------------------------------------------------------------
            i = i + 1
        Next
    End If
    'Обход подразделов
    intRes = objReg.EnumKey(HKEY_CURRENT_USER, strKey, sNames)
    If intRes <> 0 Then
        ScriptError = True
    End If
    If IsArray(sNames) Then
        For Each strSubKey In sNames
            ReadKey strKey & "\" & strSubKey
        Next
    End If
End Function

2Serge Yolkin
Прикольная "недоделка" получается

11

Re: VBScript: Сбор всех настроек Internet Explorer из реестра

Вариант, конечно, тормознутый (это за счет того что данные сразу в Excel вставляются)

Если предварительно сделать на время вывода .Visible = False — вроде должно быть пошустрее.