Настройка параметров прокси с помощью wininet

У меня проблемы с установкой имени пользователя и пароля прокси-сервера с помощью 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();

person Jeanre Swanepoel    schedule 13.08.2010    source источник


Ответы (1)


Для параметров имени пользователя и пароля прокси-сервера требуется действительный дескриптор hInternet из вызова InternetOpen, чего мне не удалось извлечь из элемента управления веб-браузера.

В конечном итоге мне пришлось перехватить сообщение win32 WM_INITDIALOG, проходящее через объекты дочернего окна, пока я не нашел элементы имени пользователя, пароля и ok, автоматически заполнить предоставленными учетными данными и затем отправить.

Очень хакерский, но он работает. Мне не удалось заставить функцию IAuthenticate.Authenticate выполняться для этого конкретного запроса учетных данных прокси-сервера, похоже, это вызывается только для основных запросов проверки подлинности Windows.

См. их для справки:

Установить учетные данные прокси-сервера в элементе управления веб-браузером

Как установить прокси для управления веб-браузером, не влияя на прокси SYSTEM/IE

person Marcus Pope    schedule 16.12.2010