Инструменты пользователя

Инструменты сайта


windows:10:vbscript:mfc_switcher

Скрипт для переключения прокси-сервера

Да, мы до сих пор используем Microsoft ISA Server 2006! Не, ну а что, работает себе на неком древнем железе и жрать не требует. Естественно, у всех на компьютерах и ноутбуках установлен Клиент межсетевого экрана Microsoft и ни у кого с ним не возникает проблем, кроме, как у меня! Я такой единственный. Админ. Ну. 8-)

А проблема следующая – у меня корпоративный ноутбук, который я использую и на работе и дома. Дома же для удобства работы на одном из Микротиков поднято постоянное VPN соединение с офисом – из дома я работаю значительно чаще, чем из офиса.

Естественно, к туннелю прикручен условный проброс DNS до серверов компании, чтобы можно было использовать имена компьютеров, вместо IP-адресов.

А вот тут-то и кроется засада! – файрвол-клиент дотягивается до своего DNS, определяет имя ISA Server'а и заворачивает весь трафик туда. Но ISA не признает меня из туннеля и не пускает в Интернет! Все! Ну, добавим к этому то, что еще и скорость дома выше в 5 - 10 раз. Получается вообще не то. m(

Очень долго я вручную переключал настройки перемещаясь из одной локации в другую – в офисе все включаем, дома выключаем1). Надоело, слов нет!

Несколько раз пытался гуглить какую-нибудь программу для переключения настроек… но так и не нашел! Все завалено проксями для анонимизации и прочей ерундой. Прямо маразм какой-то! Несколько же раз в итоге отчаивался… но сегодня руки таки дошли исправить на корню это безобразие! Ну и незамедлительно делюсь этим с общественностью. ;-)

Преамбула

В результате развития скрипта, он вырос с полностью ручного, где нужно было участие пользователя, через полуавтоматический, где скрипт уже сам что-то решал, до полностью автоматического, когда скрипт сам решает, что включать в конкретной ситуации. 8-)

Код скрипта

Т.к. на Visual Basic я никогда ничего не писал, чуток погуглив, за основу взял этот скрипт2) и немного его доработал.

Вариант 1 – с диалоговым окном

Изначальный, более близкий к оригинальному скрипту, вариант с выводом диалогового окна.

Скриншоты

FIXME Чтобы в сообщениях можно было использовать кириллицу, необходимо сохранить файл в кодировке ANSI или UTF-16 LE.

switcher-v1.vbs
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

Вариант 2 – без диалогового окна

Выпив перед сном немного вина, я тут подумал – а зачем нам это окошко лишнее?! :-? Если я запустил скрипт, то я хочу от него только того, чтобы он пустил меня в Интернет! А вот вступать с ним в диалог я совершенно не хочу!

FIXME Чтобы в сообщениях можно было использовать кириллицу, необходимо сохранить файл в кодировке ANSI или UTF-16 LE.

switcher-v2.vbs
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
 
...

Вариант 3 – полностью автоматический

Несколько дней ходил, не давала мне покоя, эта мануальщина чертова! Ну почему я должен не забывать что-то и где-то нажать, чтобы у меня появился Интернет!

В итоге родился полностью автоматический скрипт, который смотрит, где вы находитесь и сам делает, что нужно. Для его работы обязательно нужны дополнительные настройки и манипуляции, о которых рассказано ниже, в соответствующих разделах - Пояснения к коду и Запуск скрипта

switcher-v3.vbs
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.exe4), который обычно лежит в %ProgramFiles(x86)%\Microsoft Firewall Client 2004. А можно наоборот, перенести файл FwcTool.exe в каталог со скриптом. Я выбрал первый вариант.

Для вариантов 1 и 2

Для удобства можно закрепить его в меню Пуск в виде красивой плитки. Для этого надо:

  1. найти в %WinDir%/System32 файл wscript.exe и закрепить его в меню Пуск;
  2. найти созданный ярлык в %AppData%\Microsoft\Windows\Start Menu\Programs и зайти в его свойства;
  3. в поле Объект в конце дописать "%ProgramFiles(x86)%\Microsoft Firewall Client 2004\switcher-v1.vbs"5);
  4. и изменить поле Рабочая папка на "%ProgramFiles(x86)%\Microsoft Firewall Client 2004";
  5. последним действием можно поменять иконку, я сперва поставил такую же, как у клиента, а потом сделал плитку6).

Для третьего варианта

Для правильного функционирования третьего варианта скрипта, нужно добавить задание, запускающее скрипт при каждой авторизации пользователя и при каждом разблокировании компьютера.

Для простоты7) и удобства, вот XML сценарий:

schedule-switcher-v3.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 в Планировщик заданий:

schedule-it.cmd
@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

FIXME Если при запуске сценария возвращается ошибка о неправильном синтаксисе XML-кода, надо открыть файл schedule-switcher-v3.xml в программе Блокнот и сохранить в кодировке UTF-16 LE.


Дисклеймер

  • Использование материалов данной базы знаний разрешено на условиях лицензии, указанной внизу каждой страницы! При использовании материалов активная гиперссылка на соответствующую страницу данной базы знаний обязательна!
  • Автор не несет и не может нести какую либо ответственность за последствия использования материалов, размещенных в данной базе знаний. Все материалы предоставляются по принципу «как есть». Используйте их исключительно на свой страх и риск.
  • Все высказывания, мысли или идеи автора, размещенные в материалах данной базе знаний, являются исключительно его личным субъективным мнением и могут не совпадать с мнением читателей!
  • При размещении ссылок в данной базе знаний на интернет-страницы третьих лиц автор не несет ответственности за их техническую функциональность (особенно отсутствие вирусов) и содержание! При обнаружении таких ссылок, можно и желательно сообщить о них в комментариях к соответствующей статье.
1)
А это даже дольше, чем включить, т.к. помимо переключения в интерфейсе клиента галочки, нужно еще запустить Internet Explorer, Edge или зайти в настройки системы и вручную выключить настройки прокси!
2)
За что автору огромная благодарность и уважение!
3)
ipconfig /all в помощь!
4)
Я пытался использовать полный путь до %ProgramFiles(x86)%\Microsoft Firewall Client 2004, тогда можно было класть скрипт куда угодно, но Run его не видел ни в какую, а Exec не может запускать приложение без вывода его на экран.
5)
Или "%ProgramFiles(x86)%\Microsoft Firewall Client 2004\switcher-v2.vbs"
6)
Делается это программой TileIconifier в два клика. Я выбрал такую иконку .
7)
Оказалось, что в Планировщике заданий Windows 10 20H2 (не знаю, как в других) есть неприятный баг – при добавлении задания вручную, путь до скрипта разбивается при персом же пробеле на две части – сам путь и аргументы. Манипуляции с кавычками не помогают. Естественно, в таком состоянии оно не запускается…
8)
Запускать нужно с правами администратора.

Обсуждение

Ваш комментарий:
U M᠎ L L E E᠎ K​ S L Q E K᠎ J B O M
 
Последнее изменение: 2022/02/12 11:40 (внешнее изменение)