Тема: WMI: сканер портов
Приветствую коллеги.
WMI таит много секретов и недокументированных классов, да и вообще...загадочный.
Одни из таких очень полезных классов NetDiagnostics.
Ни msdn ни WMIsdk о нём знать не знают (почти). Но мы и без документаций, сами себе само-документированные ![]()
Описание [ROOT\cimv2:NetDiagnostics]: <none>
----------------------------
Methods [NetDiagnostics]:
Ping (host)
ConnectToPort (host, port)
----------------------------
Properties [NetDiagnostics]:
bIEProxy
id
IEProxy
IEProxyPort
NewsNNTPPort
NewsServer
Оба метода (Ping и ConnectToPort) возвращают булево значение, и работа с ними достаточна проста.
В рамках данной темы нам интересен только ConnectToPort.
Набросал, как всегда компактно, вот такой сканер портов:
'*****************************************************************************************
'* Name: PortScaner
'* Language: VBScript
'* CommandLine: PortScaner.vbs [[host[=localhost]] portStart[=7] portEnd]
'* Description: Сканер открытых TCP-портов и диапазонов портов.
'************************************************************************************
'* CopyLeft: Аскет, 19 spt 2011
'*************************************************************************************
SELECT CASE wsh.arguments.count
CASE 0: WSH.ECHO "USAGE:" & VBCR & "PortScaner.vbs [host] port"
WSH.ECHO "USAGE:" & VBCR & "PortScaner.vbs [host] portStart portEnd"
WSH.Quit
CASE 1:
host="localhost"
port=WSH.ARGUMENTS(0)
CASE 2:
host=WSH.ARGUMENTS(0)
port=WSH.ARGUMENTS(1)
CASE 3:
PoprtRange = (WSH.ARGUMENTS(2) - WSH.ARGUMENTS(1))
REDIM port(PoprtRange)
host = WSH.ARGUMENTS(0)
j=0
FOR i = WSH.ARGUMENTS(1) TO WSH.ARGUMENTS(2)
port(j)=i
j=j+1
NEXT
END SELECT
set wmi = GetObject ("winmgmts:NetDiagnostics").instances_
if NOT IsArray(port) THEN
FOR EACH net IN wmi
res = net.ConnectToPort ( host ,port)
if (res) THEN wscript.echo (host &": "& port)
next
else
FOR EACH net IN wmi
for each p in port
res = net.ConnectToPort (host ,p)
IF (res) THEN wscript.echo (host &": "& p)
next
NEXT
end ifВся беда в том что никак я не могу привязать асинхронность, или лучше - многопоточность.
ExecMethodAsync с этим классом работать отказывается. (этот метод WMI COMAPI стоит обсудить отдельно, думаю)
Многопоточность через SetTimeout, предложенная коллегой Xameleon'ом, тоже не вяжется - через GETREF нельзя передать параметры функции.
Хотелось бы конечно реализовать на чистом WMI.
Ваши предложения, коллеги. Как воплотить асинхронность/многопоточность?
p.s. как окзалось, используемый класс отсутствует в Win7.
скрипт тестировался под WinXP sp2. Должен работать под 2k3.

