如何解决如何使用 CredUIPromptForWindowsCredentials 驱动我的凭据提供程序
我一直在研究凭据提供程序,并且一直在通过日志记录对其进行调试。最近了解到 CredUIPromptForWindowsCredentials()
API 能够从登录屏幕或远程桌面连接以外的地方调用它。此时我似乎可以显示我的凭据的唯一方法是将最后一个参数设置为 CREDUIWIN_SECURE_PROMPT。我尝试了各种标志方案,但都没有运气。我的 CP 工作正常,这不是问题。问题是更容易调试。只有一次我让我的笔记本电脑无法启动时不得不进入救援模式。 ;) 使用 CREDUIWIN_SECURE_PROMPT 标志的问题是我无法访问调试器,因为登录接管了屏幕,我无法回到调试器。我想唯一的解决方法是使用此 API 在另一台机器上进行远程调试,但我不想为此烦恼。
我的 CP 注册在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{55157584-ff0f-48ce-9178-a4e290901663} 并且默认属性是“MyCredProvider”(对于这个例子)。 (GUID,道具名称已更改以保护有罪者。同时忽略 LsaString,其中副本上会发生不好的事情——我不会这样做。)
#include <windows.h>
#include <iostream>
#include <EvoApi.h>
#include <decrypt.h>
#include <atlbase.h>
#include <Lmwksta.h>
#include <StrSafe.h>
#include <LMAPIbuf.h>
#include <LMJoin.h>
#include <wincred.h>
#include <NTSecAPI.h>
#pragma warning(disable : 4996)
#pragma comment(lib,"netapi32.lib")
#pragma comment(lib,"credui.lib")
#pragma comment(lib,"secur32")
using namespace std;
template <size_t SIZE = 256>
struct LsaString : public LSA_STRING
{
LsaString()
{
MaximumLength = SIZE;
Length = 0;
Buffer = pBuf.get();
}
LsaString(LPCSTR pWhat)
{
MaximumLength = SIZE;
Length = 0;
Buffer = pBuf.get();
Init(pWhat);
}
void Init(LPCSTR pWhat)
{
size_t len = strlen(pWhat);
if (len >= SIZE)
throw;
strcpy(Buffer,pWhat);
Length = (USHORT) len;
}
unique_ptr<char[]> pBuf = make_unique< char[] >(SIZE);
};
int _tmain(int argc,wchar_t* argv[])
{
#if 1
wstring me(_T("MYLOGING"));
wstring url(_T("Header"));
wstring message(_T("Enter credentials for ..."));
CREDUI_INFOW credInfo;
credInfo.pszCaptionText = url.c_str();
credInfo.hbmBanner = nullptr;
credInfo.hwndParent = NULL;
credInfo.pszMessageText = message.c_str();
credInfo.cbSize = sizeof(CREDUI_INFOW);
ULONG authPackage = 0;
LSAHANDLE lsaHandle;
LsaConnectUntrusted(&lsaHandle);
LsaString<> lsaString("MyCredProvider");
//LsaString<> lsaString(MICROSOFT_KERBEROS_NAME_A); // works ... as far as finding in LsaLookupAuth...
//LsaString<> lsaString(NEGOssp_NAME_A); // works ... as far as finding in LsaLookupAuth...
ULONG ulPackage = 0;
LsaLookupAuthenticationPackage(lsaHandle,&lsaString,&ulPackage);
void* pBlob;
ULONG blobSize = 0;
DWORD dwFlags = CREDUIWIN_GENERIC; //CREDUIWIN_SECURE_PROMPT
CredUIPromptForWindowsCredentials(&credInfo,&ulPackage,NULL,&pBlob,&blobSize,FALSE,dwFlags);
if (pBlob) CoTaskMemFree(pBlob);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。