我的一个软件需要在Windows上更改系统代理。更改HTTP代理用于路由器后面的LAN连接很容易,但我找不到有关如何更改拨号代理或直接DSL(即PPPoE)连接的任何信息。
这很糟糕,因为我的很大一部分客户都在中国。在中国,很多人没有多台电脑,因而发现路由器浪费。他们只需将ADSL调制解调器连接到以太网端口并使用PPPoE。是的,这对于安全性和一切都很糟糕(僵尸网络在中国如此自由地漫游的一个原因)但这是现实,我的软件需要工作。
我还需要能够提供所有网络连接列表的代码。只需拥有my related question中需要知道要编辑的连接的代码不就可以了。
我也更喜欢使用reg
命令工作的东西。使用Windows API的简单C ++或C#代码也很有用,但请注意我使用的是Racket,这是一种相当麻烦的FFI语言,这意味着最好尽量减少使用Windows C API。
答案 0 :(得分:6)
假设您无法使用Windows本机API调用,我将提供一个只需要调用Windows命令(reg
)和数组/字符串操作的解决方案,这就是“Racket” “语言肯定必须实施。
这不是最干净的方式,但考虑到要求它应该是一个可行的解决方案。
好吧,正如您可能已经注意到的那样,不同连接的代理配置存储在密钥下:HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections
在该键下有一个值存储DefaultConnectionSettings,另一个值存储SavedLegacySettings(均为REG_BINARY类型)。除了提到的两个值之外,每个系统连接(也是REG_BINARY类型)都有一个值,用于存储连接配置,包括代理设置。值的名称等于连接名称。
幸运的是,有些人反向设计了存储在这些值中的BINARY数据的结构。
- 字节数零总是有一个3C或46 - 我找不到关于该字节的更多信息。接下来的三个字节是零。
- 字节编号4是“Internet选项”属性表(Internet Explorer - >工具 - > Internet选项...)使用的计数器。当你手动 更改Internet设置(例如Connections中的LAN设置) tab),这个计数器递增。它不是非常有用的字节。但它必须 有价值。我总是保持零。接下来的三个字节是零 (字节5到7)。
- 字节数8可根据您的设置采用不同的值。价值是:
- 09仅启用“自动检测设置”
- 03仅启用“为LAN使用代理服务器”
启用两者时- 0B
- 05仅启用“使用自动配置脚本”时
- 0D启用“自动检测设置”和“使用自动配置脚本”
- 07启用“为LAN使用代理服务器”和“使用自动配置脚本”时
当所有三个都启用时,- 0F。
- 01,但没有启用它们。接下来的三个字节是零(字节9到B)。
- 字节数C(十进制12)包含代理服务器地址的长度。例如,代理服务器'127.0.0.1:80'的长度为12 (长度包括点和冒号)。接下来的三个字节是 零(字节D到F)。
- 字节10(或十进制的16)包含代理服务器地址 - 如'127.0.0.1:80'(其中80显然是端口号)
- 地址后的字节immediatley包含附加信息的长度。接下来的三个字节是零。例如,如果 勾选“为本地地址绕过代理服务器”,然后选中此项 byte是07,接下来的三个字节是零,然后是一个字符串,即 ''(表示您绕过代理 server.Now由于有7个字符,长度为07!)。您 将不得不亲自试验以找到更多相关信息。如果 你没有任何额外的信息,那么长度是0,没有 信息被添加。
- 紧跟在附加信息之后的字节是自动配置脚本地址的长度(如果您没有脚本 地址然后你不需要添加任何东西,跳过这一步并转到 步骤8)。接下来的三个字节是零,然后是地址。
- 最后,附加了32个零。(我不知道为什么!大概是为了填充二进制blob,也许它预计会有一定的长度 什么,你不希望Windows有一些来源?)
醇>
可以找到完整信息here。
使用此信息,我认为您可以设法获取值。只需执行reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"
,正确解析输出并再次使用reg来回写修改。
我希望这会有所帮助。
答案 1 :(得分:0)
您可以使用此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");