Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2009, 12:25   #1
ru3000
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 163
Вопрос Как реализовать запуск mstsc.exe с вводом ip, логина и пароля?

Как реализовать в макросе запуск mstsc.exe с вводом ip, логина и пароля. Чтобы сразу запускался консольный вариант и не спрашивал данные пользователя. Спрашиваю потому что параметрами самого mstsc такого не сделать. Вариант с сохранением настроек в файл rdp не предлагать, т.к. предполагается запускать и на др. машинах, а в этом случае пароли в rdp сбрасываются. И еще такое пожелание: чтобы ip, логин и пароль брались из ячеек A1, A2 и A3.
Тут вот кое что есть, но вот логин и пароль не знаю как вставить:
Код:
Shell "mstsc.exe /v:" & Range("A1").Value, 1

Последний раз редактировалось ru3000; 19.06.2009 в 12:33.
ru3000 вне форума Ответить с цитированием
Старый 19.06.2009, 15:12   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Тут вот кое что есть, но вот логин и пароль не знаю как вставить
А никак Вы туда логин с паролем не вставите...

Здесь есть список допустимых параметров командной строки для этой программы.

Вы же сами пишете:
Цитата:
Спрашиваю потому что параметрами самого mstsc такого не сделать
По-нормальному выполнить запуск программы с вводом логина и пароля не удастся.

Но есть ещё вариант в стиле "per rectum": мы можем запустить программу без параметров, а потом посылать ей нажатия кнопок в нужной последовательности, чтобы курсор перескакивал из поля в поле, и в нужные поля вводились символы.
Можно также средствами WinAPI посылать команды окну приложения mstsc.exe, но это ещё сложнее.

Короче, сформировать любую строку запуска (всё, что Вы запускаете через Пуск - Выполнить, или через интерфейс командной строки) средствами Excel, и запустить её на выполнение - не проблема.
А вот обход ограничений программы - это уже требует времени и сил.

(добавлено)
Есть ещё одна небольшая проблема.
Посылать нажатия клавиш, конечно, можно, но следует учесть один нюанс.
Если ранее на этом компьютере уже выполнялись подключения, некоторые поля могут быть скрыты, и фокус ввода может попадать на другие поля.
К примеру, если ранее к этому хосту не подключались, после нажатия на кнопку Подключить фокус ввода попадает в поле Логин.
Но, если ранее к этому хосту уже выполнялось подключение, то фокус ввода попадает в поле Пароль (так как логин сохранился со времени предыдущего подключения), а средствами Excel сложно узнать, в каком из полей находится курсор.

Впрочем, сейчас попытаюсь что-нибудь изобрести. Самому пригодится, если получится.


(добавлено позже)
Посмотрите также макросы, выполняющие ввод логина и пароля
(в том числе и для авторизации пользователя на сайтах, и разграничения доступа к книге Excel)

А здесь есть макросы для работы с сетью и оборудованием, в том числе с IP-адресами и протоколом telnet

Последний раз редактировалось EducatedFool; 19.11.2011 в 00:09.
EducatedFool вне форума Ответить с цитированием
Старый 19.06.2009, 15:42   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот такой код у меня работает нормально:

Код:
Sub ConnectToRemoteDesktop(ByVal Host As String, ByVal Login As String, ByVal Password As String)
    commandLine = "mstsc.exe /v:" & Host
    CreateObject("WScript.Shell").Run commandLine
    For j = 1 To 100000: DoEvents: Next j
    SendWord Login: SendWord vbTab
    SendWord Password: SendWord "~" ' "~" - это Enter (для запуска соединения)
End Sub

Sub SendWord(ByVal txt As String)
    Пауза = 600
    For i = 1 To Len(txt)
        буква = Mid(txt, i, 1): Application.SendKeys буква
        For j = 1 To Пауза: DoEvents: Next j
    Next i
End Sub

Sub ПримерИспользования()
    ConnectToRemoteDesktop "12.222.111.22", "MyLogin", "MyPassword"
    ' или так: ConnectToRemoteDesktop [a1], [a2], [a3]
