我需要帮助将证书信息从一个程序发送到另一个程序,并通过使用 CredMarshalCredential 使用该信息登录 Windows。和 LogonUser .我的程序目前通过凭据并使用常规用户名/密码组合成功登录。我只是添加了使用智能卡凭据执行此操作的功能。
我用过这个example使用智能卡证书成功登录。
这在您以用户身份运行程序时有效,但在尝试以 SYSTEM 身份运行程序时无效。这是因为 SYSTEM 无法访问用户的“MY”商店。我正在尝试解决这个问题,方法是将证书或整个证书存储区从以用户身份运行的应用程序传递到以 SYSTEM 身份运行的程序。
我已经尝试了很多方法来获得在序列化后可以成功登录的东西,但没有任何东西可以成功工作。似乎最有效的方法是调用 CertSaveStore并打开 BLOB。我使用了此 Microsoft Example Page 底部的最后一个示例.这会正确地从 BLOB 恢复证书存储,找到证书,甚至生成用户名。但是生成的用户名与原来生成的用户名不同,登录失败,错误ERROR_LOGON_FAILURE(用户名或密码不正确)。
我当前的测试应用程序保存证书并在同一程序中再次加载它。我现在已经将 SYSTEM 方面排除在等式之外。我猜恢复的证书存储缺少一些信息,但我不确定我缺少什么。任何见解将不胜感激。
最后一点,我最初试图将生成的用户名和 PIN 传递给 SYSTEM 并让它退出,但它失败了,出现了同样的 ERROR_LOGON_FAILURE 错误。我假设用户名必须重新生成,因为被不同的用户/程序调用,但这个假设可能是错误的。
最佳答案
我的示例程序与 CertSerializeCertificatesStoreElement
和 CertAddCertificateContextToStore
一起工作。我能够序列化证书,稍后将其添加到内存中的新存储区。我之前试过这个,但不小心没有保存序列化项目的大小,我只是尝试使用 sizeof()
返回错误大小的项目。
如果有人希望在同一用户空间中的程序之间发送证书凭据,这种方法会很有效。
我进一步向前迈进了一步,并在我的用户空间/系统范例中实现了它。逻辑工作正常,我能够生成用户名,但仍然无法LogonUser
。再过一周或反复试验后,我找到了一个在用户空间和 SYSTEM 之间工作的解决方案。我最终不得不使用 LsaLogonUser而不是 LogonUser
。
如果有人希望让用户空间程序将凭据发送到在 SYSTEM 中运行的守护程序,并让该程序降级到用户,请使用此 example .我最初试过这个 very similar example , 但它继续失败。在工作示例中,您不需要传入域或用户名,只需传入 PIN。系统将从读卡器读取智能卡并使用输入的 PIN 码进行验证。仅当智能卡位于远程计算机上时,该解决方案才能跨计算机工作。我正在寻找一种方法来让它与主机中的智能卡一起工作,但这不在本文的范围内。
我希望这可以节省我为达到这一点而付出的数周工作时间。
关于c - 保存和加载智能卡证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35853008/