Да, мы до сих пор используем Microsoft ISA Server 2006
! Не, ну а что, работает себе на неком древнем железе и жрать не требует. Естественно, у всех на компьютерах и ноутбуках установлен Клиент межсетевого экрана Microsoft
и ни у кого с ним не возникает проблем, кроме, как у меня! Я такой единственный. Админ. Ну.
А проблема следующая – у меня корпоративный ноутбук, который я использую и на работе и дома. Дома же для удобства работы на одном из Микротиков поднято постоянное VPN соединение с офисом – из дома я работаю значительно чаще, чем из офиса.
Естественно, к туннелю прикручен условный проброс DNS до серверов компании, чтобы можно было использовать имена компьютеров, вместо IP-адресов.
А вот тут-то и кроется засада! – файрвол-клиент дотягивается до своего DNS, определяет имя ISA Server'а и заворачивает весь трафик туда. Но ISA не признает меня из туннеля и не пускает в Интернет! Все! Ну, добавим к этому то, что еще и скорость дома выше в 5 - 10 раз. Получается вообще не то.
Очень долго я вручную переключал настройки перемещаясь из одной локации в другую – в офисе все включаем, дома выключаем1). Надоело, слов нет!
Несколько раз пытался гуглить какую-нибудь программу для переключения настроек… но так и не нашел! Все завалено проксями для анонимизации и прочей ерундой. Прямо маразм какой-то! Несколько же раз в итоге отчаивался… но сегодня руки таки дошли исправить на корню это безобразие! Ну и незамедлительно делюсь этим с общественностью.
В результате развития скрипта, он вырос с полностью ручного, где нужно было участие пользователя, через полуавтоматический, где скрипт уже сам что-то решал, до полностью автоматического, когда скрипт сам решает, что включать в конкретной ситуации.
Т.к. на Visual Basic
я никогда ничего не писал, чуток погуглив, за основу взял этот скрипт2) и немного его доработал.
Изначальный, более близкий к оригинальному скрипту, вариант с выводом диалогового окна.
Чтобы в сообщениях можно было использовать кириллицу, необходимо сохранить файл в кодировке ANSI
или UTF-16 LE
.
Option Explicit Dim valUserIn, objShell, RegLocate Set objShell = WScript.CreateObject("WScript.Shell") On Error Resume Next valUserIn = MsgBox("Добавить настройки прокси-сервера" & vbCrLf & "и включить клиент межсетевого экрана?",vbYesNo+vbQuestion+262144,"Переключение настроек прокси") If valUserIn=vbYes Then ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" ' objShell.RegWrite RegLocate,"1","REG_DWORD" ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" ' objShell.RegWrite RegLocate,"http://isa-server.company.int:3128/array.dll?Get.Routing.Script","REG_SZ" ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" ' objShell.RegWrite RegLocate,"1","REG_DWORD" objShell.Run "FwcTool.exe enable",0,true MsgBox "Вы работаете через прокси-сервер!",vbOKOnly+vbInformation+262144,"Готово!" else objShell.Run "FwcTool.exe disable",0,true RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" objShell.RegWrite RegLocate,"0","REG_DWORD" RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" objShell.RegDelete RegLocate RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" objShell.RegWrite RegLocate,"0","REG_DWORD" MsgBox "Вы работаете напрямую!",vbOKOnly+vbInformation+262144,"Готово!" End If WScript.Quit
Что-то делаем, сам не полностью понимаю, что и зачем. Гуглить лень, да, не в этот раз.
Option Explicit Dim valUserIn, objShell, RegLocate Set objShell = WScript.CreateObject("WScript.Shell")
Обработка ошибок нужна обязательно, без ее, к примеру, RegDelete
может ругаться на отсутствие ключа и раньше времени завершать выполнение скрипта.
On Error Resume Next
Окно выбора действия.
valUserIn = MsgBox("Добавить настройки прокси-сервера" & vbCrLf & "и включить клиент межсетевого экрана?",vbYesNo+vbQuestion+262144,"Переключение настроек прокси")
Т.к. в настройках клиента стоит Включить автоматическую настройку веб-обозревателя
, ничего добавлять в реестр не надо, только включаем сам клиент и говорим, что все готово.
If valUserIn=vbYes Then ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" ' objShell.RegWrite RegLocate,"1","REG_DWORD" ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" ' objShell.RegWrite RegLocate,"http://isa-server.company.int:3128/array.dll?Get.Routing.Script","REG_SZ" ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" ' objShell.RegWrite RegLocate,"1","REG_DWORD" objShell.Run "FwcTool.exe enable",0,true MsgBox "Вы работаете через прокси-сервер!",vbOKOnly+vbInformation+262144,"Готово!"
А вот при выключении клиента, нужно обязательно почистить реестр. В остальном все так же.
else objShell.Run "FwcTool.exe disable",0,true RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" objShell.RegWrite RegLocate,"0","REG_DWORD" RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" objShell.RegDelete RegLocate RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" objShell.RegWrite RegLocate,"0","REG_DWORD" MsgBox "Вы работаете напрямую!",vbOKOnly+vbInformation+262144,"Готово!" End If WScript.Quit
Выпив перед сном немного вина, я тут подумал – а зачем нам это окошко лишнее?! Если я запустил скрипт, то я хочу от него только того, чтобы он пустил меня в Интернет! А вот вступать с ним в диалог я совершенно не хочу!
Чтобы в сообщениях можно было использовать кириллицу, необходимо сохранить файл в кодировке ANSI
или UTF-16 LE
.
Option Explicit Dim objShell, RegLocate Set objShell = WScript.CreateObject("WScript.Shell") On Error Resume Next objShell.RegRead "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" If Err.Number <> 0 Then ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" ' objShell.RegWrite RegLocate,"1","REG_DWORD" ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" ' objShell.RegWrite RegLocate,"http://isa-server.company.int:3128/array.dll?Get.Routing.Script","REG_SZ" ' RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" ' objShell.RegWrite RegLocate,"1","REG_DWORD" objShell.Run "FwcTool.exe enable",0,true MsgBox "Вы работаете через прокси-сервер!",vbOKOnly+vbInformation+262144,"Готово!" else objShell.Run "FwcTool.exe disable",0,true RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" objShell.RegWrite RegLocate,"0","REG_DWORD" RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" objShell.RegDelete RegLocate RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" objShell.RegWrite RegLocate,"0","REG_DWORD" MsgBox "Вы работаете напрямую!",vbOKOnly+vbInformation+262144,"Готово!" End If WScript.Quit
Все тоже самое, за исключением логики. Если раньше, логика полагалась на наш ответ в MsgBox
, то теперь скрипт пытается прочесть значение в реестре и, в зависимости от результата, делает то или иное действие.
... objShell.RegRead "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" If Err.Number <> 0 Then ...
Несколько дней ходил, не давала мне покоя, эта мануальщина чертова! Ну почему я должен не забывать что-то и где-то нажать, чтобы у меня появился Интернет!
В итоге родился полностью автоматический скрипт, который смотрит, где вы находитесь и сам делает, что нужно. Для его работы обязательно нужны дополнительные настройки и манипуляции, о которых рассказано ниже, в соответствующих разделах - Пояснения к коду и Запуск скрипта
Option Explicit Dim WLANmac, workDHCP, objLocator, objWMIService, HostNameSet, objitem, Str, objShell, RegLocate WLANmac = "XX:XX:XX:XX:XX:XX" workDHCP = "xxx.xxx.xxx.xxx" Set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objLocator.ConnectServer(".", "root\cimv2") Set objShell = WScript.CreateObject("WScript.Shell") On Error Resume Next Set HostNameSet = objWMIService.ExecQuery("Select DHCPServer From Win32_NetworkAdapterConfiguration WHERE MACAddress = '" & WLANmac & "'") For Each objitem in HostNameSet Str = objitem.DHCPServer Next If Str = workDHCP Then objShell.Run "FwcTool.exe enable",0,true Else objShell.Run "FwcTool.exe disable",0,true RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" objShell.RegWrite RegLocate,"0","REG_DWORD" RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" objShell.RegDelete RegLocate RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" objShell.RegWrite RegLocate,"0","REG_DWORD" End if WScript.Quit
Инициализируем переменные.
Option Explicit Dim WLANmac, workDHCP, objLocator, objWMIService, HostNameSet, objitem, Str, objShell, RegLocate
Вот тут надо ввести MAC-адрес Wi-Fi
карты, через которую происходит подключение к обоим сетям, и IP-адрес DHCP-сервера той сети, где трафик идет через прокси-сервер3).
WLANmac = "XX:XX:XX:XX:XX:XX" workDHCP = "xxx.xxx.xxx.xxx"
Тут ничего интересного не происходит.
Set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objLocator.ConnectServer(".", "root\cimv2") Set objShell = WScript.CreateObject("WScript.Shell") On Error Resume Next
А это самая интересная часть – вытаскиваем через запрос к WMI адрес текущего DHCP-сервера.
Set HostNameSet = objWMIService.ExecQuery("Select DHCPServer From Win32_NetworkAdapterConfiguration WHERE MACAddress = '" & WLANmac & "'") For Each objitem in HostNameSet Str = objitem.DHCPServer Next
И, в зависимости от того, совпадает искомое с заданным, применяем те или иные настройки.
If Str = workDHCP Then objShell.Run "FwcTool.exe enable",0,true Else objShell.Run "FwcTool.exe disable",0,true RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoDetect" objShell.RegWrite RegLocate,"0","REG_DWORD" RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL" objShell.RegDelete RegLocate RegLocate = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable" objShell.RegWrite RegLocate,"0","REG_DWORD" End if WScript.Quit
Скрипт необходимо положить в директорию с файлом FwcTool.exe
4), который обычно лежит в %ProgramFiles(x86)%\Microsoft Firewall Client 2004
. А можно наоборот, перенести файл FwcTool.exe
в каталог со скриптом. Я выбрал первый вариант.
Для удобства можно закрепить его в меню Пуск
в виде красивой плитки. Для этого надо:
%WinDir%/System32
файл wscript.exe
и закрепить его в меню Пуск
;%AppData%\Microsoft\Windows\Start Menu\Programs
и зайти в его свойства;Объект
в конце дописать "%ProgramFiles(x86)%\Microsoft Firewall Client 2004\switcher-v1.vbs"
5);Рабочая папка
на "%ProgramFiles(x86)%\Microsoft Firewall Client 2004"
;Для правильного функционирования третьего варианта скрипта, нужно добавить задание, запускающее скрипт при каждой авторизации пользователя и при каждом разблокировании компьютера.
Для простоты7) и удобства, вот XML сценарий:
<?xml version="1.0" encoding="UTF-16"?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <Triggers> <SessionStateChangeTrigger> <Enabled>true</Enabled> <StateChange>SessionUnlock</StateChange> <Delay>PT10S</Delay> </SessionStateChangeTrigger> <LogonTrigger> <Enabled>true</Enabled> <Delay>PT1M</Delay> </LogonTrigger> </Triggers> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> <AllowHardTerminate>false</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>false</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>false</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>false</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>PT0S</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions Context="Author"> <Exec> <Command>%ProgramFiles(x86)%\Microsoft Firewall Client 2004\switcher-v3.vbs</Command> <WorkingDirectory>%ProgramFiles(x86)%\Microsoft Firewall Client 2004</WorkingDirectory> </Exec> </Actions> </Task>
И сценарий Windows8), копирующий VB-скрипт и добавляющий предыдущий XML в Планировщик заданий
:
@echo off @cd/d "%~dp0" copy switcher-v3.vbs "%ProgramFiles(x86)%\Microsoft Firewall Client 2004" /Y echo. schtasks /create /xml "schedule-switcher-v3.xml" /TN "Proxy Switch" /F echo. pause
Если при запуске сценария возвращается ошибка о неправильном синтаксисе XML-кода, надо открыть файл schedule-switcher-v3.xml
в программе Блокнот
и сохранить в кодировке UTF-16 LE
.
ipconfig /all
в помощь!%ProgramFiles(x86)%\Microsoft Firewall Client 2004
, тогда можно было класть скрипт куда угодно, но Run
его не видел ни в какую, а Exec
не может запускать приложение без вывода его на экран."%ProgramFiles(x86)%\Microsoft Firewall Client 2004\switcher-v2.vbs"
Планировщике заданий
Windows 10 20H2 (не знаю, как в других) есть неприятный баг – при добавлении задания вручную, путь до скрипта разбивается при персом же пробеле на две части – сам путь и аргументы. Манипуляции с кавычками не помогают. Естественно, в таком состоянии оно не запускается…
Обсуждение