End Sub
Вам может только понадобиться увеличить паузы между нажатием клавиш (выделены красным цветом)
Я подбирал по своему компьютеру.

Первая пауза: For j = 1 To 100000: DoEvents: Next j
- это время между отправкой комнды, и запуском окна приложения (зависит от скорости доступа к диску и т.д.)

Вторая - Пауза = 600
между отправкой букв (зависит от загруженности процессора и т.п.)

Запустите макрос ПримерИспользования. Отпишитесь о результатах.
EducatedFool вне форума Ответить с цитированием
Старый 19.06.2009, 17:33   #4
ru3000
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 163
По умолчанию

Спасибо за ответ. Но текст у меня не вводится в поле пользователь и пароль. Возможно потому что у меня виста. Этот макрос планируется запускать на разных машинах, а скотость нета везде разная и процы соответственно тоже, так что с сендкеем немного проблематично. Не будешь же каждый раз исправлять задержку. Походу это гиблый вариант. Можеть быть есть альтернатива для mstsc, которая использует виндовый RDP и сохраниет пароли?
Еще раз спасибо за помощь.

Последний раз редактировалось ru3000; 19.06.2009 в 17:56.
ru3000 вне форума Ответить с цитированием
Старый 19.06.2009, 17:52   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Но текст у меня не вводится в поле пользователь и пароль. Возможно потому что у меня виста.
Вполне возможно.
На Висте проверить не имею возможности...

Попробуйте поставить задержку не 100000, а 800000
И вместо 600 - что-то около 5000
Может, просто окно не успевает открыться.
У меня-то окно появляется моментально...
EducatedFool вне форума Ответить с цитированием
Старый 19.06.2009, 19:07   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Не будешь же каждый раз исправлять задержку.
Ну, можно программно узнать загрузку процессора, объем памяти и другие параметры, чтобы подобрать необходимую задержку.
А ещё лучше средствами WinAPI перебирать все окна до тех пор, пока не появится нужное.

Цитата:
Походу это гиблый вариант.
Я же сразу сказал, что это вариант в стиле "per rectum"...
Все остальные способы намного сложнее.

Цитата:
Можеть быть есть альтернатива для mstsc, которая использует виндовый RDP и сохраниет пароли?
Возможно. При желании можно выдрать любую информацию из системы, установить соединение с удалённым компом и без этой программы, и т.д. и т.п.

Но, согласитесь, это уже вопрос не для раздела Microsoft Office Excel...
EducatedFool вне форума Ответить с цитированием
Старый 20.06.2009, 10:29   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

В случае с Windows Vista должен сработать такой вариант:

Код:
Const KEYEVENTF_KEYUP = &H2, INPUT_MOUSE = 0, INPUT_KEYBOARD = 1, INPUT_HARDWARE = 2
Private Type MOUSEINPUT: dx As Long: dy As Long: mouseData As Long:
    dwFlags As Long: time As Long: dwExtraInfo As Long: End Type
Private Type KEYBDINPUT: wVk As Integer: wScan As Integer: dwFlags As Long: time As Long:
    dwExtraInfo As Long: End Type
