1 (изменено: aaa_cngt, 2014-09-18 04:43:34)

Тема: VBA: Telnet через VBA

Доброго время суток!

Задача: телнетить порты оборудования, для проверки его доступности.

Win7, 64bit, Office 2010

  Public WithEvents ws As Winsock

 Private Sub Workbook_Open()   
 Set ws = CreateObject("MSWinsock.Winsock")
  
    ws.RemoteHost = "10.1.4.17": ws.RemotePort = 4885
    ws.Connect
    Do While (ws.State <> 7): DoEvents: Debug.Print "State = " & ws.State: Loop
    Debug.Print "Connected"
 End Sub 




При попытке создания объекта, получаю: Run-time error '429' ActiveX component can't create object

Использую библиотеку (или как это правильно называется)  mswinsck.ocx
Пробовал все это еще на WinXP, 64bit, Office 2003

Вопрос: что сделать чтоб создался объект?

2

Re: VBA: Telnet через VBA

Хелп!

3

Re: VBA: Telnet через VBA

А если попробовать на x86?

4

Re: VBA: Telnet через VBA

Не вникал глубоко, но, вроде, .ocx на семёрке не поддерживается...

5

Re: VBA: Telnet через VBA

но, вроде, .ocx на семёрке не поддерживается...

С чего бы это?

Вот сервер 2008 R2:

dmview.ocx
hhctrl.ocx
sysmon.ocx
tdc.ocx
wshom.ocx

Там же, 32-разрядные (в «SysWOW64»):

dmview.ocx
hhctrl.ocx
msscript.ocx
sysmon.ocx
tdc.ocx
wshom.ocx

6

Re: VBA: Telnet через VBA

для начала спасибо всем за ответы

