如何让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
相关产品推荐
相关产品推荐