Private Type HARDWAREINPUT: uMsg As Long: wParamL As Integer: wParamH As Integer: End Type
Private Type GENERALINPUT: dwType As Long: xi(0 To 23) As Byte: End Type
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, _
                                                     ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
                               (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Sub setShift(ShiftState As Boolean)
    Dim Inp As GENERALINPUT, xxi As KEYBDINPUT: Inp.dwType = 1
    xxi.wVk = &H10: xxi.wScan = 0: xxi.dwExtraInfo = 0: xxi.time = 0: xxi.dwFlags = IIf(ShiftState, 0, 2)
    CopyMemory Inp.xi(0), xxi, Len(xxi): SendInput 1, Inp, Len(Inp)
End Sub

Sub SendKey(bKey As Byte)
    Dim GInput(0 To 1) As GENERALINPUT, KInput As KEYBDINPUT: KInput.wVk = bKey
    KInput.dwFlags = 0: GInput(0).dwType = INPUT_KEYBOARD: CopyMemory GInput(0).xi(0), KInput, Len(KInput)
    KInput.wVk = bKey: KInput.dwFlags = KEYEVENTF_KEYUP: GInput(1).dwType = INPUT_KEYBOARD:
    CopyMemory GInput(1).xi(0), KInput, Len(KInput): Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub

Sub ConnectToRemoteDesktop(ByVal Host As String, ByVal Login As String, ByVal Password As String)
    commandLine = "mstsc.exe /v:" & Host
    CreateObject("WScript.Shell").Run commandLine
    For j = 1 To 200000: DoEvents: Next j
    SendWord Login: SendWord vbTab: SendWord Password: SendWord Chr(13)
End Sub

Sub SendWord(ByVal txt As String)
    Пауза = 3500
    For i = 1 To Len(txt)
        буква = Mid(txt, i, 1)
        If UCase(буква) <> буква Then
            SendKey Asc(UCase(буква))
        Else
            setShift True: SendKey Asc(UCase(буква)): setShift False
        End If
        For j = 1 To Пауза: DoEvents: Next j
    Next i
End Sub

Sub ПримерИспользования()
    ConnectToRemoteDesktop "12.222.111.22", "MyLogin", "MyPassword"
    ' или так: ConnectToRemoteDesktop [a1], [a2], [a3]
End Sub
Логин и пароль должны содержать только латинские буквы.
В данной версии макроса кириллица не поддерживается.
EducatedFool вне форума Ответить с цитированием
Старый 06.07.2009, 15:17   #8
ru3000
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 163
Лампочка

Спасибо за помощь, но это все не стабильные варианты. А надо чтобы везде и на каждой машине работало.
Вот что я нашел в самом excel!!! (см. вложение)
В нете порылся по этому поводу, кое-что есть:
Код:
Sub ExecuteConnection(strServer, strUser, strPW)
' create the client
Dim objMsRdpClient
Set objMsRdpClient = CreateObject("MsTscAx.MsTscAx.2")
objMsRdpClient.Server = strServer
objMsRdpClient.UserName =strUser
objMsRdpClient.FullScreen = false
objMsRdpClient.AdvancedSettings2.RedirectDrives = False
objMsRdpClient.AdvancedSettings2.RedirectPrinters = False
objMsRdpClient.AdvancedSettings2.RedirectPorts = False
objMsRdpClient.AdvancedSettings2.RedirectSmartCards = False

objMsRdpClient.AdvancedSettings2.ClearTextPassword = strPW
objMsRdpClient.StartConnected = True
WScript.echo "Before connecting"
dim intResult

' The following call returns immediately
intResult = objMsRdpClient.Connect
WScript.echo "After connecting Result: " & intResult

WScript.sleep 10000
objMsRdpClient.Disconnect
End Sub
Помогите разобраться и применить к моей задаче!
Вложения
Тип файла: zip Doc1.zip (255.1 Кб, 93 просмотров)

Последний раз редактировалось ru3000; 06.07.2009 в 16:06.
ru3000 вне форума Ответить с цитированием
Старый 07.07.2009, 00:23   #9
ru3000
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 163
По умолчанию

Я с activx никогда не работал. Если кто в курсе, как это сделать, помогите. Вроде как должно получиться.
ru3000 вне форума Ответить с цитированием
Старый 07.07.2009, 00:48   #10
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

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

Последний раз редактировалось doober; 07.07.2009 в 08:58.
doober вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод логина и пароля. С++ Builder lamaksi C++ Builder 2 05.03.2009 15:59
запуск exe Manitu Помощь студентам 11 02.05.2008 19:03
как реализовать в программе, запуск bat файлов? SereJa1020 Общие вопросы Delphi 1 06.03.2008 18:10
Запуск exe с параметрами Altera Общие вопросы Delphi 2 26.02.2008 21:25