Одна из моих программ должна менять системные прокси в Windows. Смена HTTP прокси для сетевых подключений за роутером это просто, но я не могу найти никакой информации о том, как изменить прокси для коммутируемого или прямого подключения DSL (т.е. PPPoE).
Это плохо, потому что значительная часть моих клиентов находится в Китае. В Китае многие люди не имеют более одного компьютера, и поэтому считают маршрутизатор расточительным. Они просто подключают свой ADSL-модем к своему Ethernet-порту и используют PPPoE. Да, это плохо для безопасности и всего остального (одна из причин, по которой ботнеты так свободно перемещаются в Китае), но это реальность, и мое программное обеспечение должно работать.
Мне также нужен код, который дает мне список всех сетевых подключений. Просто с кодом как в мой связанный вопрос что требуется знать, что соединение для редактирования будет не Работа.
Я также предпочитаю что-то, что будет работать с помощью reg
команда. Простой код C ++ или C # с использованием Windows API также полезен, но учтите, что я использую Racket, язык с довольно громоздким FFI, что означает, что было бы лучше минимизировать использование Windows C API.
Предполагая, что вы не можете использовать собственные вызовы API Windows, я внесу свой вклад, предложив решение, которое потребует только вызовов команд Windows (reg
) и манипулирование массивами / строками, то, что язык Racket должен реализовать наверняка.
Это не самый чистый способ, но, учитывая требования, он должен быть выполнимым решением для вас.
Ну, как вы, наверное, заметили, конфигурация прокси для разных соединений хранится под ключом: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections
Под этим ключом есть значение, в котором хранятся DefaultConnectionSettings, и другое значение, в котором хранятся SavedLegacySettings (оба типа REG_BINARY). В дополнение к двум упомянутым значениям для каждого системного соединения есть значение (также типа REG_BINARY), в котором хранится конфигурация соединения, включая настройки прокси-сервера. Имя значений равно именам соединений.
К счастью, некоторые разработчики обратили внимание на структуру данных BINARY, хранящихся в этих значениях.
- Байт номер ноль всегда имеет 3C или 46 — я не мог найти больше информации об этом байте. Следующие три байта — нули.
- Байт номер 4 — это счетчик, используемый в листе свойств «Свойства обозревателя» (Internet Explorer-> Сервис-> Свойства обозревателя …). Как вы вручную
изменить настройки Интернета (например, настройки локальной сети в подключениях
tab), этот счетчик увеличивается. Это не очень полезный байт. Но он ДОЛЖЕН
иметь значение. Я всегда держу это ноль. Следующие три байта являются нулями
(Байты с 5 по 7).- Байт номер 8 может принимать различные значения в соответствии с вашими настройками. Значение:
- 09, когда включено «Автоматическое определение настроек»
- 03, когда включен «Использовать прокси-сервер для вашей локальной сети»
- 0B, когда оба включены
- 05, когда включен только «Использовать скрипт автоматической настройки»
- 0D, когда включены «Автоматически определять настройки» и «Использовать скрипт автоматической настройки»
- 07, когда включены «Использовать прокси-сервер для вашей локальной сети» и «Использовать скрипт автоматической настройки»
- 0F, когда все три включены.
- 01, когда ни один из них не включен. Следующие три байта являются нулями (байты с 9 по B).
- Байт C (12 в десятичном виде) содержит длину адреса прокси-сервера. Например, прокси-сервер «127.0.0.1:80» имеет длину 12
(длина включает точки и двоеточие). Следующие три байта
нули (байты от D до F).- Байт 10 (или 16 в десятичном виде) содержит адрес прокси-сервера — например, «127.0.0.1:80» (где 80, очевидно, является номером порта)
- Байт сразу после адреса содержит длину дополнительной информации. Следующие три байта являются нулями. Например, если
флажок «Обойти прокси-сервер для локальных адресов», то это
байт — 07, следующие три байта — нули, и затем идет строка, т.е.
» (указывает, что вы обходите прокси
server.Now так как имеет 7 символов, длина 07!). Вы
придется экспериментировать самостоятельно, чтобы узнать больше об этом. Если
у вас нет никакой дополнительной информации, тогда длина равна 0 и нет
Информация добавлена.- Байт сразу после дополнительной информации — это длина адреса скрипта автоматической настройки (если у вас нет скрипта
адрес, то вам не нужно ничего добавлять, пропустите этот шаг и перейдите
Шаг 8). Следующие три байта являются нулями, затем идет адрес.- Наконец, добавляются 32 нуля. (Я не знаю почему! Предположительно, чтобы заполнить двоичный двоичный объект, возможно, он будет иметь определенную длину
что-то, разве вы не хотите, чтобы у окон был какой-то источник?)
Полная информация может быть найдена Вот.
С этой информацией я думаю, что вы можете получить значения в. Просто сделайте reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"
, правильно проанализируйте вывод и снова используйте reg, чтобы записать изменения.
Надеюсь, это поможет.
Вы можете использовать этот код C # для изменения прокси-сервера для VPN-подключений:
// host looks like "127.0.0.1:8080"public static void EnableVPNProxy(string host)
{
RegistryKey RegKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections", true);
foreach (var name in RegKey.GetValueNames())
{
try
{
byte[] server = Encoding.ASCII.GetBytes(host);
byte[] current = (byte[])RegKey.GetValue(name);
byte[] data = new byte[100];
data[0] = current[0];
data[1] = data[2] = data[3] = data[4] = data[5] = data[6] = data[7] = 0;
data[8] = 3;
data[9] = data[10] = data[11] = 0;
data[12] = Convert.ToByte(server.Length);
data[13] = data[14] = data[15] = 0;
int i = 16;
foreach (var b in server)
{
data[i] = b;
i++;
}
for (var x = 0; x < 40; x++)
{
data[i] = 0;
i++;
}
RegKey.SetValue(name, data);
}
catch (Exception ex) { }
}
}
И включить прокси
EnableVPNProxy("127.0.0.1:8080");