Windows 凭据提供程序远程登录
windows credential provider remote logon
我正在尝试从一个工作站(本地)上的智能卡读取凭据,然后将其发送到另一个工作站(远程),并使用它来从凭据提供程序中登录到该工作站。
我已经搜索和研究了几个星期,但没有发现任何人展示或告诉如何做到这一点。
我在 https://www.idrix.fr/Root/Samples/LsaSmartCardLogon2.cpp 上发现了一些对出色工作的引用,该工作是智能卡凭据提供程序的工作代码,但不幸的是,要求凭据提供程序可以直接访问带有凭据的智能卡。
我正在使用的实际代码似乎有点长于包含在帖子中,所以我想我尝试使用 sudo 代码提出问题。在本地工作站上:
MySendCredentialsFromSmartCard(){
CryptAcquireContext(hProv, containerName, cardName, PROV_RSA_FULL, CRYPT_SILENT)
CryptGetUserKey(*hProv, AT_KEYEXCHANGE, &hCryptKey);
CryptGetKeyParam(hCryptKey, KP_CERTIFICATE, encodedCert, &size, 0);
MySendCertToRemote(encodedCert,size);
}
在自定义凭据提供程序中运行的远程工作站上:
HRESULT CSampleCredential::GetSerialization(
_Out_ CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,
_Out_ CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,
_Outptr_result_maybenull_ PWSTR *ppwszOptionalStatusText,
_Out_ CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon){
MyReadCertFromRemote(&cert,&size);
CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
CryptCreateHash(hCryptProv, CALG_SHA1, NULL, 0, &hHash);
CryptHashData(hHash, (BYTE *)cert, (DWORD)size, 0);
CERT_CREDENTIAL_INFO certInfo;
CryptGetHashParam(hHash, HP_HASHVAL, certInfo.rgbHashOfCert, &dwHashLen, 0);
CredMarshalCredential(CertCredential, &certInfo, marshalledCred);
/****************************for debug only*****************************/
LogonUser((*marshalledCred, NULL, NULL, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &userHandle);
//this reuturns 1 (success)
/**************************************************************************/
KERB_INTERACTIVE_UNLOCK_LOGON kiul;
CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus
KerbInteractiveUnlockLogonInit(L"", (PWSTR)marshaledCred, L"", cpus, &kiul);//(note:I've tried this with the third param set to the card's pin)
KerbInteractiveUnlockLogonPack(kiul, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
RetrieveNegotiateAuthPackage(&ulAuthPackage);
pcpcs->ulAuthenticationPackage = ulAuthPackage;
pcpcs->clsidCredentialProvider = CLSID_OfProvider;
*pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
}
登录UI.exe显示"指定的登录会话不存在。它可能已经被终止了。此接缝对应于 Windows 错误代码 1312。似乎大多数开发人员都在努力处理此错误代码,在使用SSL证书配置IIS时遇到问题。我没有发现与凭据提供程序相关的此错误的引用。各种线程似乎表明 LogonUser 是 LSALogonUser 的包装器,并且来自 ICredentialProviderCredential::GetSerialization 的返回值将传递给 LSALogonUser。我使用编组凭据对 LogonUser 的调用成功的事实似乎表明我走在正确的轨道上,但我无法验证这一点,也无法弄清楚我错过了什么。我想尽量避免需要将凭据存储在远程工作站上的解决方案,因为它通常是域管理员凭据。有人有什么想法吗?关于如何进行的任何建议?
谢谢
我想您可以使用通信机制来做到这一点,在该机制中,您将数据从一个工作站发送到另一个工作站,并在远程工作站中序列化数据SetSerialization()而不是GetSerialization(),准备所有字段并处理登录。
根据我的理解,提供程序类(由ICredentialProvider继承的类)必须以某种方式等待这些凭据并将它们传递给SetSerialization
- 密码登录程序将永远循环并显示不正确的结果
- 如何检查cURL是否成功登录?c ++
- 在 Tizen 中登录特定文件?
- 如何在 c++ 中将密码和用户名保存到 .txt 文件中.如果用户尝试登录,我仍然希望能够检索它们
- Win7 C++ - 从以用户身份登录的服务启动可执行文件的问题
- 在主窗口之前显示登录对话框并隐藏主窗口按钮
- 如何使用 libcurl 登录本网站?(C++)
- 如何使用 Apache C 模块登录到文件
- 用户注销/登录后,创建托盘图标时出现罕见错误
- 将正在运行的程序的用户名与登录到Windows的用户名进行比较
- 使用二进制文件的用户名和登录系统
- C++登录面板以查看 cout
- 从C++ Windows 服务中获取当前登录的用户名
- 是否有任何 C 函数或 API 来获取当前登录用户下运行的进程列表
- 不会在登录名中读取C++我的文件
- 尝试制作登录程序
- 在关闭时升级登录中的启动线程访问违规
- 与多线程一起登录多进程应用程序
- c++应用程序的登录应该在单独的线程中完成吗
- 在多线程中登录的良好做法是什么?