2

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

方法是正确的地方。取代

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

字符串与

hr = SHStrDupW(ppwstrCorrected, ppwz);

其中 ppwstrCorrected 包含原始密码或更正后的密码。但这无济于事。凭据提供程序继续照常工作。我什至试图通过让 GetStringValue 在任何时候返回一些乱码来“破坏”我的提供程序。但是示例提供程序仍然可以作为标准提供程序。是的,我尝试通过示例提供程序而不是标准登录,因为它们很容易通过瓷砖上的位图进行区分。那么我在哪里可以截获进入 Windows 进行检查的输入密码呢?

4

2 回答 2

0

回答我自己的问题。我的提供商有两个问题。首先,提供者的代码根本没有被使用,而是使用了标准的提供者的代码。我不知道为什么会这样,但我通过过滤掉标准提供程序解决了这个问题,就像Windows 凭据提供程序、过滤器和解锁工作站方案问题中描述的那样。现在,就 SDK 示例而言,可以在 CSampleCredential::GetSerialization() 方法中访问未修改的用户输入密码。它存储在 _rgFieldString[SFI_PASSWORD] 字符串中。密码可能会从这个方法传递给加密函数,所以在加密之前应该修改它。

于 2014-12-02T12:57:04.987 回答
0

我认为使用重新设置更正的密码会更好ICredentialProviderCredentialEvents::SetFieldString()

ICredentialProviderCredential::GetStringValue()由 LogonUI 调用以检索静态文本字段的值。

于 2014-11-20T12:16:36.720 回答