2014-11-14 111 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]字符串中。密码可以从这个方法传递给加密函数,所以在加密之前应该修改密码。

相关问题