如何告诉WinINet使用IE的代理服务器凭证

问题描述:

在Internet Explorer中我可以设置代理服务器。然后,当访问互联网IE浏览器会提示我输入代理凭证并选择保存。 IE的新实例提取证书。如何告诉WinINet使用IE的代理服务器凭证

我还可以看到凭证作为通用凭证保存在凭证管理器中。该名称遵循命名约定,如Microsoft_WinInet_ [proxyserver:port]/[proxyserver.acme.com]。

我的应用程序使用WinINet。我们目前正在通过INTERNET_OPTION_PROXY_USERNAME和INTERNET_OPTION_PROXY_PASSWORD通过InternetSetOption设置证书。

但相反,我想告诉WinINet使用当前用户的IE(或凭证管理器)凭证。

拥有的WinINet使用凭证管理凭证的方式是使用InternetErrorDlg函数,就像这样:

retry: 
    BOOL fRet = ::HttpSendRequest(hRequest, NULL, 0, NULL, 0); 
    DWORD dwError = ::GetLastError(); 
    DWORD statusCode(0); 
    DWORD statusLen = sizeof(DWORD); 
    DWORD headerIndex = 0; 
    ::HttpQueryInfo(hRequest, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, 
        &statusCode, &statusLen, &headerIndex); 

    if (statusCode == HTTP_STATUS_PROXY_AUTH_REQ) 
    { 
    DWORD dwFlags = FLAGS_ERROR_UI_FILTER_FOR_ERRORS | 
        FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | 
        FLAGS_ERROR_UI_FLAGS_GENERATE_DATA; 
    DWORD res =::InternetErrorDlg(GetDesktopWindow(), hRequest, 
            ERROR_INTERNET_INCORRECT_PASSWORD, dwFlags, NULL); 
    if (res == ERROR_INTERNET_FORCE_RETRY) 
     goto retry; 
    else 
     return false; 
    } 

InternetErrorDlg显示将返回ERROR_INTERNET_FORCE_RETRY如果成功地获得凭据(从CM或通过提示用户) 。

可以使用FLAGS_ERROR_UI_FLAGS_NO_UI标志(以上未使用)来避免显示提示用户输入凭据的对话框。

胡里奥

初始化与IE预定义代理参数使用WinInet函数这样

HINTERNET hOpen = NULL; 

hOpen = InternetOpen(L"XXX", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 

...