c++ - 哪个 Windows API 用于 Windows 安全代理身份验证对话框?

标签 c++ winapi authentication proxy

我想以编程方式显示以下来自 C++ 的 Windows 安全对话框。想知道要使用哪个 Windows API 来提示此对话框以获取代理凭据,而不是构建自定义对话框。

enter image description here

最佳答案

我能够显示 Windows 安全对话框来询问代理凭据。这是代码。将不得不对其进行微调,但它正在运行。

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

}

关于c++ - 哪个 Windows API 用于 Windows 安全代理身份验证对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980786/

相关文章:

c++ - 可以在堆上分配右值 vector 吗?

c++ - for 循环和 if 条件中的 continue 语句

c++ - MSVC : Using link. 手动执行

c++ - 椭圆的透明边界框

authentication - 如何在 Camunda Java api 中强制进行身份验证?

c++ - 在静态函数c++中获取类的类型

c# - 我想通过 SendInput API 发送一些 key

c++ - 如何在 Visual C++ 2012 中读取用户定义的资源?

javascript - 通过 SSO 身份验证使用 REST 服务

spring - 在 Spring security 中是否可以仅使用 HTTPS 进行登录?