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

How to tell WinINet to use IE's proxy server credentials

本文关键字:代理服务器 IE 何告诉 WinINet 使用      更新时间:2023-10-16

在internet explorer中,我可以设置代理服务器。然后,当访问互联网时,IE会提示我输入代理凭据,并可选择保存它们。IE的新实例会获取凭据。

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

我的应用程序使用WinINet。我们目前正在通过InternetSetOption使用INTERNET_OPTION_PROXY_USERNAME和INTERNET _OPTIONPROXY_PASSWORD设置凭据。

但我想告诉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成功获取凭据(从CM或通过提示用户),它将返回ERROR_INTERNET_FORCE_RETRY。

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

Julio

初始化WinINet函数的使用,该函数具有来自类似的IE的预定义代理参数

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