C ++ / Qt: Как вызвать диалог безопасности Windows OS для учетных данных прокси?

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

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

Диалог, отображаемый Internet Explorer для учетных данных прокси

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

введите описание изображения здесь

-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;
}
}

}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]