<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript / WMI : Асинхронный мультипинг]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=3739</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=3739&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript / WMI : Асинхронный мультипинг».]]></description>
		<lastBuildDate>Wed, 26 Dec 2012 10:52:55 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=67890#p67890</link>
			<description><![CDATA[<p>Пока еще не вдавался в подробности, только в общих чертах ознакомился с обсуждением, без тестирования кода. Верно ли я понял, что в этой теме также обсуждается аналог broadcast ping - известного в юникс-мире способа узнать соседей в своей подсети, пингуя broadcast-адрес?<br /></p><div class="codebox"><pre><code>ping -b broadcast-addr</code></pre></div><p>В винде этот трюк не проходит - всегда откликается только первый адрес подсети (обычно маршрутизатор).</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Wed, 26 Dec 2012 10:52:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=67890#p67890</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65289#p65289</link>
			<description><![CDATA[<p>В скрипт сканирования сетки добавил еще один &quot;побочный эффект&quot;: при сканировании хоста, не являющегося компьютером, а например, сетевым принтером/МФУ, выполняется проверка http-доступа URL-а по адресу данного хоста. Это дает возможность увидеть название устройства (по тегу title с полученной страницы) и выполнить прямо из окна протокола переход на WEB-интерфейс управления устройством.</p><p>Т.е. можно увидеть доступные (с http-интрефейсом) в этой подсети принтера, по которым неизвестны/сменился ip-адрес, а имя хоста неизвестно.</p><p><a href="http://small-scripts.googlecode.com/files/scanNet_ver2012-10-31.zip">Архив со скриптом scanNet_ver2012-10-31.zip</a></p><p><span class="postimg"><img src="https://sites.google.com/site/scripttools/_/rsrc/1351695069276/home/scannet-vbs/scanNet_log_http-resources.png" alt="https://sites.google.com/site/scripttools/_/rsrc/1351695069276/home/scannet-vbs/scanNet_log_http-resources.png" /></span></p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Wed, 31 Oct 2012 15:46:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65289#p65289</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57044#p57044</link>
			<description><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>Не понял, почему сразу в HTA нельзя было собрать ?</p></blockquote></div><p>Желание реализовать в HTA у меня было сразу, но если честно, то мне, как все лишь продвинутому &quot;чайнику&quot; - трудно сходу использовать асинхронный подход в HTA <em>(уважаемые, буду рад такому примеру),</em> а предоставленный в ветке vbs-код был лаконичен, доходчиво описан автором, работоспособен, а когда еще на форуме разжевали и идею работы в vbs-скрипте с hta-окном, то я и не удержался сделать именно такую реализацию. <br />Может это кому-то пригодится.</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Sat, 18 Feb 2012 20:41:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57044#p57044</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57028#p57028</link>
			<description><![CDATA[<p><strong>Xameleon</strong>, изначально демонстрировалась сама <em>идея</em> возможности асинхронного подхода в чистом виде. Ну, а пинг — наиболее яркий пример практической демонстрации.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 18 Feb 2012 18:58:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57028#p57028</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57015#p57015</link>
			<description><![CDATA[<p>Сейчас глянул код. Не понял, почему сразу в HTA нельзя было собрать ? Экономия кода же очень существенная будет ? <img src="//forum.script-coding.com/img/smilies/neutral.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Sat, 18 Feb 2012 16:21:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57015#p57015</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57010#p57010</link>
			<description><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>О, чудо! big_smile Работа скрипта ощутимо ускорилась…</p></blockquote></div><p>Естественно.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 18 Feb 2012 15:25:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57010#p57010</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57005#p57005</link>
			<description><![CDATA[<p>Коллеги, так приятно !!!<br />Первый пост в данной теме я сделал 2009-10-13 15:04:39 !!! <br />А тема всё ещё жива и актуальна !!! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Очень приятно, что кому-то это пригодилось <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Евген)]]></author>
			<pubDate>Sat, 18 Feb 2012 14:05:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57005#p57005</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57000#p57000</link>
			<description><![CDATA[<p>Коллеги, в выводе скриптом результатов пинга в html-окно обнаружился неприятный глюк: при скане своей собственной подсети, т.е. при наличии большого количества быстроовечающих на асинхронные пинги хостов, уже имеющееся содержимое протокола может &quot;затереться&quot; - сообщение в окне может появиться и тут же исчезнуть из-за перезаписи кода страницы &quot;параллельно&quot; выполняемой функцией.</p><p>Вывод в окно на тот момент осуществлялся набором конструкций типа:<br /></p><div class="codebox"><pre><code>documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; strComputer &amp; &quot; Off&lt;br&gt;&quot;</code></pre></div><p>Были сделаны такие попытки &quot;лечения&quot; - все конструкции вывода замещены вызовом дополнительной функции, а в самой функции сначала пытался сделать паузу по наличию признака (по выставляемому значению глобальной переменной), но это приводило к непредсказуемым зацикливаниям ожидания вывода, потом решил поместить на страницу таблицу и функцией вывода инсертить в нее новые строки, в строки - ячейки и уже в добавленной ячейке менять содержимое - &quot;затерания&quot; прекратились, но вывод скриптом стал намного тормознутее, кстати, возможно через эту &quot;тормознутость&quot; данные и не терялись)</p><p>Сейчас сделал вывод специальным методом insertAdjacentHTML - добавления своего кода в существующий:<br /></p><div class="codebox"><pre><code>documentLog.all.divLog.insertAdjacentHTML &quot;beforeEnd&quot;, &quot;втавляемый HTML-код&quot;</code></pre></div><p>О, чудо! <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> Работа скрипта ощутимо ускорилась даже в сравнении с первоначальным вариантом. Испытания на предмет &quot;затерания&quot; данных не проводились еще - дома в сетке нет тридцати хостов)</p><p>Вот, новый код скрипта &quot;scanNet.vbs&quot;:</p><div class="codebox"><pre><code>&#039;----- scanNet.vbs -----------------------------------------------------------------------&#039;
&#039; Ассинхронный пинг указанного диапазона адресов подсети для &quot;срочного&quot; поиска айпи машины,
&#039; которая пока еще не корректно резолвится DNS-серверами.
&#039; Roman.Gerashchenko@otpbank.com.ua, rgv15@list.ru
&#039; по материалам форума http://forum.script-coding.com/viewtopic.php?id=4196&#039;
&#039; 18.02.2012&#039;
&#039;  !  изменение метода вывода в окно протокола для избежания &quot;затерания&quot; его содержимого&#039;
&#039; 27.01.2012 
&#039;  +  определение и установка адреса сети при обработке результатов nslookup
&#039;  +  при старте скана без установленого адреса сети, но с имеющимся именем машина - авт.запуск nslookup&#039;
&#039;  +  настройка прекращения скана на первой же доступной машине сети&#039;

Option Explicit


&#039;--- Значения по-умолчанию&#039;
Dim gsDefaultNet   : gsDefaultNet   = &quot;???.???.???&quot;
Dim gsDefaultIpEnd : gsDefaultIpEnd = &quot;255&quot;
Dim gsDefaultDNS   : gsDefaultDNS   = &quot;UAAAD01&quot; &#039;используется командой NSLOOKUP&#039;
Dim giMaxPingQuery : giMaxPingQuery = 6 &#039;кол-во в пачке &quot;одновременных&quot; ping-запросов&#039;
&#039;-----

Dim gsNamePC &#039;глобальная, т.к. будем с ней сравнивать при определении имени системы пропингованного хоста&#039;
gsNamePC = &quot;&quot;

Dim A : Set A=Wscript.Arguments
If A.Count&gt;=1 Then  &#039; имеется переданный параметр
	gsNamePC = A(0)
End IF

Dim Html, window, document, ExitDo
Dim ExitDoLog : ExitDoLog = True

Const wbemFlagReturnImmediately = &amp;h10
Const wbemFlagForwardOnly = &amp;h20

Dim lngQueueCurrLength
Dim giCurrIP &#039;текущий счетчик-адрес, глобален, т.к. будем менять для выхода из цикла&#039;
Dim giIpEnd &#039;нужно знать - для выхода из цикла&#039;
Dim documentLog &#039;глобально, т.к. с разных процедур будем писать в окно лога&#039;
Dim glStopping : glStopping = False &#039;признак необходимости прекращения скана по нахождению доступной машины&#039;
Dim glCancel   : glCancel = False &#039;признак прекращения цикла скана (условия поиска были достигнуты)&#039;
Dim giStatusAll : giStatusAll = 0 &#039;кол-во адресов для пинга&#039;
Dim giStatusPinged : giStatusPinged = 0 &#039;кол-во адресов, пинг на которые был отправлен&#039;
Dim giStatusPonged : giStatusPonged = 0 &#039;кол-во адресов, понг от которых был получен&#039;



&#039;Формируем тело формы
Html = &quot;&lt;HTML&gt;&quot; &amp; _
    &quot;&lt;HEAD&gt;&quot; &amp; _
    &quot;&lt;TITLE&gt;Настройка пинга подсети&lt;/TITLE&gt;&quot; &amp; _
    &quot;&lt;STYLE&gt;&quot; &amp; _
    &quot;*{font-family:Verdana;font-size:11;}&quot; &amp; _
    &quot;&lt;/STYLE&gt;&quot; &amp; _
    &quot;&lt;/HEAD&gt;&quot; &amp; _
    &quot;&lt;BODY scroll=no bgcolor=&#039;D4D0C8&#039; style=&#039;border:0;&#039;&gt;&quot; &amp; _
    &quot;&lt;TABLE style=&#039;width:100%;&#039;&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;&lt;b&gt;Имя искомой машины:&lt;/b&gt;&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tNamePC value=&#039;&quot;&amp;gsNamePC&amp;&quot;&#039; title=&#039;Интересуемое имя машины - для прерывания сканирования&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;&lt;b&gt;Подсеть:&lt;/b&gt;&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tIpSubnet value=&#039;&quot;&amp;gsDefaultNet&amp;&quot;&#039; title=&#039;Начальные 3 группы IP-адреса&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Начальный адрес *.*.*.___:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tIpStart value=&#039;1&#039; title=&#039;Адрес, с которого начинам сканирование&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Завершающий     *.*.*.___:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tIpEnd value=&#039;&quot;&amp;gsDefaultIpEnd&amp;&quot;&#039; title=&#039;Адрес, на котором заканчиваем сканирование&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Кол-во `одновременных` запросов:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tMaxPingQuery value=&#039;&quot;&amp;giMaxPingQuery&amp;&quot;&#039; title=&#039;Максимальное количество одновременно ожидаемых ping-ов&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Имя DNS-сервера:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tNameDNS value=&#039;&quot;&amp;gsDefaultDNS&amp;&quot;&#039; title=&#039;Сервер для nslookup&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Останов на первом доступном компьютере:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT type=checkbox id=cbStop title=&#039;Останов сканирования при нахождении не интересуемой машины, а первой доступной&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;&lt;BUTTON id=btNSLOOKUP style=&#039;width:100%;&#039; title=&#039;Выполнение NsLookup.exe к имени машины и указанным сервером&#039;&gt;NsLookup PC&lt;/BUTTON&gt;&lt;/TD&gt;&quot; &amp; _
    &quot;&lt;TD&gt;&lt;BUTTON id=btPING style=&#039;width:100%;&#039; title=&#039;Выполнение ping-а имени машины&#039;&gt;ping -t PC&lt;/BUTTON&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TD colspan=2&gt;&lt;BUTTON type=&#039;submit&#039; id=btOK style=&#039;width:100%;&#039; title=&#039;Запуск сканирования указанных адресов&#039;&gt;SCANNING&lt;/BUTTON&gt;&lt;/TD&gt;&lt;/TR&gt;&quot; &amp; _
    &quot;&lt;TD colspan=2 bgcolor=&#039;silver&#039;&gt;&lt;span id=&#039;spnInfo&#039;&gt;&lt;hr&gt;Пинг диапазона адресов подсети с определением имен ответивших машин и с остановкой цикла при нахождении указанной машины.&lt;/span&gt;&lt;/TD&gt;&lt;/TR&gt;&quot; &amp; _
    &quot;&lt;/TABLE&gt;&quot; &amp; _
    &quot;&lt;/BODY&gt;&quot; &amp; _
    &quot;&lt;/HTML&gt;&quot;

Set window = CreateWindow(Html,&quot;contextmenu=no border=dialog maximizebutton=no minimizebutton=no&quot;,,,410,360)

&#039;Проверяем, создалось ли окно
if window is Nothing Then
    msgbox &quot;Не удалось создать окно ! Запустите скрипт еще раз.&quot;,vbCritical
    WScript.Quit
End if

&#039;Получаем ссылку на документ в окне
set document = window.document

document.all.tNamePC.focus() &#039;для удобства изначально даем фокус полю ввода имени машины&#039;

&#039;Подключаем событие выгрузки формы
document.body.onunload = GetRef(&quot;window_onunload&quot;)

&#039;подключаем событие нажания на кнопку btNSLOOKUP к запуску теста хоста NsLookup
window.btNSLOOKUP.onclick = GetRef(&quot;startCmdNSLOOKUP&quot;)
Sub startCmdNSLOOKUP
    Dim sNamePC, sNameDNS, WshShell
    sNamePC = window.tNamePC.value
    sNameDNS = window.tNameDNS.value
    If Len(sNamePC)&gt;0 Then
        Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
        Dim objScriptExec, strResults, strOK
        Set objScriptExec = WshShell.Exec(&quot;%comspec% /c nslookup &quot; &amp; sNamePC &amp; &quot; &quot; &amp; sNameDNS)
				strOK = objScriptExec.StdOut.ReadAll
        strResults = strOK &amp; &quot;&lt;br&gt;&lt;font color=&#039;red&#039;&gt;&quot; &amp; objScriptExec.StdErr.ReadAll &amp; &quot;&lt;/font&gt;&quot;
        Set objScriptExec = Nothing
        Set WshShell = Nothing
				Dim iPos, sMsg, sAdrIP, sNetIP
				sNetIP = &quot;&quot;
				iPos = InStr(strOK, &quot;Name:&quot;)
				If iPos&gt;0 Then
					sMsg = Right(strOK, Len(strOK) - iPos - 4)
					&#039;выделяем из строки айпи&#039;
					sAdrIP = &quot;&quot;
					iPos = InStr(sMsg, &quot;Address:&quot;)
					If iPos&gt;0 Then
						sAdrIP = Right(sMsg, Len(sMsg) - iPos - 8)
						sAdrIP = Replace(sAdrIP,&quot; &quot;,&quot;&quot;)
						sAdrIP = Replace(sAdrIP,vbCrLf,&quot;&quot;)
						strResults = Replace( strResults, sAdrIP, &quot;&lt;b&gt;&quot; &amp; sAdrIP &amp; &quot;&lt;/b&gt;&quot;)
						&#039;выделяем из адреса машины адрес сети&#039;
						sNetIP = Left(sAdrIP, InStrRev(sAdrIP, &quot;.&quot;) - 1 )
					End If
				End IF
        window.document.all.spnInfo.innerHTML = strResults
				If Len(sNetIP)&gt;0 And sNetIP&lt;&gt;window.tIpSubnet.value Then
					If MsgBox (&quot;Из nslookup-адреса машины (&quot; &amp; sAdrIP &amp; &quot;) был выделен адрес сети: &quot; &amp; sNetIP &amp; vbCr &amp; vbCr &amp; _
						&quot;Устанавливаем его в качестве сканируемой сети ?&quot;, vbQuestion+vbOKCancel, &quot;Адрес сети&quot;)=vbOK Then
						window.tIpSubnet.value = sNetIP
					End IF
				End IF
    else
        window.alert(&quot;Не указано имя машины.&quot;)
    End IF
End Sub

&#039;подключаем событие нажания на кнопку btPING к запуску теста хоста бесконечныи пингом
window.btPING.onclick = GetRef(&quot;startCmdPing&quot;)
Sub startCmdPing
    Dim sNamePC, WshShell
    sNamePC = window.tNamePC.value
    If Len(sNamePC)&gt;0 Then
        Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
        WshShell.Run &quot;%comspec% /c ping -t &quot; &amp; sNamePC &amp; &quot; &amp;Echo.&amp;Pause&amp;Exit&quot;, 1
        Set WshShell = Nothing
    else
        window.alert(&quot;Не указано имя машины.&quot;)
    End IF
End Sub

&#039;подключаем событие нажания на кнопку btOK к нашей процедуре начала сканирования
window.btOK.onclick = GetRef(&quot;startScan&quot;)
Sub startScan
		glCancel = False
    Dim sIpSubnet, iIpStart
    gsNamePC  = UCase(Trim(window.tNamePC.value))
    sIpSubnet = Trim(window.tIpSubnet.value)
    iIpStart  = CInt(window.tIpStart.value)
    giIpEnd   = CInt(window.tIpEnd.value)
		giStatusAll = giIpEnd - iIpStart + 1
    giMaxPingQuery = CInt(window.tMaxPingQuery.value)
		glStopping = window.cbStop.checked
    If iIpStart &gt; giIpEnd Then
        window.alert(&quot;Некорректно указаны начало и конец диапазона&quot;)
        exit sub
    End IF
    If InStr(sIpSubnet,&quot;?&quot;)&gt;0 Then
        window.alert(&quot;Не указан адрес тестируемой сети&quot;)
				If Len(gsNamePC)&gt;0 Then &#039;т.к. машина указана, то запускаем NSLOOKUP для определения сети&#039;
					startCmdNSLOOKUP
					sIpSubnet = Trim(window.tIpSubnet.value)
					If InStr(sIpSubnet,&quot;?&quot;)&gt;0 Then exit sub &#039;сеть так и не указали&#039;
				else
					exit sub
				End IF
    End IF
    
		Dim gt_spnDetTimeStart : gt_spnDetTimeStart = Now()
				
    Dim HtmlLOG &#039;Окно протокола должно скроллиться&#039;
    HtmlLOG = &quot;&lt;HTML&gt;&quot; &amp; _
        &quot;&lt;HEAD&gt;&quot; &amp; _
        &quot;&lt;TITLE&gt;Протокол пинга подсети&lt;/TITLE&gt;&quot; &amp; _
        &quot;&lt;STYLE&gt;&quot; &amp; _
        &quot;*{font-family:Verdana;font-size:10;}&quot; &amp; _
        &quot;&lt;/STYLE&gt;&quot; &amp; _
        &quot;&lt;/HEAD&gt;&quot; &amp; _
        &quot;&lt;BODY scroll=yes style=&#039;border:0;&#039;&gt;&lt;div id=&#039;divLog&#039;&gt;&lt;/div&gt;&lt;hr&gt;&quot; &amp; _
				&quot;&lt;table id=&#039;tblLog&#039; width=&#039;100%&#039; cellpadding=&#039;0&#039; cellspacing=&#039;0&#039; border=&#039;0&#039;&gt;&lt;/table&gt;&quot; &amp; _
        &quot;&lt;div id=&#039;divStatus&#039; style=&#039;color:darkred;&#039;&gt;&lt;/div&gt;&quot; &amp; _
				&quot;&lt;BUTTON type=&#039;submit&#039; id=btClose style=&#039;width:100%;&#039; title=&#039;Close window&#039; onclick=&#039;window.close();&#039;&gt;Close Log&lt;/BUTTON&gt;&quot; &amp; _
        &quot;&lt;/BODY&gt;&quot; &amp; _
        &quot;&lt;/HTML&gt;&quot;
    Dim windowLog
    Set windowLog = CreateWindow(HtmlLog,&quot;showintaskbar=yes&quot;,,,460,680)
    &#039;Проверяем, создалось ли окно
    if windowLog is Nothing Then
        msgbox &quot;Не удалось создать окно !&quot;,vbCritical
        WScript.Quit
    End if
		
    &#039;Получаем ссылку на документ в окне
    set documentLog = windowLog.document
		
		ExitDoLog = False
		&#039;Подключаем событие выгрузки формы
		documentLog.body.onunload = GetRef(&quot;windowLog_onunload&quot;)
		
    Dim str : str = &quot;&quot;
    str = &quot;&lt;p align=center&gt;Scanning &quot; &amp; sIpSubnet &amp; &quot;.&quot; &amp; Cstr(iIpStart) &amp; &quot; ... &quot; &amp; Cstr(giIpEnd) &amp; &quot; / &quot; &amp; CStr(giMaxPingQuery)
		uf_addStrLog str &amp; &quot;&lt;/p&gt;&lt;hr&gt;&quot; 

    Dim objSWbemServicesEx
    Dim objSWbemSink
    Dim objSWbemNamedValueSet
    Dim lngQueueMaxLength

    &#039; Максимальная длина очереди (в данном примере — сколько машин будут пинговаться одновременно),
    &#039; выбирается произвольно
    lngQueueMaxLength  = giMaxPingQuery
    &#039; Текущая длина очереди
    lngQueueCurrLength = 0
    &#039;счетчик - начальный адрес&#039;
    giCurrIP = iIpStart

    &#039; Set objSWbemServicesEx = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\Root\CIMV2&quot;)
    Set objSWbemServicesEx = GetObject(&quot;winmgmts:\\127.0.0.1\root\CIMV2&quot;)
    Set objSWbemSink       = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;, &quot;Sink_&quot;)

    While ((giCurrIP &lt;= giIpEnd) Or (lngQueueCurrLength &gt; 0)) AND (glCancel=False)&#039; Пингуем пока не кончатся компы и очередь
        If ((giCurrIP &lt;= giIpEnd) And (lngQueueCurrLength &lt; lngQueueMaxLength)) AND (glCancel=False) Then
            &#039; Добавляем очередной комп в очередь для пинга
						
						&#039; Наращивание счетчиков и отображение статуса&#039;
						giStatusPinged = giStatusPinged + 1  
						documentLog.all.divStatus.innerHTML = CStr(giStatusPonged) &amp; &quot; / &quot; &amp; CStr(giStatusPinged) &amp; &quot; / &quot; &amp; CStr(giStatusAll)
            str = sIpSubnet &amp; &quot;.&quot; &amp; CStr(giCurrIP) &#039;формируем очередной ip-адрес&#039;
						uf_addStrLog &quot;&lt;b&gt;[&quot; &amp; CStr(giStatusPinged) &amp; &quot;] &quot; &amp; str &amp; &quot;&lt;/b&gt;&lt;br&gt;&quot;
        
            &#039; В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае
            &#039; сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит
            &#039; свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки)
            Set objSWbemNamedValueSet = WScript.CreateObject(&quot;WbemScripting.SWbemNamedValueSet&quot;)
            objSWbemNamedValueSet.Add &quot;HostName&quot;, str
        
            &#039; Все запросы будут обрабатываться в единственной процедуре обработки
            objSWbemServicesEx.ExecQueryAsync objSWbemSink, &quot;SELECT * FROM Win32_PingStatus WHERE ADDRESS = &#039;&quot; &amp; _
                str &amp; &quot;&#039;&quot;, , , , objSWbemNamedValueSet
        
            giCurrIP = giCurrIP + 1
            lngQueueCurrLength = lngQueueCurrLength + 1
        Else
            &#039; Ожидаем, пока не будут обработаны все асинхронные запросы
            WScript.Sleep 100
        End If
    Wend

    objSWbemSink.Cancel

    Set objSWbemSink       = Nothing
    Set objSWbemServicesEx = Nothing
    
		uf_addStrLog &quot;&lt;hr&gt;End Scan. Time: &quot; &amp; CStr(FormatNumber( (Now() - gt_spnDetTimeStart) * 100000, 4))
		
		window.close
End Sub

&#039;=============================================================================
&#039; From http://forum.script-coding.com/viewtopic.php?id=4196
&#039; Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
&#039; будет возвращаться единственный объект, однако, в большинстве случаев запросы
&#039; возвращают множество объектов)
Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
	Dim strComputer
	strComputer = objWbemAsyncContext.Item(&quot;HostName&quot;)
	giStatusPonged = giStatusPonged + 1
	documentLog.all.divStatus.innerHTML = CStr(giStatusPonged) &amp; &quot; / &quot; &amp; CStr(giStatusPinged) &amp; &quot; / &quot; &amp; CStr(giStatusAll)
	Dim lFinded : lFinded = False
    
	If Not IsNull(objWbemObject.StatusCode) Then
		If objWbemObject.StatusCode = 0 Then
			&#039;--- определяем имя машины и пользователя&#039;
			Dim sNamePC : sNamePC = &quot;&quot;
			Dim sUsrLogin : sUsrLogin = &quot;&quot;
			Dim sTmp : sTmp = &quot;&quot;
			Dim objWMIService : Dim colItems : Dim objItem
			On Error Resume Next
			Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMV2&quot;)
			If Err.Number &lt;&gt; 0 Then
				sNamePC = &quot;&lt;strong&gt;&lt;i&gt;Error WMI&lt;/i&gt;&lt;/strong&gt;&quot;
			else
				Set colItems = objWMIService.ExecQuery (&quot;SELECT * FROM Win32_ComputerSystem&quot;, &quot;WQL&quot;, _
					wbemFlagReturnImmediately + wbemFlagForwardOnly)
				For Each objItem In colItems
					sNamePC = objItem.Caption
					If IsNull(sNamePC) OR Len(sNamePC)=0 Then &#039;возможно данный хост - не Win-System&#039;
						sNamePC = &quot;&lt;i&gt;no System name Or Access denied.&lt;/i&gt;&quot;
						uf_addStrLog &quot;&lt;font color=&#039;red&#039;&gt;&lt;b&gt;&quot; &amp; sNamePC &amp; &quot;&lt;/b&gt;&lt;/font&gt;&quot;
					Else
						If IsNull(objItem.UserName) Then 
							sUsrLogin=&quot;IsNull(UserName)&quot;
						else
							sUsrLogin = &quot;user:&quot; &amp; objItem.UserName
						End IF
						sUsrLogin = &quot;(&quot;&amp;sUsrLogin&amp;&quot;).&quot;
						If UCase(sNamePC)=gsNamePC Then &#039;--- поиск завершен!&#039;
							uf_addStrLog &quot;&lt;hr&gt;&lt;div style=&#039;background-color: white; color:green;&#039;&gt;&lt;b&gt;&quot; &amp; gsNamePC &amp; &quot; finded!&lt;/b&gt;&lt;/div&gt;&quot;
							lFinded = True
							glCancel = True
						End IF
						sNamePC = &quot;&lt;u&gt;&quot; &amp; sNamePC &amp; &quot;&lt;/u&gt; &quot; &amp; sUsrLogin
						If glStopping Then &#039;был признак остановки на ближайшей доступной машине&#039;
							uf_addStrLog &quot;&lt;font color=&#039;darkgreen&#039;&gt;&lt;b&gt;Accessible computer finded.&lt;/b&gt;&lt;/font&gt;&lt;hr&gt;&quot;
							glStopping = False
							glCancel = True
						End IF
					End IF
				Next
			End IF &#039;Err.Number &lt;&gt; 0&#039;
			On Error GoTo 0
			If lFinded Then &#039;завершение выделяющего блока&#039;
				uf_addStrLog &quot;&lt;div style=&#039;background-color: beige; color:darkred;&#039;&gt;&lt;u&gt;&quot; &amp; strComputer &amp; &quot;&lt;/u&gt; On -- &quot; &amp; sNamePC  &amp; &quot;&lt;/div&gt;&lt;hr&gt;&quot;
			else
				uf_addStrLog &quot;&lt;span style=&#039;background-color: white; color:Blue;&#039;&gt;&lt;u&gt;&quot; &amp; strComputer &amp; &quot;&lt;/u&gt; On -- &quot; &amp; sNamePC  &amp; &quot;&lt;/span&gt;&lt;br&gt;&quot;
			End IF
			Set colItems = Nothing
			Set objWMIService = Nothing
		Else
			uf_addStrLog strComputer &amp; &quot; Off&lt;br&gt;&quot;
		End If
	Else
		uf_addStrLog strComputer &amp; &quot; Not found.&lt;br&gt;&quot;
	End If
	
End Sub

&#039;=============================================================================
&#039; Процедура, вызываемая при завершении асинхронной обработки
Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext)
    objWbemAsyncContext.DeleteAll
    Set objWbemAsyncContext = Nothing
    
    &#039; Уменьшаем длину очереди
    lngQueueCurrLength = lngQueueCurrLength - 1
End Sub

&#039;=============================================================================
&#039;Событие закрытия формы
Sub window_onunload()
    ExitDo = True
End Sub

&#039;Запускаем цикл ожидания, чтобы скрипт не завершался, а ждал обработки событий
Do
    WScript.Sleep 100
Loop Until ExitDo

&#039;Событие закрытия формы
Sub windowLog_onunload()
    ExitDoLog = True
End Sub

Do
    WScript.Sleep 100
Loop Until ExitDoLog


&#039; MsgBox &quot;Выполнение скрипта завершено.&quot;,vbInformation

&#039;=============================================================================
&#039;from -- http://forum.script-coding.com/viewtopic.php?pid=34583#p34583&#039;
Function CreateWindow(content,features,x,y,width,height)
    On Error Resume Next
    Dim ShellWindows,ShellWindow,CodeForLinking,wshExec,form_id,id,i,document,window
    Set CreateWindow = Nothing
    Set ShellWindows = CreateObject(&quot;Shell.Application&quot;).Windows: Randomize: id = Clng(Rnd*100000)
    CodeForLinking = &quot;&lt;script&gt;moveTo(-1000,-1000);resizeTo(0,0);&lt;/script&gt;&quot; &amp;_
    &quot;&lt;hta:application &quot; &amp; features &amp; &quot; /&gt;&quot; &amp; _
    &quot;&lt;object id=&quot; &amp; id &amp; &quot; style=&#039;display:none&#039; classid=&#039;clsid:8856F961-340A-11D0-A96B-00C04FD705A2&#039; viewastext&gt;&lt;param name=RegisterAsBrowser value=1&gt;&lt;/object&gt;&quot;
    Set wshExec = CreateObject(&quot;WScript.Shell&quot;).Exec(&quot;mshta about:&quot;&quot;&quot; &amp; CodeForLinking &amp; &quot;&quot;&quot;&quot;)
    For i=1 to 2000
        For Each ShellWindow in ShellWindows: form_id = Clng(ShellWindow.id)
            if form_id = id Then
                Set document = ShellWindow.container:
                Set window = document.parentWindow
                document.open: window.execScript &quot;var Host&quot;: Set window.Host = me
                document.write content: document.close
                if x &lt;= 0 Then x = (window.screen.width - width) / 2
                if y &lt;= 0 Then y = (window.screen.height - height) / 2
                window.execScript &quot;document.onkeydown = function(){if(event.keyCode == 116){return false}};&quot; &amp;_
                &quot;setInterval(&#039;var e;try{Host.WScript}catch(e){close()}&#039;,100);moveTo(&quot; &amp; x &amp; &quot;,&quot; &amp; y &amp; &quot;);resizeTo(&quot; &amp; width &amp; &quot;,&quot; &amp; height &amp; &quot;)&quot;
                Set CreateWindow = window
                Exit Function
            End if
        Next
    Next
    wshExec.Terminate()
End Function

&#039;--- Вывод полученной строки в окно протокола -------------------------&#039;
Function uf_addStrLog( pStr )
	&#039;--- специальный метод вставки нового кода в существующий код элемента&#039;
	&#039;--beforeEnd - будет вставлен перед закрывающим тегом текущего элемента страницы (но после всего содержимого тега);&#039;
	documentLog.all.divLog.insertAdjacentHTML &quot;beforeEnd&quot;, pStr 
	&#039;фокус переносим на кнопку - для скроллинга&#039;
	documentLog.all.btClose.focus()
End Function</code></pre></div><p>Описание к скритпу все так же можно увидеть по ссылке -&nbsp; <a href="http://sites.google.com/site/scripttools/home/scannet-vbs">sites.google.com/site/scripttools/home/scannet-vbs</a></p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Sat, 18 Feb 2012 09:11:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57000#p57000</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=56090#p56090</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>OFF: </p><div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>К управлению серверами я отношения в нашей конторе не имею. Просто мне и коллегам моего отдела приходится принимать тот факт…</p></blockquote></div><p>Что тут скажешь?! Как обычно — «Это печально <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" />».</p></blockquote></div><p>Еще один &quot;печальный&quot; момент - не прохождение между сетями UDP-пакета для &quot;Wake-Up On Lan&quot; вынудило добавить в скрипт поиска wmi-пингом в сети интересующей машины еще и такой вариант поиска - скрипт останавливает запуск пингов после первой же &quot;удовлетворительно&quot; ответившей станции.</p><p>Т.е. в окне запуска появилась настройка останова на первом доступном ПК, еще из изменений - добавлено определение подсети машины по ответу nslookup (конечно, это имеет смысл только тогда, когда комп не был перемещен в другую сеть), изменен выход из цикла пингов при нахождении машины, изменения для наглядности окна &quot;лога&quot;.</p><p>Хочу еще кое-что дорисовать, но текущий вариант скрипта и описание к нему можно увидеть по ссылке - <a href="http://sites.google.com/site/scripttools/home/scannet-vbs">scannet-vbs</a></p><p>ps. А &quot;будить&quot; машины приходится так: ищу в базе SCCM мак-адрес выключеной машины, редактирую соответствующим образом батник запуска wolcmd.exe, ищу скриптом доступную машину - скрипт автоматом берет адрес ее подсети из ответа nslookup, забрасываю на машину батник и wolcmd, захожу на нее &quot;телнетным&quot; cmd.exe (стартую его через PsExec.exe) и запускаю батник, который после отправки пакета по мак-адресу запускает еще и бесконечный пинг ожидаемой станции.</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Sat, 28 Jan 2012 22:14:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=56090#p56090</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=53521#p53521</link>
			<description><![CDATA[<p>OFF: </p><div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>К управлению серверами я отношения в нашей конторе не имею. Просто мне и коллегам моего отдела приходится принимать тот факт…</p></blockquote></div><p>Что тут скажешь?! Как обычно — «Это печально <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" />».</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Tue, 15 Nov 2011 00:20:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=53521#p53521</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=53514#p53514</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>OFF: </p><div class="quotebox"><cite>mozers пишет:</cite><blockquote><p>Правда цель использования несколько странновата: &quot;DNS-сервера все еще по некоторым причинам резолвят ее имя в какой-то другой айпи&quot;. Если бы у меня такое приключилось, то я в первую очередь стал бы заниматься DNS сервером, а не писать скрипты, находящие машину в обход DNS.</p></blockquote></div><p>Именно! Я ранее промолчал, дабы не портить впечатление от самой идеи, но по сути замечание абсолютно верное — надо смотреть, что не так с сервером и с клиентскими машинами.</p></blockquote></div><p>К управлению серверами я отношения в нашей конторе не имею. Просто мне и коллегам моего отдела приходится принимать тот факт, что если машинку перевезли с другого подразделения, включили в сетку и требуют что-бы ее немедленно настроили под нового юзера, то увы перво-наперво с юзером приходится узнавать ее айпишник, т.к. реплики между серваками могут расходиться полчаса-час&nbsp; - у меня есть HTA по отслеживанию события включения/ребута машины (также хочу предоставить его на суд общественности, но надо реализовать еще кое-какие задумки, а времени как всегда...), то я той проге подсовывал машинку с таким некорректным резолвом и просил следить за ее ребутом - бывает, что аж через час программа сообщает о перезагрузке, т.к. по мнению программы время включения машины изменилось, а на самом деле - ДНС уже синхронизировались и программа получает данные уже от действительно интересуемой машины (а время ее включения наверняка отличается от любой другой машины).<br />Сорри за оффтоп.</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 14 Nov 2011 18:35:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=53514#p53514</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=53498#p53498</link>
			<description><![CDATA[<p>OFF: </p><div class="quotebox"><cite>mozers пишет:</cite><blockquote><p>Правда цель использования несколько странновата: &quot;DNS-сервера все еще по некоторым причинам резолвят ее имя в какой-то другой айпи&quot;. Если бы у меня такое приключилось, то я в первую очередь стал бы заниматься DNS сервером, а не писать скрипты, находящие машину в обход DNS.</p></blockquote></div><p>Именно! Я ранее промолчал, дабы не портить впечатление от самой идеи, но по сути замечание абсолютно верное — надо смотреть, что не так с сервером и с клиентскими машинами.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 14 Nov 2011 13:02:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=53498#p53498</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=53486#p53486</link>
			<description><![CDATA[<p>Сделано культурненько. Все работает как задумано.<br />Правда цель использования несколько странновата: &quot;DNS-сервера все еще по некоторым причинам резолвят ее имя в какой-то другой айпи&quot;. Если бы у меня такое приключилось, то я в первую очередь стал бы заниматься DNS сервером, а не писать скрипты, находящие машину в обход DNS.<br />Но тут мы обсуждаем не нетипичную ситуацию, а скрипт. А скрипт - отличный <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Mon, 14 Nov 2011 10:37:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=53486#p53486</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=53440#p53440</link>
			<description><![CDATA[<p>Коллеги, хочу предоставить на тестирование/использование еще одно прикладное применение Вашим наработкам: <br />&quot;мультипингу&quot; (<strong>Евген &amp; mozers</strong> - <a href="http://forum.script-coding.com/viewtopic.php?pid=29557#p29557">http://forum.script-coding.com/viewtopi … 557#p29557</a>) и работе с HTA из vbs&nbsp; (<strong>Xameleon</strong> - <a href="http://forum.script-coding.com/viewtopic.php?pid=45858#p45858">http://forum.script-coding.com/viewtopi … 858#p45858</a>).</p><p>Идея этого скрипта пинга появилась из-за появляющейся необходимости узнавать айпи-адрес работающей машины, имя которой мы точно знаем, подсеть в которой она находится - можем предположить, но подключиться к машине по имени не получается - DNS-сервера все еще по некоторым причинам резолвят ее имя в какой-то &quot;другой&quot; айпи (по которому отзывается уже совсем другая машина), а с помощью юзера выяснить айпи машины иногда проблематично.<br />Ранее я использовал медленный перебор всех адресов подсети батником, но сложив идею ассинхронного vbs-пинга с желанием дать пользователю минимальный интерфейс для ввода параметров и отображения результата, наконец-то реализовал это одним vbs-скриптом.</p><p>Что делает скрипт:<br />- создает начальное окошко, в котором нужно указать имя искомой машины и подсеть в виде xxx.yyy.zzz и диапазон пингуемых адресов;<br />- до старта собственно скана сети есть возможность из окошка запустить cmd-шные ping и nslookup;<br />- открывает еще одно hta-окно для вывода результатов пинга;<br />- цикл ассинхронных пинг-запросов по указанным адресам, если от машины отзыв положительный, то делается wmi-запрос определения ее имени (и залогиненного пользователя), если полученное имя совпадает с искомым, то запуск новых пингов прекращается;<br />- результаты отображаются в окне динамически по ходу цикла, по окончанию пингов для полного завершения работы скрипта - окно лога надо закрыть.</p><p>Скриншот стартового окна параметров (данный скан приведен просто для примера, данная машина резолвилась нормально - результат с nslookup совпадает):<br /><span class="postimg"><img src="http://s2.ipicture.ru/uploads/20111112/nKiYttlG.png" alt="http://s2.ipicture.ru/uploads/20111112/nKiYttlG.png" /></span></p><p>Скриншот окна лога по команде &quot;SCANNING&quot;:<br /><span class="postimg"><img src="http://s2.ipicture.ru/uploads/20111111/JF4Zb61K.png" alt="http://s2.ipicture.ru/uploads/20111111/JF4Zb61K.png" /></span></p><p>Сам vbs-скрипт<br /></p><div class="codebox"><pre><code>
&#039;----- scanNet.vbs -----------------------------------------------------------------------&#039;
&#039; Ассинхронный пинг указанного диапазона адресов подсети для &quot;срочного&quot; поиска айпи машины,
&#039; которая пока еще не корректно резолвится DNS-серверами.
&#039; Roman, rgv15@list.ru
&#039; по материалам форума:
&#039; работа с HTA - http://forum.script-coding.com/viewtopic.php?pid=45858#p45858&#039;
&#039; &quot;мультипинг  - http://forum.script-coding.com/viewtopic.php?pid=29557#p29557&#039;
&#039; ----- 11.11.2011 --- &#039;

Option Explicit


&#039;--- Значения по-умолчанию&#039;
Dim gsDefaultNet   : gsDefaultNet   = &quot;???.???.???&quot;
Dim gsDefaultIpEnd : gsDefaultIpEnd = &quot;255&quot;
Dim gsDefaultDNS   : gsDefaultDNS   = &quot;&quot;
Dim giMaxPingQuery : giMaxPingQuery = 3 &#039;кол-во в пачке &quot;одновременных&quot; ping-запросов&#039;
&#039;-----

Dim gsNamePC &#039;глобальная, т.к. будем с ней сравнивать при определении имени системы пропингованного хоста&#039;
gsNamePC = &quot;&quot;

Dim A : Set A=Wscript.Arguments
If A.Count&gt;=1 Then  &#039; имеется переданный параметр
	gsNamePC = A(0)
End IF

Dim Html, window, document, ExitDo
Dim ExitDoLog : ExitDoLog = True

Const wbemFlagReturnImmediately = &amp;h10
Const wbemFlagForwardOnly = &amp;h20

Dim lngQueueCurrLength
Dim giCurrIP &#039;текущий счетчик-адрес, глобален, т.к. будем менять для выхода из цикла&#039;
Dim giIpEnd &#039;нужно знать - для выхода из цикла&#039;
Dim documentLog &#039;глобально, т.к. с разных процедур будем писать в окно лога&#039;


&#039;Формируем тело формы
Html = &quot;&lt;HTML&gt;&quot; &amp; _
    &quot;&lt;HEAD&gt;&quot; &amp; _
    &quot;&lt;TITLE&gt;Настройка пинга подсети&lt;/TITLE&gt;&quot; &amp; _
    &quot;&lt;STYLE&gt;&quot; &amp; _
    &quot;*{font-family:Verdana;font-size:11;}&quot; &amp; _
    &quot;&lt;/STYLE&gt;&quot; &amp; _
    &quot;&lt;/HEAD&gt;&quot; &amp; _
    &quot;&lt;BODY scroll=no bgcolor=&#039;D4D0C8&#039; style=&#039;border:0;&#039;&gt;&quot; &amp; _
    &quot;&lt;TABLE style=&#039;width:100%;&#039;&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;&lt;b&gt;Имя искомой машины:&lt;/b&gt;&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tNamePC value=&#039;&quot;&amp;gsNamePC&amp;&quot;&#039; title=&#039;Интересуемое имя машины - для прерывания сканирования&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;&lt;b&gt;Подсеть:&lt;/b&gt;&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tIpSubnet value=&#039;&quot;&amp;gsDefaultNet&amp;&quot;&#039; title=&#039;Начальные 3 группы IP-адреса&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Начальный адрес *.*.*.___:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tIpStart value=&#039;1&#039; title=&#039;Адрес, с которого начинам сканирование&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Завершающий     *.*.*.___:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tIpEnd value=&#039;&quot;&amp;gsDefaultIpEnd&amp;&quot;&#039; title=&#039;Адрес, на котором заканчиваем сканирование&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Кол-во `одновременных` запросов:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tMaxPingQuery value=&#039;&quot;&amp;giMaxPingQuery&amp;&quot;&#039; title=&#039;Максимальное количество одновременно ожидаемых ping-ов&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;Имя DNS-сервера:&lt;/TD&gt;&lt;TD&gt;&lt;INPUT id=tNameDNS value=&#039;&quot;&amp;gsDefaultDNS&amp;&quot;&#039; title=&#039;Сервер для nslookup&#039;&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TR&gt;&lt;TD&gt;&lt;BUTTON id=btNSLOOKUP style=&#039;width:100%;&#039; title=&#039;Выполнение NsLookup.exe к имени машины и указанным сервером&#039;&gt;NsLookup PC&lt;/BUTTON&gt;&lt;/TD&gt;&quot; &amp; _
    &quot;&lt;TD&gt;&lt;BUTTON id=btPING style=&#039;width:100%;&#039; title=&#039;Выполнение ping-а имени машины&#039;&gt;ping -t PC&lt;/BUTTON&gt;&lt;/TD&gt;&lt;TR&gt;&quot; &amp; _
    &quot;&lt;TD colspan=2&gt;&lt;BUTTON type=&#039;submit&#039; id=btOK style=&#039;width:100%;&#039; title=&#039;Запуск сканирования указанных адресов&#039;&gt;SCANNING&lt;/BUTTON&gt;&lt;/TD&gt;&lt;/TR&gt;&quot; &amp; _
    &quot;&lt;TD colspan=2 bgcolor=&#039;silver&#039;&gt;&lt;span id=&#039;spnInfo&#039;&gt;&lt;hr&gt;Пинг диапазона адресов подсети с определением имен ответивших машин и с остановкой цикла при нахождении указанной машины.&lt;/span&gt;&lt;/TD&gt;&lt;/TR&gt;&quot; &amp; _
    &quot;&lt;/TABLE&gt;&quot; &amp; _
    &quot;&lt;/BODY&gt;&quot; &amp; _
    &quot;&lt;/HTML&gt;&quot;

Set window = CreateWindow(Html,&quot;contextmenu=no border=dialog maximizebutton=no minimizebutton=no&quot;,,,410,340)

&#039;Проверяем, создалось ли окно
if window is Nothing Then
    msgbox &quot;Не удалось создать окно !&quot;,vbCritical
    WScript.Quit
End if

&#039;Получаем ссылку на документ в окне
set document = window.document

document.all.tNamePC.focus() &#039;для удобства изначально даем фокус полю ввода имени машины&#039;

&#039;Подключаем событие выгрузки формы
document.body.onunload = GetRef(&quot;window_onunload&quot;)

&#039;подключаем событие нажания на кнопку btNSLOOKUP к запуску теста хоста NsLookup
window.btNSLOOKUP.onclick = GetRef(&quot;startCmdNSLOOKUP&quot;)
Sub startCmdNSLOOKUP
    Dim sNamePC, sNameDNS, WshShell
    sNamePC = window.tNamePC.value
    sNameDNS = window.tNameDNS.value
    If Len(sNamePC)&gt;0 Then
        Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
        Dim objScriptExec, strResults
        Set objScriptExec = WshShell.Exec(&quot;%comspec% /c nslookup &quot; &amp; sNamePC &amp; &quot; &quot; &amp; sNameDNS) 
        strResults = objScriptExec.StdOut.ReadAll &amp; &quot;&lt;br&gt;&lt;font color=&#039;red&#039;&gt;&quot; &amp; objScriptExec.StdErr.ReadAll &amp; &quot;&lt;/font&gt;&quot;
        Set objScriptExec = Nothing
        Set WshShell = Nothing
        window.document.all.spnInfo.innerHTML = strResults
    else
        window.alert(&quot;Не указано имя машины.&quot;)
    End IF
End Sub

&#039;подключаем событие нажания на кнопку btPING к запуску теста хоста бесконечныи пингом
window.btPING.onclick = GetRef(&quot;startCmdPing&quot;)
Sub startCmdPing
    Dim sNamePC, WshShell
    sNamePC = window.tNamePC.value
    If Len(sNamePC)&gt;0 Then
        Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
        WshShell.Run &quot;%comspec% /c ping -t &quot; &amp; sNamePC &amp; &quot; &amp;Echo.&amp;Pause&amp;Exit&quot;, 1
        Set WshShell = Nothing
    else
        window.alert(&quot;Не указано имя машины.&quot;)
    End IF
End Sub


&#039;подключаем событие нажания на кнопку btOK к нашей процедуре начала сканирования
window.btOK.onclick = GetRef(&quot;startScan&quot;)
Sub startScan
    Dim sIpSubnet, iIpStart
    gsNamePC  = UCase(Trim(window.tNamePC.value))
    sIpSubnet = Trim(window.tIpSubnet.value)
    iIpStart  = CInt(window.tIpStart.value)
    giIpEnd   = CInt(window.tIpEnd.value)
    giMaxPingQuery = CInt(window.tMaxPingQuery.value)
    If iIpStart &gt; giIpEnd Then
        window.alert(&quot;Некорректно указаны начало и конец диапазона&quot;)
        exit sub
    End IF
    If InStr(sIpSubnet,&quot;?&quot;)&gt;0 Then
        window.alert(&quot;Не указан адрес тестируемой сети&quot;)
        exit sub
    End IF
    
		Dim gt_spnDetTimeStart : gt_spnDetTimeStart = Now()

    Dim HtmlLOG &#039;Окно протокола должно скроллиться&#039;
    HtmlLOG = &quot;&lt;HTML&gt;&quot; &amp; _
        &quot;&lt;HEAD&gt;&quot; &amp; _
        &quot;&lt;TITLE&gt;Протокол пинга подсети&lt;/TITLE&gt;&quot; &amp; _
        &quot;&lt;STYLE&gt;&quot; &amp; _
        &quot;*{font-family:Verdana;font-size:10;}&quot; &amp; _
        &quot;&lt;/STYLE&gt;&quot; &amp; _
        &quot;&lt;/HEAD&gt;&quot; &amp; _
        &quot;&lt;BODY scroll=yes style=&#039;border:0;&#039;&gt;&lt;div id=&#039;divLog&#039;&gt;&lt;/div&gt;&lt;hr&gt;&quot; &amp; _
				&quot;&lt;BUTTON type=&#039;submit&#039; id=btClose style=&#039;width:100%;&#039; title=&#039;Close window&#039; onclick=&#039;window.close();&#039;&gt;Exit&lt;/BUTTON&gt;&quot; &amp; _
        &quot;&lt;/BODY&gt;&quot; &amp; _
        &quot;&lt;/HTML&gt;&quot;
    Dim windowLog
    Set windowLog = CreateWindow(HtmlLog,&quot;showintaskbar=yes&quot;,,,460,680)
    &#039;Проверяем, создалось ли окно
    if windowLog is Nothing Then
        msgbox &quot;Не удалось создать окно !&quot;,vbCritical
        WScript.Quit
    End if
		
    &#039;Получаем ссылку на документ в окне
    set documentLog = windowLog.document
		
		ExitDoLog = False
		&#039;Подключаем событие выгрузки формы
		documentLog.body.onunload = GetRef(&quot;windowLog_onunload&quot;)
		
    Dim str : str = &quot;&quot;
    str = &quot;&lt;p align=center&gt;Scanning &quot; &amp; sIpSubnet &amp; &quot;.&quot; &amp; Cstr(iIpStart) &amp; &quot; ... &quot; &amp; Cstr(giIpEnd) &amp; &quot; / &quot; &amp; CStr(giMaxPingQuery)
    If Len(gsNamePC)&gt;0 Then str = str &amp; &quot;  Find: &quot; &amp; gsNamePC
    documentLog.all.divLog.innerHTML = str &amp; &quot;&lt;/p&gt;&lt;hr&gt;&quot; 

    Dim objSWbemServicesEx
    Dim objSWbemSink
    Dim objSWbemNamedValueSet
    Dim lngQueueMaxLength

    &#039; Максимальная длина очереди (в данном примере — сколько машин будут пинговаться одновременно),
    &#039; выбирается произвольно
    lngQueueMaxLength  = giMaxPingQuery
    &#039; Текущая длина очереди
    lngQueueCurrLength = 0
    &#039;счетчик - начальный адрес&#039;
    giCurrIP = iIpStart

    &#039; Set objSWbemServicesEx = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\Root\CIMV2&quot;)
    Set objSWbemServicesEx = GetObject(&quot;winmgmts:\\127.0.0.1\root\CIMV2&quot;)
    Set objSWbemSink       = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;, &quot;Sink_&quot;)

    While (giCurrIP &lt;= giIpEnd) Or (lngQueueCurrLength &gt; 0) &#039; Пингуем пока не кончатся компы и очередь
        If (giCurrIP &lt;= giIpEnd) And (lngQueueCurrLength &lt; lngQueueMaxLength) Then
            &#039; Добавляем очередной комп в очередь для пинга
            str = sIpSubnet &amp; &quot;.&quot; &amp; CStr(giCurrIP) &#039;формируем очередной ip-адрес&#039;
            documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; _
                &quot;&lt;b&gt;[&quot; &amp; giCurrIP - iIpStart + 1 &amp; &quot;] &quot; &amp; str &amp; &quot;&lt;/b&gt;&lt;br&gt;&quot;
        
            &#039; В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае
            &#039; сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит
            &#039; свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки)
            Set objSWbemNamedValueSet = WScript.CreateObject(&quot;WbemScripting.SWbemNamedValueSet&quot;)
            objSWbemNamedValueSet.Add &quot;HostName&quot;, str
        
            &#039; Все запросы будут обрабатываться в единственной процедуре обработки
            objSWbemServicesEx.ExecQueryAsync objSWbemSink, &quot;SELECT * FROM Win32_PingStatus WHERE ADDRESS = &#039;&quot; &amp; _
                str &amp; &quot;&#039;&quot;, , , , objSWbemNamedValueSet
        
            giCurrIP = giCurrIP + 1
            lngQueueCurrLength = lngQueueCurrLength + 1
        Else
            &#039; Ожидаем, пока не будут обработаны все асинхронные запросы
            WScript.Sleep 100
        End If
    Wend

    objSWbemSink.Cancel

    Set objSWbemSink       = Nothing
    Set objSWbemServicesEx = Nothing
    
    documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; &quot;&lt;hr&gt;End Scan. Time: &quot; &amp;_
			CStr(FormatNumber( (Now() - gt_spnDetTimeStart) * 100000, 6))
		documentLog.all.btClose.focus()
		
		window.close
End Sub

&#039;=============================================================================
&#039; From http://forum.script-coding.com/viewtopic.php?id=3739
&#039; Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
&#039; будет возвращаться единственный объект, однако, в большинстве случаев запросы
&#039; возвращают множество объектов)
Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
	Dim strComputer
	strComputer = objWbemAsyncContext.Item(&quot;HostName&quot;)
    
	If Not IsNull(objWbemObject.StatusCode) Then
		If objWbemObject.StatusCode = 0 Then
			&#039;--- определяем имя машины и пользователя&#039;
			Dim sNamePC : sNamePC = &quot;&quot;
			Dim sUsrLogin : sUsrLogin = &quot;&quot;
			Dim objWMIService : Dim colItems : Dim objItem
			On Error Resume Next
			Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMV2&quot;)
			If Err.Number &lt;&gt; 0 Then
				sNamePC = &quot;&lt;strong&gt;&lt;i&gt;Error WMI&lt;/i&gt;&lt;/strong&gt;&quot;
			else
				Set colItems = objWMIService.ExecQuery (&quot;SELECT * FROM Win32_ComputerSystem&quot;, &quot;WQL&quot;, _
					wbemFlagReturnImmediately + wbemFlagForwardOnly)
				For Each objItem In colItems
					sNamePC = objItem.Caption
					If IsNull(sNamePC) OR Len(sNamePC)=0 Then &#039;возможно данный хост - не Win-System&#039;
						sNamePC = &quot;&lt;i&gt;no System name Or Access denied.&lt;/i&gt;&quot;
					Else
						If IsNull(objItem.UserName) Then 
							sUsrLogin=&quot;IsNull(UserName)&quot;
						else
							sUsrLogin = &quot;user:&quot; &amp; objItem.UserName
						End IF
						sUsrLogin = &quot;(&quot;&amp;sUsrLogin&amp;&quot;).&quot;
						If UCase(sNamePC)=gsNamePC Then &#039;--- поиск завершен!&#039;
							documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; _
								&quot;&lt;font color=&#039;darkred&#039;&gt;&quot; &amp; gsNamePC &amp; &quot; finded!&lt;/font&gt;&lt;br&gt;&quot;
							giCurrIP = giIpEnd + 2 &#039; для досрочного выхода из цикла&#039;
						End IF
						sNamePC = &quot;&lt;u&gt;&quot; &amp; sNamePC &amp; &quot;&lt;/u&gt; &quot; &amp; sUsrLogin
					End IF
				Next
			End IF &#039;Err.Number &lt;&gt; 0&#039;
			On Error GoTo 0
			documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; _
				&quot;&lt;font color=&#039;Blue&#039;&gt;&lt;u&gt;&quot; &amp; strComputer &amp; &quot;&lt;/u&gt; On -- &quot; &amp; sNamePC  &amp; &quot;&lt;/font&gt;&lt;br&gt;&quot;
			Set colItems = Nothing
			Set objWMIService = Nothing
		Else
			documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; strComputer &amp; &quot; Off&lt;br&gt;&quot;
		End If
	Else
		documentLog.all.divLog.innerHTML = documentLog.all.divLog.innerHTML &amp; strComputer &amp; &quot; Not found.&lt;br&gt;&quot;
	End If
	documentLog.all.btClose.focus()
End Sub

&#039;=============================================================================
&#039; Процедура, вызываемая при завершении асинхронной обработки
Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext)
    objWbemAsyncContext.DeleteAll
    Set objWbemAsyncContext = Nothing
    
    &#039; Уменьшаем длину очереди
    lngQueueCurrLength = lngQueueCurrLength - 1
End Sub

&#039;=============================================================================
&#039;Событие закрытия формы
Sub window_onunload()
    ExitDo = True
End Sub

&#039;Запускаем цикл ожидания, чтобы скрипт не завершался, а ждал обработки событий
Do
    WScript.Sleep 100
Loop Until ExitDo

&#039;Событие закрытия формы
Sub windowLog_onunload()
    ExitDoLog = True
End Sub

Do
    WScript.Sleep 100
Loop Until ExitDoLog


MsgBox &quot;Выполнение скрипта завершено.&quot;,vbInformation

&#039;=============================================================================
&#039; FROM: http://forum.script-coding.com/viewtopic.php?pid=45858#p45858
Function CreateWindow(content,features,x,y,width,height)
    On Error Resume Next
    Dim ShellWindows,ShellWindow,CodeForLinking,wshExec,form_id,id,i,document,window
    Set CreateWindow = Nothing
    Set ShellWindows = CreateObject(&quot;Shell.Application&quot;).Windows: Randomize: id = Clng(Rnd*100000)
    CodeForLinking = &quot;&lt;script&gt;moveTo(-1000,-1000);resizeTo(0,0);&lt;/script&gt;&quot; &amp;_
    &quot;&lt;hta:application &quot; &amp; features &amp; &quot; /&gt;&quot; &amp; _
    &quot;&lt;object id=&quot; &amp; id &amp; &quot; style=&#039;display:none&#039; classid=&#039;clsid:8856F961-340A-11D0-A96B-00C04FD705A2&#039; viewastext&gt;&lt;param name=RegisterAsBrowser value=1&gt;&lt;/object&gt;&quot;
    Set wshExec = CreateObject(&quot;WScript.Shell&quot;).Exec(&quot;mshta about:&quot;&quot;&quot; &amp; CodeForLinking &amp; &quot;&quot;&quot;&quot;)
    For i=1 to 2000
        For Each ShellWindow in ShellWindows: form_id = Clng(ShellWindow.id)
            if form_id = id Then
                Set document = ShellWindow.container:
                Set window = document.parentWindow
                document.open: window.execScript &quot;var Host&quot;: Set window.Host = me
                document.write content: document.close
                if x &lt;= 0 Then x = (window.screen.width - width) / 2
                if y &lt;= 0 Then y = (window.screen.height - height) / 2
                window.execScript &quot;document.onkeydown = function(){if(event.keyCode == 116){return false}};&quot; &amp;_
                &quot;setInterval(&#039;var e;try{Host.WScript}catch(e){close()}&#039;,100);moveTo(&quot; &amp; x &amp; &quot;,&quot; &amp; y &amp; &quot;);resizeTo(&quot; &amp; width &amp; &quot;,&quot; &amp; height &amp; &quot;)&quot;
                Set CreateWindow = window
                Exit Function
            End if
        Next
    Next
    wshExec.Terminate()
End Function</code></pre></div><p>Красивое прерывание сканирования не реализовывал, но если окно лога закрыть, то скрипт таки прервется с сообщениями об ошибках)<br />Еще раз спасибо за &quot;заготовки&quot;! Пожелания-замечания-придирки к коду - принимаются)</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Fri, 11 Nov 2011 21:09:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=53440#p53440</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WMI : Асинхронный мультипинг]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33573#p33573</link>
			<description><![CDATA[<p>Спасибо <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Просто супер <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" />&nbsp; <br />да, я пробовал этот код вставить в отдельный модуль...&nbsp; &nbsp;в модуль рабочей книги - как-то не догадался...&nbsp; <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Евген)]]></author>
			<pubDate>Tue, 02 Mar 2010 04:21:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33573#p33573</guid>
		</item>
	</channel>
</rss>
