Войти

Показать полную графическую версию : [решено] Создание VPN подключения с помощью Autoit, не прописывает имя сервера.


Страниц : [1] 2

Vic_tory
08-04-2009, 17:14
В архивах форума нашла скрипт от «Котяры» создание диалап подключения, переделала под впн. На моем компьютере скрипт отрабатывает, .exe файл тоже (стоит Win XP SP2 Pro ). На других компьютерах пользователей (таже операционка )установка доходит до введения имени компьютера и останавливается.

Run("rundll32.exe netshell.dll,StartNCW")
WinWaitActive ('Мастер новых подключений','Мастер новых подключений')
Send('{Enter}')
Sleep ('500')
WinWaitActive ('Мастер новых подключений','Подключить к рабочей сети (используя удаленный доступ или VPN), чтобы можно было работать из дома, удаленного офиса или другого места.')
ControlClick ('Мастер новых подключений','Подключить к рабочей сети (используя удаленный доступ или VPN), чтобы можно было работать из дома, удаленного офиса или другого места.','Button2')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Создать подключение')
ControlClick ('Мастер новых подключений','Создать подключение','Button2')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Организация')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Name' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.')
ControlClick ( 'Мастер новых подключений','Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.','Button1')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Имя компьютера или IP-адрес (например, microsoft.com или 157.54.0.1):')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Host' )
Sleep ('500')
Send('{Enter}')
ControlCommand ( 'Мастер новых подключений', '', 'Button8', 'Check', '' )
ControlCommand ( 'Мастер новых подключений', '', 'Button1', 'Check', '' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Завершение работы мастера новых подключений')
ControlCommand ( 'Мастер новых подключений', '', 'Button10', 'UnCheck', '' )
Send('{Enter}')
Exit


Брала скрип пример из книги Алексея Барабанова «Автоматизация MS Windows или AutoIt, как мечта эникейщика.» тоже самое :о(, у меня работает, на других компах доходит до прописывания имени компьютера и останавливается, не пойму в чем дело! Помогите плиииз!

amel27
09-04-2009, 11:29
не пойму в чем дело »
очевидно ждет окна, которого нету:
WinWaitActive ('Мастер новых подключений','Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.')
как вариант - поставить таймаут ожидания в WinWaitActive() - третий параметр (в секундах), по истечении периода ожидания если окно не появится скрипт продолжит работу... для просмотра в трее строки, на которой "висит" скрипт используйте команду:
Opt("TrayIconDebug", 1)

Vic_tory
09-04-2009, 12:16
Спасибо за ответ, но дело в том что на компьютере на котором пишется скрипт все работает. На других компьютерах с той же ОС останавливается на активном окне 'Мастер новых подключений','Имя компьютера или IP-адрес (например, microsoft.com или 157.54.0.1):' и мигающим курсором в окне ввода имени сервера.

Если поставить таймаут то скрипт продолжает работу но в параметрах сервера остается пусто.

proxy
09-04-2009, 12:46
Ипользуйте утилиту: Au3Info.exe (находится в корне папки AutoIt)
и посмотрите окно на котором останавливается выполнение скрипта.

Окно должно иметь заголовок: Мастер новых подключений
В тексте окна должен присутсвовать текст (точь в точь): Имя компьютера или IP-адрес (например, microsoft.com или 157.54.0.1):

Поле ввода ip адреса должно иметь ClassnameNN: Edit1

amel27
09-04-2009, 13:38
Vic_tory, попробуйте так:
Run("rundll32.exe netshell.dll,StartNCW")

$TITLE = "Мастер новых подключений"
While WinWaitActive($TITLE, "", 3)
$TEXT = WinGetText("")
Select
Case StringInStr($TEXT,'Этот мастер поможет:')
Case StringInStr($TEXT,'Подключить к рабочей сети (используя удаленный доступ или VPN), чтобы можно было работать из дома, удаленного офиса или другого места.')
ControlClick ("","","Button2")
Case StringInStr($TEXT,'Создать подключение')
ControlClick ("","","Button2")
Case StringInStr($TEXT,'Организация')
ControlSetText("","","Edit1","Name")
Case StringInStr($TEXT,'Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.')
ControlClick ("","","Button1")
Case StringInStr($TEXT,'Имя компьютера или IP-адрес (например, microsoft.com или 157.54.0.1):')
ControlSetText("","","Edit1","Host")
Case StringInStr($TEXT,'Создать это подключение:')
ControlCommand("","","Button1","Check","")
Case StringInStr($TEXT,'Завершение работы мастера новых подключений')
ControlCommand("","","Button10","UnCheck","")
Case Else
Sleep ('100')
ContinueLoop
EndSelect
Sleep ('500')
Send('{Enter}')
WEnd

Vic_tory
09-04-2009, 13:48
Ипользуйте утилиту: Au3Info.exe (находится в корне папки AutoIt)
и посмотрите окно на котором останавливается выполнение скрипта.
Окно должно иметь заголовок: Мастер новых подключений
В тексте окна должен присутсвовать текст (точь в точь): Имя компьютера или IP-адрес (например, microsoft.com или 157.54.0.1): »

Проверила окно, заголовок точно такойже
в начеле перед текстом окна стоит знак "&" поставила, не помогло

Поле ввода ip адреса должно иметь ClassnameNN: Edit1 »

так и есть

Vic_tory
09-04-2009, 14:05
Спасибо amel27 ваш скрипт работает :о)

только я так и не поняла почему не работает мой :о( что было не так?

proxy
09-04-2009, 14:52
#region: - Options
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
Opt('WinDetectHiddenText', 1)
#endregion

HotKeySet('{ESC}', '_Pro_Exit')

Local $iPid = Run('rundll32.exe netshell.dll,StartNCW')
Local $sRasPhoneFilePath = @AppDataCommonDir & '\Microsoft\Network\Connections\Pbk\rasphone.pbk'
Local $sRasPhoneFileText = FileRead($sRasPhoneFilePath)
Local $iHwd, $sText
Local $sTitle = 'Мастер новых подключений'
Local $sConnectName = 'Connect name - Имя подключения'
Local $sConnectIP = '150.100.0.12'
Local $fAddShortcutOnDesktop = 1

While 1
$iHwd = _ProcessGetWindow($iPid)
If BitAnd(WinGetState($iHwd), 2) Then ExitLoop
WEnd

While 1
$sText = WinGetText($iHwd)

Select
Case StringInStr($sText,'Этот мастер поможет:')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')

Case StringInStr($sText,'Подключить к рабочей сети (используя удаленный доступ или VPN), чтобы можно было работать из дома, удаленного офиса или другого места.')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:6]')

Case StringInStr($sText,'&Подключение к виртуальной частной сети')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:8]')

