Форум программистов, компьютерный форум, киберфорум
VBScript/JScript/WSH/WMI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/30: Рейтинг темы: голосов - 30, средняя оценка - 4.73
4 / 4 / 0
Регистрация: 20.04.2015
Сообщений: 12
VBS

Выбор определенных строк из реестра

20.04.2015, 10:32. Показов 6662. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите подправить скрипт.
Есть скрипт который групповыми политиками запускается на компьютерах пользователей, и собирает всю информацию об установленном ПО.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
' Скрипт по сбору информации об установленном ПО
' информация берется из ветки реестра
' HLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
' файлы пишуться на сетевой ресурс обзываясь по имени пользователя
' и имени компьютера : пользователь_компьютер
 
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Const ForWriting = 2
Const ForAppending = 2
Set WSN = WScript.CreateObject("WScript.Network")
Computer = WSN.ComputerName
User = WSN.UserName
 
' указываем что oReg будет лезть в реестр
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
 
' Указываем куда именно в реестре мы полезем
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
 
' указываем что мы еще и файлы создавать будем
Set objFSO = CreateObject("Scripting.FileSystemObject")
' и куда их ложить будем тоже, вместо sw_ можно указать сетевой путь
Set objTextFile = objFSO.OpenTextFile("\\192.168.1.3\WMI_script\" & User & "_" & Computer & ".txt", _
ForWriting, True)
 
' Перебор неких subkey в массиве arrSubKeys,
' на самом деле шаримся по подразделам Uninstall'a
For Each subkey In arrSubKeys
 
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & subkey
'Ищем в подразделах строковой параметр "DisplayName"
strValueName = "DisplayName"
'Выдираем из реестра его значение - strValue
oReg.GetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath, _
strValueName,StrValue
'Проверяем чему равно значение "DisplayName"
'если тупо пусто, то просто тупо присваиваем i=1
'а если не пусто пишем в файл значение strValue
If strValue <> Empty Then
objTextFile.Write strValue
objTextFile.Writeline
Else i=1
end if
 
Next
Появилась необходимость собирать не всю информацию, а только выборочно, например проверить присутствие на компьютерах Microsoft office, или продукты фирмы Adobe.
Подскажите можно-ли допилить скрипт, что-бы можно было указывать какое именно ПО искать ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.04.2015, 10:32
Ответы с готовыми решениями:

Выбор и вывод определенных строк
Всем привет! Вот мучаюсь уже долгое время, не где найти не могу информацию решил у вас спросить. И так. Вот пример: Есть таблица...

Выбор и вывод определённых строк на экран
Всем привет. Задание: После выбора направление обучения(napr.txt) открыть файл data.txt найти в нем заданное направление обучения и...

Выбор определенных строк и вывод каждой строки в отдельном блоке
Как организовать выбор строк из всей таблицы по ключевому слову и вывод каждой строки в виде разных блоков? понимаю что сложно и не...

35
4 / 4 / 0
Регистрация: 20.04.2015
Сообщений: 12
22.04.2015, 15:43  [ТС]
Студворк — интернет-сервис помощи студентам
ComSpec спасибо все получилось.
1
22.04.2015, 19:11

Не по теме:

Цитата Сообщение от ComSpec Посмотреть сообщение
buggydancer, точно, это никогда не подведёт :) .
ComSpec, Спасибо на добром слове, а мой старый Celeron-1GHz/512Mb/120Gb/winXP/sp2/ru/x32, видимо всё-таки придётся менять на новый, поскольку в "ping.exe /?" на XP такого параметра небыло, да и "семерку" на него не поставить :sorry:

0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
22.04.2015, 21:15
podarok87, в ОС XP/2003 утилита PING.EXE не имеет ключа 4.
Если таковых в вашей сети нет, то на этом вопрос можно закрыть. Если же есть, то покажите результат работы приведённого ниже сценария (на станции с ОС Win 7):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim objWMI, objCollection, objItem, strGUID, strIP, i
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")
For Each objItem In objCollection
    strGUID = strGUID & objItem.SettingID & vbNewLine
    For i = 0 To UBound(objItem.IPAddress)
        If objItem.IPAddress(i) <> "0.0.0.0" Then strIP = strIP & objItem.IPAddress(i) & vbNewLine
    Next
    strGUID = strGUID & strIP & "------" & vbNewLine
Next
Set objItem = Nothing: Set objCollection = Nothing: Set objWMI = Nothing
WScript.Echo strGUID
WScript.Quit 0
P.S. У меня нет "под руками" подходящей ОС, поэтому сам проверить не могу.
1
4 / 4 / 0
Регистрация: 20.04.2015
Сообщений: 12
23.04.2015, 09:31  [ТС]
Dmitrii К сожалению имеется и winXP и win 2003
вот вывод скрипта:

Code
1
2
3
4
{49413512-C808-4CF0-B841-3F4A201C44AF}
192.168.1.168
fe80::51cf:6c3e:33c1:d7c8
------
1
 Аватар для ComSpec
3464 / 2002 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
23.04.2015, 20:11
Похоже, что такую длинную командную строку ("матрёшка" из пяти (!) циклов) из VBS-скрипта ещё не запускали, и я являюсь первопроходимцем первопроходцем в этой области.



podarok87, пробуйте:


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim objWsNet, objWSH, objA, strComputer, strIP
 
Set objWsNet = CreateObject("WScript.Network")
strComputer = objWsNet.ComputerName
 
set objWSH = CreateObject("WScript.Shell")
set objA = objWSH.Exec("cmd /c ""for /f ""tokens=2 delims=[]"" %i in ('ping -n 1 " & strComputer & "^| findstr \[.*\]') do @for /f ""delims=:"" %j in ('ipconfig^| findstr/n %i') do @for /f %k in ('set/a %j+1') do @for /f ""tokens=3 delims=:"" %l in ('ipconfig^| findstr/n ""^""^| findstr ""^%k:""') do @for /f ""tokens=*"" %m in (""%l"") do @echo %m""")
 
strIP = objA.StdOut.ReadAll()
 
Set objWsNet = Nothing
Set objWSH = Nothing
Set objA = Nothing
 
WScript.Echo(strIP)

.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.04.2015, 20:27
ComSpec, не знаю, что ты всем этим делаешь, но у меня выдает маску подсети.

Добавлено через 57 секунд
Самый стандартный способ показал Dmitrii.
podarok87, Ваша переменная с IP это objItem.IPAddress(i) внутри цикла.
0
 Аватар для ComSpec
3464 / 2002 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
23.04.2015, 20:50
Dragokas, смотри:


C:\Users\Yury>ping -4 -n 1 home-pc

Pinging home-pc [192.168.133.1] with 32 bytes of data:
Reply from 192.168.133.1: bytes=32 time<1ms TTL=128

Ping statistics for 192.168.133.1:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

