2013-09-12 4 views
-1

Мое приложение должно подключиться к Интернету через прокси. Я использую QNetworkProxyFactory :: setUseSystemConfiguration для его выполнения. Для проксированных прокси-серверов мне нужно передать учетные данные пользователя объекту-прокси. Я не хочу создавать настраиваемый диалог, чтобы получить эти данные, вместо этого я хочу использовать диалог ОС для него, который был показан интернет-проводником (см. Скриншот). Я попытался использовать CredUIPromptForCredentials, чтобы отобразить диалоговое окно учетных данных, но этот интерфейс не такой же, как диалог безопасности Windows.C++/Qt: Как вызвать диалоговое окно Windows Windows Security для учетных данных прокси?

Может ли кто-нибудь проливать свет, с помощью которого MSDN API будет использоваться для показа нижеприведенного диалога с C++?

Dialog shown by Internet explorer for proxy credentials

Ниже один, который был показан с CredUIPromptForCredentials

enter image description here

+0

Я не вижу вопроса в вашем сообщении. Кроме того, можете ли вы прояснить, что не нравится и что вы ожидаете? – lpapp

+0

Отредактированный вопрос будет более подробным. – Engineer

ответ

1

Я могу показать диалог WindowsSecurity задать учетные данные прокси-сервера. Вот код. Нужно будет настроить мелодию, но она работает.

void getCredentials(const char * proxyIp, int proxyPort, char * proxType, QString &user, QString &password) 
{ 

    Log.info("Credentials", L"About to read credentials for [%hs] [%d] [%hs]",proxyIp,proxyPort,proxType); 

     HRESULT hr = S_OK; 
     DWORD dwResult; 
     PVOID pvInAuthBlob = NULL; 
     ULONG cbInAuthBlob = 0; 
     PVOID pvAuthBlob = NULL; 
     ULONG cbAuthBlob = 0; 
     CREDUI_INFOW ui; 
     ULONG ulAuthPackage = 0; 
     BOOL fSave = FALSE; 
     TCHAR pszName[CREDUI_MAX_USERNAME_LENGTH+1]; 
     TCHAR pszPwd[CREDUI_MAX_PASSWORD_LENGTH+1]; 
     TCHAR domain[CREDUI_MAX_DOMAIN_TARGET_LENGTH+1]; 
     DWORD maxLenName = CREDUI_MAX_USERNAME_LENGTH+1; 
     DWORD maxLenPassword = CREDUI_MAX_PASSWORD_LENGTH+1; 
     DWORD maxLenDomain = CREDUI_MAX_DOMAIN_TARGET_LENGTH+1; 


     // Display a dialog box to request credentials. 
     ui.cbSize = sizeof(ui); 
     ui.hwndParent = GetConsoleWindow(); 
     ui.pszMessageText = L"The Proxy Server requires user name and password"; 
     ui.pszCaptionText = L"Proxy Authentication"; 
     ui.hbmBanner = NULL; 

     dwResult = CredUIPromptForWindowsCredentialsW(
         &ui,    // Customizing information 
         0,    // Error code to display 
         &ulAuthPackage, // Authorization package 
         pvInAuthBlob, // Credential byte array 
         cbInAuthBlob, // Size of credential input buffer 
         &pvAuthBlob,  // Output credential byte array 
         &cbAuthBlob,  // Size of credential byte array 
         &fSave,   // Select the save check box. 
         CREDUIWIN_GENERIC 
         ); 
     if (dwResult == NO_ERROR) 
     { 
      Log.info("Credentials", L"cred read success"); 
      CredUnPackAuthenticationBufferW(0, 
              pvAuthBlob, 
              cbAuthBlob, 
              pszName, 
              &maxLenName, 
              domain, 
              &maxLenDomain, 
              pszPwd, 
              &maxLenPassword); 
      SecureZeroMemory(pvAuthBlob, cbAuthBlob); 
      CoTaskMemFree(pvAuthBlob); 
      pvAuthBlob = NULL; 

      Log.info("Credentials", L"u [%ls] p [%ls] d[%ls]",QString::fromWCharArray(pszName).toStdWString().c_str(), 
                   QString::fromWCharArray(pszPwd).toStdWString().c_str(), 
                   QString::fromWCharArray(domain).toStdWString().c_str()); 

      user = QString::fromWCharArray(pszName).toStdWString(); 
      password = QString::fromWCharArray(pszPwd).toStdWString(); 

      SecureZeroMemory(pszName, sizeof(pszName)); 
      SecureZeroMemory(pszPwd, sizeof(pszPwd)); 


     }else 
     { 
      Log.info("Credentials", L"cred read fail"); 

      hr = HRESULT_FROM_WIN32(dwResult); 
      if (pvInAuthBlob) 
      { 
       SecureZeroMemory(pvInAuthBlob, cbInAuthBlob); 
       CoTaskMemFree(pvInAuthBlob); 
       pvInAuthBlob = NULL; 
      } 
     } 

}