Case StringInStr($sText,'Введите в следующем поле имя для этого подключения.')
While 1
If StringInStr($sRasPhoneFileText, '[' & _StringToUTF($sConnectName) & ']') OR $sConnectName == '' Then
$sConnectName = InputBox('Внимание', 'Подключение с иминем "' & $sConnectName & '" уже существует' & @CRLF & @CRLF & _
'Введите другое название для подключения:', '', '', 300, 150, -1, -1)
Else
ExitLoop
EndIf
WEnd
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sConnectName)
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:8]')

Case StringInStr($sText,'Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:1]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:10]')

Case StringInStr($sText,'Введите имя узла или IP-адрес компьютера, к которому осуществляется подключение.')
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sConnectIP)
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:10]')

Case StringInStr($sText,'Успешно завершено создание следующего подключения:')
If $fAddShortcutOnDesktop Then ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:1]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:21]')
ExitLoop
EndSelect
Sleep('10')
WEnd

Func _Pro_Exit()
Exit
EndFunc

Func _ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc

Func _StringToUTF($String)
Local $sResult = "", $iCode
Local $VarUTFArr = StringSplit($String, "")

For $i = 1 To $VarUTFArr[0]
$iCode = Asc($VarUTFArr[$i])

Select
Case $iCode >= 192 And $iCode <= 239
$VarUTFArr[$i] = Chr(208) & Chr($iCode - 48)
Case $iCode >= 240 And $iCode <= 255
$VarUTFArr[$i] = Chr(209) & Chr($iCode - 112)
Case $iCode = 168
$VarUTFArr[$i] = Chr(208) & Chr(129)
Case $iCode = 184
$VarUTFArr[$i] = Chr(209) & Chr(145)
Case Else
$VarUTFArr[$i] = Chr($iCode)
EndSelect

