修改用户在登录Windows帐户时输入的密码

时间:2014-11-14 14:44:23

标签: authentication windows-7 credential-providers

我正在编写一个凭据提供程序,当用户登录Windows帐户并使用错误的键盘语言设置(例如乌克兰语而非拉丁语)意外键入密码时,该提供程序将更正用户的密码。相同的键但不同的字母。现在我需要一种方法来拦截用户输入的密码,如果输入错误则更正密码。作为起点,我使用Windows SDK中的凭据提供程序。它在标准模式下工作正常(如默认CP)。但我找不到从哪里获取并更正用户输入的密码。我认为HRESULT CSampleCredential::GetStringValue( DWORD dwFieldID, PWSTR* ppwz)

方法是正确的做法。替换

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

字符串

hr = SHStrDupW(ppwstrCorrected, ppwz);

ppwstrCorrected包含原始密码或更正的密码。但这没有任何作用。凭据提供程序继续正常工作。我甚至试图打破"打破"我的提供者通过使GetStringValue在调用时返回一些乱码。但样本提供者仍然作为标准提供者。是的,我尝试通过示例提供程序而不是标准登录,因为它们很容易通过其磁贴上的位图进行区分。那么我在哪里可以拦截进入Windows进行检查的输入密码?

2 个答案:

答案 0 :(得分:0)

我认为最好使用ICredentialProviderCredentialEvents::SetFieldString()

重新设置更正后的密码 LogonUI调用

ICredentialProviderCredential::GetStringValue()来检索静态文本字段的值。

答案 1 :(得分:0)

回答我自己的问题。我的提供商有两个问题。首先,提供者的代码只是未使用,而是使用了标准提供者的代码。我不知道为什么会这样,但我通过过滤标准提供程序解决了这个问题,就像在Windows Credential Provider, Filter, and Unlock Workstation Scenario问题中描述的那样。 现在,就SDK示例而言,可以在CSampleCredential :: GetSerialization()方法中访问未修改的用户输入密码。它存储在_rgFieldString [SFI_PASSWORD]字符串中。密码可以通过此方法传递给加密函数,因此在加密之前应对其进行修改。