2014-11-14 147 views
2

我正在編寫一個憑據提供程序,它可以在用戶登錄Windows帳戶時更正用戶密碼,並且使用錯誤的鍵盤語言設置意外鍵入密碼(例如烏克蘭語而非拉丁語,例如)。相同的鍵但不同的字母。現在我需要一種方法來攔截用戶輸入的密碼,如果輸入錯誤,則需要更正密碼。作爲起點,我使用Windows SDK中的憑據提供程序。它在標準模式下工作正常(如默認的CP)。但我找不到從哪裏獲得並更正用戶輸入的密碼。我認爲HRESULT CSampleCredential::GetStringValue(DWORD dwFieldID, PWSTR* ppwz)修改登錄到Windows帳戶時用戶輸入的密碼

方法是正確的做法。與

hr = SHStrDupW(ppwstrCorrected, ppwz); 

凡ppwstrCorrected中包含的任何原始密碼或糾正一個替代

hr = SHStrDupW(_rgFieldStrings[dwFieldID], ppwz); 

字符串。但是這沒有任何作用。證書提供者繼續像以前一樣工作。我甚至試圖通過在GetStringValue被調用時返回一些亂碼來「打破」我的提供者。但樣本提供者仍然是標準樣本。是的,我試圖通過示例提供程序登錄,而不是標準,因爲它們很容易通過位圖上的位圖進行區分。那麼,我可以在哪裏攔截進入Windows進行檢查的輸入密碼?

回答

0

我認爲這將是更好的重新設置密碼修正回用ICredentialProviderCredentialEvents::SetFieldString()

ICredentialProviderCredential::GetStringValue()通過LogonUI調用來檢索靜態文本字段的值。

+0

謝謝你的迴應!我找到了解決問題的方法, – ambeid 2014-12-02 12:42:09

0

回答我自己的問題。我的提供商有兩個問題。首先,供應商的代碼沒有被使用,而是使用了標準供應商的代碼。我不知道爲什麼會這樣,但我通過篩選出標準提供者來解決此問題,如Windows Credential Provider, Filter, and Unlock Workstation Scenario問題中所述。 現在,就SDK示例而言,可以在CSampleCredential :: GetSerialization()方法中訪問未修改的用戶輸入密碼。它存儲在_rgFieldString [SFI_PASSWORD]字符串中。密碼可以從這個方法傳遞給加密函數,所以在加密之前應該修改密碼。

相關問題