$sResult &= $VarUTFArr[$i]
Next

Return $sResult
EndFunc

+ еще немного и можно сделать для работы в скрытом виде...

Vic_tory
09-04-2009, 16:07
Большое спасибо всем за ответы, скрипт работает.

но я так и не уяснила себе в чем было дело, хотелось бы знать, что бы не делать ошибок в будущем.

amel27
10-04-2009, 10:13
Vic_tory, поймите правильно - иногда проще и быстрее переписать, чем искать ошибку :)
обсуждалось неоднократно - посмотрите к примеру ТУТ (http://forum.oszone.net/showthread.php?p=807434#post807434), ТУТ (http://forum.oszone.net/showthread.php?p=1048034) и ТУТ (http://forum.oszone.net/showthread.php?p=973720#post973720)

Vic_tory
10-04-2009, 10:36
Спасибо, посмотрю :)

o_romka
26-01-2010, 18:33
Заменил для себя в вашем скрипте данные. Все работает, СПАСИБО!!!

Хотел бы просить у Вас помощи, как сделать чтобы создаваемый ярлык автоматом попадал на стол. (Нужно установить галочку в конце - Создать Ярлык и копировать на рабочий стол).
И как в созданном ярлыке вернее в его свойствах в закладке Безопасность убрать галочку Требуется шифрование данных (Иначе отключается))

Заранее спасибо.

o_romka
27-01-2010, 11:55
С созданием ярлыка на рабочий стол разобрался.


Помогите мне плиззз убрать галочку _ Требуется шифрование данных в созданном ярлыке в его свойствах.

o_romka
18-02-2010, 17:02
эх... неужели это не возможно сделать????

penguen
11-03-2010, 16:17
Заменил для себя в вашем скрипте данные. Все работает, СПАСИБО!!!
Хотел бы просить у Вас помощи, как сделать чтобы создаваемый ярлык автоматом попадал на стол. (Нужно установить галочку в конце - Создать Ярлык и копировать на рабочий стол).
И как в созданном ярлыке вернее в его свойствах в закладке Безопасность убрать галочку Требуется шифрование данных (Иначе отключается))
Заранее спасибо. »

Можете рассказать как сделали, чтобы ярлык создавался на раб. столе?

o_romka
12-03-2010, 07:47
#region: - Options
Opt('MustDeclareVars', 0)
Opt('TrayIconDebug', 0)
Opt('TrayIconHide', 0)
Opt('WinDetectHiddenText', 0)
#endregion

HotKeySet('{ESC}', '_Pro_Exit')

Local $iPid = Run('rundll32.exe netshell.dll,StartNCW')
Local $sRasPhoneFilePath = @AppDataCommonDir & '\Microsoft\Network\Connections\Pbk\rasphone.pbk'
Local $sRasPhoneFileText = FileRead($sRasPhoneFilePath)
Local $iHwd, $sText
Local $sTitle = 'Мастер новых подключений'
Local $sConnectName = 'HOME WORLD'
Local $sConnectIP = '10.10.10.10'
Local $fAddShortcutOnDesktop = 1