C:\Users\Yury>for /f "tokens=2 delims=[]" %i in ('ping -n 1 home-pc^| findstr \[
.*\]') do @for /f "delims=:" %j in ('ipconfig^| findstr/n %i') do @for /f %k in
('set/a %j+1') do @for /f "tokens=3 delims=:" %l in ('ipconfig^| findstr/n "^"^|
findstr "^%k:"') do @for /f "tokens=*" %m in ("%l") do @echo %m
192.168.133.1

C:\Users\Yury>

.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.04.2015, 21:25
А IPConfig для чего?
0
 Аватар для ComSpec
3464 / 2002 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
23.04.2015, 21:55
Dragokas, тут шла речь о том, что у "ping.exe" в Windows XP и Windows Server 2003 нет ключа "-4", и поэтому с помощью команды "PING" можно получить только IPv6-адрес. В выводе же команды "IPCONFIG" присутствует и IPv4-адрес, идущий вслед за строкой с IPv6-адресом. Вот с помощью моих пяти циклов и осуществляется "перевод" IPv6-адреса в IPv4-адрес.



Вот смотри:


C:\Users\Yury>ping -n 1 home-pc

Pinging home-pc [fe80::b9e7:fef0:a8e0:b987%23] with 32 bytes of data:
Reply from fe80::b9e7:fef0:a8e0:b987%23: time<1ms

Ping statistics for fe80::b9e7:fef0:a8e0:b987%23:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

C:\Users\Yury>ipconfig| findstr/n fe80::b9e7:fef0:a8e0:b987%23
43: Link-local IPv6 Address . . . . . : fe80::b9e7:fef0:a8e0:b987%23

C:\Users\Yury>ipconfig| findstr/n "^"| findstr "^4[34]:"
43: Link-local IPv6 Address . . . . . : fe80::b9e7:fef0:a8e0:b987%23
44: IPv4 Address. . . . . . . . . . . : 192.168.133.1

C:\Users\Yury>

.
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.04.2015, 23:14
Во. Теперь понятно. Ты берешь IPv6, полученный через ping и используешь его в качестве идентификатора того, какой из IPv6-адресов вывода IPConfig является основным адаптером, чтобы забрать рядом лежащий с ним IPv4 адрес.

Если будет интересно поразбираться, прикладываю ping.txt и ipconfig.txt,
из которых вытягивает маску подсети вместо IP.

Кстати, можно было написать полностью на CMD добавив 6-й цикл с парсингом команды hostname.
Вложения
Тип файла: zip 1.zip (1.1 Кб, 6 просмотров)
2
 Аватар для ComSpec
3464 / 2002 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
24.04.2015, 04:26
Dragokas, посмотрел твоё вложение и пришёл к выводу, что код надо "разветвить": если команда "PING" выдаёт IPv6-адрес, то выполнять действия для его "перевода" в IPv4-адрес, а ежели полученный результат является IPv4-адресом, то сразу его "эхать".



Для этого ввёл в код ещё один, проверочный, цикл (шестой!):


Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim objWsNet, objWSH, objA, strComputer, strIP
 
Set objWsNet = CreateObject("WScript.Network")
strComputer = objWsNet.ComputerName
 
set objWSH = CreateObject("WScript.Shell")
set objA = objWSH.Exec("cmd /c ""for /f ""tokens=2 delims=[]"" %i in ('ping -n 1 " & strComputer & "^| findstr \[.*\]') do @for /f ""delims=:"" %j in (""%i"") do @if %j neq %i (for /f ""delims=:"" %k in ('ipconfig^| findstr/n %i') do @for /f %l in ('set/a %k+1') do @for /f ""tokens=3 delims=:"" %m in ('ipconfig^| findstr/n ""^""^| findstr ""^%l:""') do @for /f ""tokens=*"" %n in (""%m"") do @echo %n) else (echo %i)""")
 
strIP = objA.StdOut.ReadAll()
 
Set objWsNet = Nothing
Set objWSH = Nothing
Set objA = Nothing
 
WScript.Echo(strIP)

.
1
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
24.04.2015, 06:43
Цитата Сообщение от podarok87 Посмотреть сообщение
... имеется и winXP и win 2003
Тогда должно подойти что-то такое:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")
For Each objItem In objCollection
    For i = 0 To UBound(objItem.IPAddress)
        If Len(objItem.IPAddress(i)) > 0 Then
            If objItem.IPAddress(i) <> "0.0.0.0" Then
                If InStr(objItem.IPAddress(i), ".") > 0 Then strIP = strIP & "_" & objItem.IPAddress(i)
            End If
        End If
    Next
Next
objTextFile = objFSO.OpenTextFile("c:\" & User & "_" & Computer & "_" & strIP & ".txt", 2, True)
P.S. Предполагается, что компьютер может иметь больше одной сетевой карты. А каждой карте может быть назначено более одного IP-адреса.
3
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.04.2015, 10:48
Цитата Сообщение от Dmitrii Посмотреть сообщение
А каждой карте может быть назначено более одного IP-адреса.
Не понимаю. Можете объяснить?
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
24.04.2015, 11:43
Вариант 1.
Ситуация автора темы: для сетевого интерфейса включены IP-протоколы обеих версий.

Вариант 2.
Свойства сетевого интерфейса - свойства сетевого протокола - кнопка "Дополнительно" - вкладка "Параметры IP" - фрейм "IP-адреса" - кнопка "Добавить".
2
24.04.2015, 14:50

Не по теме:

А я то (наивный) почему-то думал, что IPv6 это как МАК - 6 байт, а их аж 12 оказывается! (12*8=96 бит) - впервые живой IPv6 увидел! :-[

0
4 / 4 / 0
Регистрация: 20.04.2015
Сообщений: 12
24.04.2015, 15:58  [ТС]
Всем огромное спасибо, все получилось, как и планировалось.
Dmitrii Спасибо, последний вариант скрипта, то что нужно! выводит только IPv4
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2015, 15:58

Чистка определенных веток реестра
Ребят подскажите код для батника, необходимо очистить следующие ветки реестра: ...

Не выводится информация из определенных веток реестра
Доброго времени. Прошу помощи. Проблема заключается с выводом информации из реестра. С Hardware без проблем выводится информация, но вот с...

Экспорт каждого из определённых разделов реестра в отдельный файл
Можно ли средствами cmd экспортировать ключи из ветки &quot;HKEY_CURRENT_USER\Software&quot; при этом каждый подключ поместить в отдельный reg файл? ...

Добавить в код условие для выполнения определённых команд в зависимости от значения параметра реестра
Здравствуйте. Не могу составить условие правильно к REG QUERY &quot;HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion&quot; /v EditionID |...

Поиск нужных строк в HTML-файлах по заданному ключу и запись определённых слов из найденных строк в CSV-файл
Есть 100 файлов в папке BDVK с форматом .html Нужно сделать программу которая ищет в html файле по строкам - ключевым словам и сохраняет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru