1 (изменено: Аскет, 2011-09-25 02:49:12)

Тема: 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.

2 (изменено: dab00, 2011-09-27 22:14:34)

Re: WMI: сканер портов

Аскет пишет:

p.s. как окзалось, используемый класс отсутствует в Win7.
скрипт тестировался под WinXP sp2. Должен работать под 2k3.

Ну все, теперь точно уходим в .NET
p.s. сорри за оффтоп, реплика имеет отношение к моей текущей ситуации

3

Re: WMI: сканер портов

Почему .NET?

WMI в разы кручей дотнетов, да и разные это вещи из разных подсистем, IMO.
Думаю что в Висте и 7 полюбому есть аналоговые и более совершенные классы.
А про серверные ОС даже говорить не стоит. (~5000 классов в 2k3  против ~3500 в winXP).

p.s. А что, на XP уже никто не сидит?