While 1
$iHwd = _ProcessGetWindow($iPid)
If BitAnd(WinGetState($iHwd), 2) Then ExitLoop
WEnd

While 1
$sText = WinGetText($iHwd)

Select
Case StringInStr($sText,'Этот мастер поможет:')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')

Case StringInStr($sText,'Подключить к рабочей сети (используя удаленный доступ или VPN), чтобы можно было работать из дома, удаленного офиса или другого места.')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:6]')

Case StringInStr($sText,'&Подключение к виртуальной частной сети')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:8]')

Case StringInStr($sText,'Введите в следующем поле имя для этого подключения.')
While 1
If StringInStr($sRasPhoneFileText, '[' & _StringToUTF($sConnectName) & ']') OR $sConnectName == '' Then
$sConnectName = InputBox('Внимание', 'Подключение с иминем "' & $sConnectName & '" уже существует' & @CRLF & @CRLF & _
'Введите другое название для подключения:', '', '', 300, 150, -1, -1)
Else
ExitLoop
EndIf
WEnd
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sConnectName)
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:8]')

Case StringInStr($sText,'Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:1]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:10]')

Case StringInStr($sText,'Введите имя узла или IP-адрес компьютера, к которому осуществляется подключение.')
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sConnectIP)
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:10]')

Case StringInStr($sText,'Успешно завершено создание следующего подключения:')
If $fAddShortcutOnDesktop Then ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:1]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:21]')
ExitLoop
EndSelect
Sleep('10')
WEnd

Func _Pro_Exit()
Exit
EndFunc

Func _ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc

Func _StringToUTF($String)
Local $sResult = "", $iCode
Local $VarUTFArr = StringSplit($String, "")

For $i = 1 To $VarUTFArr[0]
$iCode = Asc($VarUTFArr[$i])

Select
Case $iCode >= 192 And $iCode <= 239
$VarUTFArr[$i] = Chr(208) & Chr($iCode - 48)
Case $iCode >= 240 And $iCode <= 255
$VarUTFArr[$i] = Chr(209) & Chr($iCode - 112)
Case $iCode = 168
$VarUTFArr[$i] = Chr(208) & Chr(129)
Case $iCode = 184
$VarUTFArr[$i] = Chr(209) & Chr(145)
Case Else
$VarUTFArr[$i] = Chr($iCode)
EndSelect

$sResult &= $VarUTFArr[$i]
Next

Return $sResult
EndFunc



Уменя все получилось именно так, но не как не могу сделать чтобы в свойствах соединения убиралась галочка шифрования!!!! А без нее этот код не сильно выручает!!!! Если кто знает помагите .

o_romka
28-10-2010, 17:22
Вот окончательный Код необходимый мне:


#region: - Options
Opt('MustDeclareVars', 0)
Opt('TrayIconDebug', 0)
Opt('TrayIconHide', 0)
Opt('WinDetectHiddenText', 0)
#endregion

HotKeySet('{ESC}', '_Pro_Exit')

Local $iPid = Run('rundll32.exe netshell.dll,StartNCW')
Local $sRasPhoneFilePath = @AppDataCommonDir & '\Microsoft\Network\Connections\Pbk\rasphone.pbk'
Local $sRasPhoneFileText = FileRead($sRasPhoneFilePath)
Local $iHwd, $sText
Local $sTitle = 'Мастер новых подключений'
Local $sConnectName = 'HOME WORLD'
Local $sConnectIP = '10.10.10.10'
Local $fAddShortcutOnDesktop = 1

While 1
$iHwd = _ProcessGetWindow($iPid)
If BitAnd(WinGetState($iHwd), 2) Then ExitLoop
WEnd

While 1
$sText = WinGetText($iHwd)

Select
Case StringInStr($sText,'Этот мастер поможет:')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')

Case StringInStr($sText,'Подключить к рабочей сети (используя удаленный доступ или VPN), чтобы можно было работать из дома, удаленного офиса или другого места.')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:6]')