Раздобыл 32 битную машину на работе (оказывается это уже дефицит), завтра буду пробовать, но на ней 7(((

Может быть стоит запрет на создание ActiveX, и нужно пропатчить ocx?

В общем не могу пока разобраться, мало информации и походу именно с созданием объектов проблем не было.

7

Re: VBA: Telnet через VBA

Может быть стоит запрет на создание ActiveX,

Может быть. Для браузера. Ключевое слово «killbit».

и нужно пропатчить ocx?

Зачем?

8

Re: VBA: Telnet через VBA

Serge Yolkin пишет:

Не вникал глубоко, но, вроде, .ocx на семёрке не поддерживается...

???
Командная строка говорит об обратном:

powershell /nologo /noprofile /command "& {gcm -c Application *.ocx} | ft -a"
aaa_cngt пишет:

Может быть стоит запрет на создание ActiveX, и нужно пропатчить ocx?

Как уже сказал alexii -  может быть. Другое дело есть ли в системе сам mswinsck.ocx.

powershell /nologo /noprofile /command "& {gcm -c Application *.ocx | ? {$_.Name -like 'ms*.ocx'} | ft -a}"

В выоде команды отчего-то упомянутого ocx не нашлось.

9

Re: VBA: Telnet через VBA

greg zakharov на XP        mswinsck.ocx        есть и у меня ни чего не получается, на win7 его нет (я тупо подгружаю его в надежде на чудо) и тоже ни чего не выходит.
У кого нибудь есть пример? Чтобы просто тупо создавался объект, больше ни чего не нужно (ну и упомянуть что за винда и офис использовался)

greg zakharov вы говорите что  mswinsck.ocx  нет в win7, вы не знаете тогда какая библиотека используется для создания объектов "winsock"?

10

Re: VBA: Telnet через VBA

aaa_cngtСкажу более: во-первых, если погулять по сайтам Мелкософта, можно отыскать примерно следующее; во-вторых, есть такая штука, WinAPI зовется, чтобы с сокетами дружить более приятно было; в-третьих, ни в ХР, ни в 7 mswinsck.ocx не нашлось.

11 (изменено: aaa_cngt, 2014-09-18 04:42:55)

Re: VBA: Telnet через VBA

greg zakharov Гулял вчера весь вечер, много нашел полезного и бесполезного. Среди всего прочего, вот:


 Public Const AF_INET = 2
Public Const SOCK_STREAM = 1
Public Const SOCKET_ERROR = 1
Public Const FD_SETSIZE = 64
Public Const FIONBIO = 2147772030#
Public Const SOCKADDR_IN_SIZE = 16
Public Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000[/i]

[i]Public Type WSADATA
    wVersion As Integer
    wHighVersion As Integer
    szDescription As String * 257
    szSystemStatus As String * 129
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpVendorInfo As Long
End Type[/i]

[i]Public Type SOCKADDR_IN
    sin_family As Integer
    sin_port As Integer
    sin_addr As Long
    sin_zero As String * 8
End Type[/i]

[i]Public Type fd_set
    fd_count As Long
    fd_array(FD_SETSIZE) As Long
End Type[/i]

[i]Public Type timeval
    tv_sec As Long
    tv_usec As Long
End Type[/i]

[i]Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal intVersionRequested As Integer, lpWSAData As WSADATA) As Long
Public Declare Function WSACleanup Lib "wsock32.dll" () As Long
Public Declare Function w_socket Lib "wsock32.dll" Alias "socket" (ByVal lngAf As Long, ByVal lngType As Long, ByVal lngProtocol As Long) As Long
Public Declare Function w_closesocket Lib "wsock32.dll" Alias "closesocket" (ByVal SocketHandle As Long) As Long
Public Declare Function w_bind Lib "wsock32.dll" Alias "bind" (ByVal socket As Long, Name As SOCKADDR_IN, ByVal namelen As Long) As Long
Public Declare Function w_connect Lib "wsock32.dll" Alias "connect" (ByVal socket As Long, Name As SOCKADDR_IN, ByVal namelen As Long) As Long
Public Declare Function w_send Lib "wsock32.dll" Alias "send" (ByVal socket As Long, buf As Any, ByVal length As Long, ByVal flags As Long) As Long
Public Declare Function w_recv Lib "wsock32.dll" Alias "recv" (ByVal socket As Long, buf As Any, ByVal length As Long, ByVal flags As Long) As Long
Public Declare Function w_select Lib "wsock32.dll" Alias "select" (ByVal nfds As Long, readfds As fd_set, writefds As fd_set, exceptfds As fd_set, timeout As timeval) As Long
Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Integer) As Integer
Public Declare Function ntohl Lib "wsock32.dll" (ByVal netlong As Long) As Long
Public Declare Function inet_addr Lib "wsock32.dll" (ByVal Address As String) As Long
Public Declare Function ioctlsocket Lib "wsock32.dll" (ByVal socket As Long, ByVal cmd As Long, argp As Long) As Long
Public Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long[/i]


[i]Private Sub CloseSocket(socket As Long)
    If socket <> -1 Then
        w_closesocket socket
    End If
    WSACleanup
End Sub[/i]

[i]Public Function ReadURI(Address, URI)
    Dim ret As Long
    Dim SocketHandle As Long
    Dim wd As WSADATA
    Dim localAddress As SOCKADDR_IN
    Dim serverAddress As SOCKADDR_IN
    Dim URIRequest As String
    Dim retBuff(1000) As Byte
    Dim retString As String
    Dim tempString As String
    VcitajURI = ""
    SocketHandle = -1
    ret = WSAStartup(&H101, wd)
    If ret <> 0 Then GoTo ErrorHandler
    SocketHandle = w_socket(AF_INET, SOCK_STREAM, 0)
    If SocketHandle = -1 Then GoTo ErrorHandler
    localAddress.sin_family = AF_INET
    localAddress.sin_port = 0
    localAddress.sin_addr = 0
    ret = w_bind(SocketHandle, localAddress, SOCKADDR_IN_SIZE)
    If ret = -1 Then GoTo ErrorHandler
    serverAddress.sin_family = AF_INET
    serverAddress.sin_port = htons(80)
    serverAddress.sin_addr = inet_addr(Address)
    ret = w_connect(SocketHandle, serverAddress, SOCKADDR_IN_SIZE)
    If ret = -1 Then GoTo ErrorHandler
    URIRequest = "GET /" & URI & " HTTP/1.0" & vbCrLf & vbCrLf
    ret = w_send(SocketHandle, ByVal URIRequest, Len(URIRequest), 0)
    If ret = -1 Then GoTo ErrorHandler
    Do
        ret = w_recv(SocketHandle, retBuff(0), 1000, 0)
        If ret = -1 Then GoTo ErrorHandler
        If ret > 0 Then
            tempString = StrConv(retBuff, vbUnicode)
            retString = retString & Left(tempString, ret)
        End If
    Loop While ret > 0
    VcitajURI = retString
ErrorHandler:
    CloseSocket SocketHandle
End Function

Как воспользоваться этим? Я так понимаю нужно вызвать функцию ReadURI (не могу только понять с какими параметрами) и она вернет мне ручное управление сокетом. Хотелось бы ip:port. Если кто сталкивался подскажите, с меня 3 литра пива, темного.

12 (изменено: aaa_cngt, 2014-09-18 04:42:37)

Re: VBA: Telnet через VBA

 Private Sub Workbook_Open()
Dim adr As SOCKADDR_IN
Dim URL As String
Dim hh As Variant
adr.sin_addr = inet_addr("10.1.4.17")
adr.sin_port = htons(4884)[/i]

[i]adr.sin_family = AF_INET
hh = ReadURI(adr, URL)
MsgBox hh
End Sub

Ошибка: Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions

13

Re: VBA: Telnet через VBA

Уважаемый, aaa_cngt! Не могли бы Вы оформлять код в соответсвующую пару тэгов code? Кстати, а чем Вас не устраивает штатный telnet.exe? Синтаксис прост, автоматизировать также довольно просто. Ну, а если непременно требуется winsock, то могу попробовать соорудить что-нибудь на Си. Правда без каких-либо обещаний.

14

Re: VBA: Telnet через VBA

greg zakharov пишет:

Уважаемый, aaa_cngt! Не могли бы Вы оформлять код в соответсвующую пару тэгов code?

aaa_cngt, я также настойчиво присоединяюсь к пожеланию уважаемого коллеги.

15

Re: VBA: Telnet через VBA

greg zakharov пишет:

... telnet.exe ... автоматизировать ... довольно просто ...

На VBA его можно автоматизировать? На JS я смог только имитировать нажатия клавишей, а получить ответ не удалось совсем

greg zakharov пишет:

могу попробовать соорудить что-нибудь на Си

Э-э-м-м... Можно приступать к составлению ТЗ?

16

Re: VBA: Telnet через VBA

Serge Yolkin пишет:

На JS я смог только имитировать нажатия клавишей, а получить ответ не удалось совсем

Да, речь была об имитации нажатия клавиш, однако странно, что Вы не получили ответа, - может отключена служба Telnet?

Serge Yolkin пишет:

Э-э-м-м... Можно приступать к составлению ТЗ?

Рискните

17

Re: VBA: Telnet через VBA

Господа, спасибо за ответы! Код, впредь, буду оформлять в соответствии ваших рекомендаций.
exe я и сам могу соорудить.
Мне нужно чтоб был Excel.
Пока роюсь в описаниях winAPI, там много нового и верного, но все новое не верно, а все верное не ново)

18

Re: VBA: Telnet через VBA

Код, впредь, буду оформлять в соответствии ваших рекомендаций.

Это хорошо. Исправьте тот, что уже есть выше в этой теме.

19

Re: VBA: Telnet через VBA

Крайне рекомендую обратить внимание на класс модуль CSocketMaster и CSocketPlus

https://www.planet-source-code.com/vb/s … p;lngWId=1

Они оформлены под функционал OCX Winsock-а c минимальными отличиями.

Давно пользуюсь, очень доволен.

Особенная прелесть - Защита от падения IDE в момент отладки, если произошла ошибка. Защита достигнута благодаря ассемблерной вставке с которой связывается функция обратного вызова даже в случае непредвиденной остановки кода.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

20 (изменено: Serge Yolkin, 2014-09-18 09:58:08)

Re: VBA: Telnet через VBA

greg zakharov
На счет ответа - может я коряво выразился, я имел ввиду получение ответа удалённой машины скриптом. В интерфейсе телнет-клиента ответ, разумеется, есть. С putty/kitty ответ можно получить из лога, если предварительно включить лог, но чтение/парсинг файла для половины работы интерактивного приложения выглядит костылём.
Возможно я не прав, но, кажется, у существующих телнетов stdIn/stdOut напрвлены в сторону удалённой машины. Поэтому и не перехватываются. А хотелось бы заиметь программу (не COM, поскольку требует регистрации) - телнет-клиент без интерфейса, но с доступными из скрипта stdIn/stdOut (метод WScript.Shell.exec()). Интерфейсом будет скрипт, ну, или .hta .

P.S. Собственно, меня интересует только "чистый" телнет, без шифрований и продвинутых протоколов, только 23 порт.

21

Re: VBA: Telnet через VBA

Serge Yolkin пишет:

...но чтение/парсинг файла для половины работы интерактивного приложения выглядит костылём.

Увы, это так.

Serge Yolkin пишет:

Собственно, меня интересует только "чистый" телнет, без шифрований и продвинутых протоколов, только 23 порт.

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

22

Re: VBA: Telnet через VBA

Всем спасибо за ответы.
Все сделал через WinAPI как и советовал greg zakharov
Xameleon, спасибо за модули, сейчас сижу разбираюсь.
Тему можно закрывать.

23

Re: VBA: Telnet через VBA

greg zakharov
С нетерпением...

24

Re: VBA: Telnet через VBA

aaa_cngt пишет:

для начала спасибо всем за ответы
Раздобыл 32 битную артек машину на работе (оказывается это уже дефицит), завтра буду пробовать, но на ней 7(((
Может быть стоит запрет на создание ActiveX, и нужно пропатчить ocx?
В общем не могу пока разобраться, мало информации и походу именно с созданием объектов проблем не было.

Ну и что что "семёрка"? А переставить проблема? Это ж времени займёт полчаса...

Кодэры код кодировали кодировали, да не не выкодирыровали... :)

25

Re: VBA: Telnet через VBA

OFFTOP:

DanceWoman, [ПМСМ] крайне странный подход к решению проблемы.
https://vk.com/images/stickers/104/128.png

Когда в машине радио не ловит, движок не начинаете перебирать ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !