使用 wininet 设置代理设置

Posted

技术标签:

【中文标题】使用 wininet 设置代理设置【英文标题】:Setting Proxy settings with wininet 【发布时间】:2010-08-13 12:29:15 【问题描述】:

我在使用 wininet 设置代理用户名和密码时遇到问题。

下面的代码设置了代理,但用户名和密码失败,错误代码“12018”

[DllImport("wininet.dll", SetLastError = true)]
    private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

private void RefreshIESettings(string strProxy,string proxyUsername,string proxyPassword) 

const int INTERNET_OPTION_PROXY = 38;
const int INTERNET_OPEN_TYPE_PROXY = 3;
const int INTERNET_OPTION_PROXY_USERNAME = 43;
const int INTERNET_OPTION_PROXY_PASSWORD = 44;

IntPtr username = Marshal.StringToHGlobalAnsi(proxyUsername);
IntPtr  password = Marshal.StringToHGlobalAnsi(proxyPassword);
INTERNET_PROXY_INFO struct_IPI;
struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;

struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");

IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));
Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));

Marshal.GetNativeVariantForObject(proxyUsername, username);
Marshal.GetNativeVariantForObject(proxyPassword, password);
bool resultF = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_USERNAME, username, proxyUsername.Length);
var errorF = Marshal.GetLastWin32Error();

//-- Set Proxy Password
bool resultG = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_PASSWORD, password, proxyPassword.Length + 1);
var errorG = Marshal.GetLastWin32Error();

【问题讨论】:

【参考方案1】:

代理用户名和密码选项需要来自 InternetOpen 调用的有效 hInternet 句柄,这是我无法从 Web 浏览器控件中提取的。

最终我不得不挂钩 win32 WM_INITDIALOG 消息遍历子窗口对象,直到找到用户名、密码和 ok 元素,使用提供的凭据自动填充,然后提交。

非常hackish,但它有效。我无法为这个特定的代理凭据请求执行 IAuthenticate.Authenticate 函数,似乎只为基本的 Windows 身份验证提示调用。

请参阅这些以供参考:

Set Proxy Credential in Web Browser Control

How to set a proxy for Webbrowser Control without effecting the SYSTEM/IE proxy

【讨论】:

以上是关于使用 wininet 设置代理设置的主要内容,如果未能解决你的问题,请参考以下文章

WinInet API 的代理服务器有啥特殊设置吗?

如何使用 wininet.dll 对代理进行身份验证?

使用 WinINET 为虚拟用户创建健壮的 HTTP 连接

调用使用 Java + JNA 的 WinInet 函数

WinInet::InternetSetOption(...) 总是返回 0 并且 GetLastError() 返回 12018

MFC + Wininet + 代理认证 = 问题