【问题标题】:Which Windows API to be used for Windows Security Proxy Authentication dialog?哪个 Windows API 用于 Windows 安全代理身份验证对话框?
【发布时间】:2013-09-24 11:47:43
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi authentication proxy


    【解决方案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;
                }
            }
    
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试CredUIPromptForCredentials(使用here的小例子)或CredUIPromptForWindowsCredentials

      【讨论】:

      • CredUIPromptForCredentials 显示与 Windows 安全对话框不匹配的基于 Windows XP 的对话框。我将不得不尝试使用 CredUIPromptForWindowsCredential。谢谢!!
      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多