You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CredUIPromptForWindowsCredentials实现桌面遮罩(阻塞)效果?

能否让CredUIPromptForWindowsCredentials调用时实现桌面遮罩(阻塞)效果?

目前使用带runas参数的ShellExecuteEx可实现该遮罩效果——它会以管理员权限执行任务并模糊背景,但无法保存登录账号和密码。

带遮罩效果的ShellExecuteEx示例

int elevate()
{
    wchar_t szPath[MAX_PATH];
    if (GetModuleFileNameW(NULL, szPath, ARRAYSIZE(szPath)))
    {
        // 以管理员身份启动自身
        SHELLEXECUTEINFOW sei = { sizeof(sei) };
        sei.lpVerb = L"runas";
        sei.lpFile = szPath;
        sei.hwnd = NULL;
        sei.nShow = SW_NORMAL;

        if (!ShellExecuteExW(&sei))
        {
            DWORD dwError = GetLastError();
            if (dwError == ERROR_CANCELLED)
            {
                // 用户拒绝提升权限
                //std::cout << "用户未允许权限提升" << std::endl;
            }
        }
        else
        {
            _exit(1);  // 退出当前进程
        }
    }
}

CredUIPromptForWindowsCredentials示例

void getCredentials()
{
    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;


    // 显示对话框请求凭据
    ui.cbSize = sizeof(ui);
    ui.hwndParent = GetConsoleWindow();
    ui.pszMessageText = L"代理服务器需要用户名和密码";
    ui.pszCaptionText = L"代理身份验证";
    ui.hbmBanner = NULL;

    dwResult = CredUIPromptForWindowsCredentialsW(
               &ui,             // 自定义信息
               0,               // 要显示的错误代码
               &ulAuthPackage,  // 授权包
               pvInAuthBlob,    // 凭据字节数组
               cbInAuthBlob,    // 凭据输入缓冲区大小
               &pvAuthBlob,     // 输出凭据字节数组
               &cbAuthBlob,     // 输出凭据字节数组大小
               &fSave,          // 保存复选框状态
               CREDUIWIN_SECURE_PROMPT
           );
    if (dwResult == NO_ERROR)
    {
        CredUnPackAuthenticationBufferA(0,
                                    pvAuthBlob,
                                    cbAuthBlob,
                                    pszName,
                                    &maxLenName,
                                    domain,
                                    &maxLenDomain,
                                    pszPwd,
                                    &maxLenPassword);
        SecureZeroMemory(pvAuthBlob, cbAuthBlob);
        CoTaskMemFree(pvAuthBlob);
        pvAuthBlob = NULL;

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

内容的提问来源于stack exchange,提问作者Danila Smirnov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:03:10