2016-03-07 98 views
1

我需要從一個程序發送證書信息發送到另一個,並登錄到Windows通過使用CredMarshalCredentialLogonUser這些信息幫助。我的程序當前使用常規用戶名/密碼組合傳遞憑證併成功登錄。我只是增加了使用智能卡憑證的功能。保存並加載智能卡證書

我用這個example成功地與一個智能卡證書登錄。

當你運行程序的用戶的工作,但沒有嘗試運行的程序作爲SYSTEM時。這是因爲SYSTEM無法訪問用戶的「我的」商店。我試圖解決這個問題,要麼通過將證書或整個證書存儲區作爲以用戶身份運行的應用程序作爲SYSTEM運行的程序。

我已經試過許多方法來得到的東西,將序列化之後成功登錄,但沒有得到任何東西能夠成功。似乎最好的方法是致電CertSaveStore並打開BLOB。我使用了這個Microsoft Example Page底部的最後一個例子。這將正確地從BLOB恢復證書存儲,查找證書,甚至生成用戶名。但生成的用戶名與原始生成的用戶名不同,並且無法以ERROR_LOGON_FAILURE(用戶名或密碼不正確)的錯誤登錄。

我目前的測試應用程序保存證書,並再次加載它在同一個程序。現在我已經將系統方面排除在等式之外。我猜測恢復的證書商店缺少一些信息,但我不確定我錯過了什麼。任何洞察力將不勝感激。最後

一個說明,我本來試圖將生成的用戶名和密碼只是傳遞到系統,並使其下臺,但它與同ERROR_LOGON_FAILURE錯誤而失敗。我假設用戶名必須重新生成,因爲被不同的用戶/程序調用,但是這種假設可能是錯誤的。

+0

(我不是Win32內部專家):你不能使用具有特定容器名稱的CryptAcquireContext,如[這裏]所述(https://blogs.msdn.microsoft.com/alejacma/2008/03/03/how-to-select-which-smart-card-reader-to-perform-actions-on /)來訪問智能卡對象?然後使用證書登錄。注意:您的「示例」鏈接指向「LogonUser」文檔。 – vlp

+0

[This](https://technet.microsoft.com/en-us/library/ff404289(WS.10).aspx)描述也很有趣。 – vlp

+0

@vlp感謝您的評論。我修復了示例鏈接。我一直在研究CryptAcquireContext,我當然需要更好地理解它。我正在繼續深入研究文檔以嘗試獲得工作解決方案。 – Snowman6286

回答

0

我已經得到了我的示例程序與CertSerializeCertificatesStoreElementCertAddCertificateContextToStore工作。我可以序列化證書,並在稍後將其添加到內存中的新商店。我曾經嘗試過,但是不小心沒有保存序列化項目的大小,我只是試圖使用sizeof()返回不正確大小的項目。

如果有人正在尋找在同一用戶空間中的程序之間發送證書憑證,這種方法將運行良好。

我把這個提前一步,並在我的用戶空間/系統範例中實現它。邏輯工作正常,我能夠生成一個用戶名,但仍然無法通過LogonUser。再過一週或試驗和錯誤之後,我發現了一個可在用戶空間和SYSTEM之間工作的解決方案。我最終不得不使用LsaLogonUser而不是LogonUser

如果有人希望有一個用戶空間程序將憑據發送給在SYSTEM中運行的守護程序,並讓該程序下到用戶,請使用此example。我最初嘗試這個very similar example,但它繼續失敗。在工作示例中,您不需要傳遞域或用戶名,只需輸入PIN。系統將從閱讀器讀取智能卡,並通過傳入的PIN進行驗證。只有當智能卡位於遠程計算機時,該解決方案才能在計算機上運行。我正在研究一種方法來實現它與主機中的智能卡一起工作,但它不屬於這篇文章。

我希望這可以節省一些人爲此所做的幾周工作。