Case StringInStr($sText,'&Подключение к виртуальной частной сети')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:2]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:8]')

Case StringInStr($sText,'Введите в следующем поле имя для этого подключения.')
While 1
If StringInStr($sRasPhoneFileText, '[' & _StringToUTF($sConnectName) & ']') OR $sConnectName == '' Then
$sConnectName = InputBox('Внимание', 'Подключение с иминем "' & $sConnectName & '" уже существует' & @CRLF & @CRLF & _
'Введите другое название для подключения:', '', '', 300, 150, -1, -1)
Else
ExitLoop
EndIf
WEnd
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sConnectName)
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:8]')

Case StringInStr($sText,'Выберите, надо ли автоматически подключаться к Интернету или иной общей сети перед установлением виртуального подключения.')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:1]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:10]')

Case StringInStr($sText,'Введите имя узла или IP-адрес компьютера, к которому осуществляется подключение.')
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sConnectIP)
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:10]')

Case StringInStr($sText,'Успешно завершено создание следующего подключения:')
If $fAddShortcutOnDesktop Then ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:1]')
ControlClick($iHwd, '', '[CLASS:Button; INSTANCE:21]')
ExitLoop
EndSelect
Sleep('10')
WEnd

Func _Pro_Exit()
Exit
EndFunc

Func _ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc

Func _StringToUTF($String)
Local $sResult = "", $iCode
Local $VarUTFArr = StringSplit($String, "")

For $i = 1 To $VarUTFArr[0]
$iCode = Asc($VarUTFArr[$i])

Select
Case $iCode >= 192 And $iCode <= 239
$VarUTFArr[$i] = Chr(208) & Chr($iCode - 48)
Case $iCode >= 240 And $iCode <= 255
$VarUTFArr[$i] = Chr(209) & Chr($iCode - 112)
Case $iCode = 168
$VarUTFArr[$i] = Chr(208) & Chr(129)
Case $iCode = 184
$VarUTFArr[$i] = Chr(209) & Chr(145)
Case Else
$VarUTFArr[$i] = Chr($iCode)
EndSelect

$sResult &= $VarUTFArr[$i]
Next

Return $sResult
EndFunc
$sNameConnect = "HOME WORLD"
$speed = 500
ShellExecute("rasphone.exe", "", @SystemDir)
WinWaitActive("Сетевые подключения")
ControlClick("Сетевые подключения", "", "[CLASS:Button; INSTANCE:4]")
WinWaitActive($sNameConnect & " Свойства")
Sleep($speed)
Send("^{TAB}")
Sleep($speed)
Send("^{TAB}")
Sleep($speed)
ControlClick($sNameConnect & " Свойства", "", "[CLASS:Button; INSTANCE:5]")
Sleep($speed)
Send("{ENTER}")
WinWaitActive("Сетевые подключения")
ControlClick("Сетевые подключения", "", "[CLASS:Button; INSTANCE:2]")
Exit




ТЕПЕРЬ ВОПРОС КАК ТО ЖЕ САМОЕ СДЕЛАТЬ ПОД WINDOWS 7

tigrenokmosya
13-03-2011, 01:35
Интересно, а в данной теме обсуждается только создание VPN с помощью Autoit?
Есть же более простые варианты, например все это дело реализовать с помощью Delphi, что я и сделал.
Много времени потратил на форумах, и наконец, пришел к тому, что пришлось создать проект самому, которым сейчас успешно пользуются многие.
Если хотите, то можете посмотреть на сайте http://tigrenokmosya.narod.ru

Delirium
13-03-2011, 14:19
tigrenokmosya, вместо рекламы своей страницы лучше бы опубликовал свою программу на soft.oszone.net. Так её увидят гораздо больше людей.

o_romka
14-03-2011, 08:00
Его программа работает и на его сайте есть всё что нужно в том числе и исходники с описанием. Так что это даже не реклама, а помощь.




© OSzone.net 2001-2012