Изменение пароля, введенного пользователем при входе в учетную запись Windows

Я пишу поставщик учетных данных, который будет исправлять пароль пользователя, когда пользователь входит в учетную запись Windows и случайно вводит пароль, используя неправильные настройки языка клавиатуры (например, украинский, а не латинский). Те же клавиши, но разные буквы. Теперь мне нужен способ перехватить введенный пользователем пароль и, если он введен неправильно, исправить его. В качестве отправной точки я использую поставщика учетных данных из Windows SDK. Он отлично работает в стандартном режиме (как и CP по умолчанию). Но я не могу найти, где получить и исправить пароль, введенный пользователем. Я думал, что HRESULT CSampleCredential::GetStringValue( DWORD dwFieldID, PWSTR* ppwz)

метод является правильным местом для этого. Заменить

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

строка с

hr = SHStrDupW(ppwstrCorrected, ppwz);

Где ppwstrCorrected содержит либо исходный пароль, либо исправленный. Но это ничего не делает. Credentials Provider продолжает работать в прежнем режиме. Я даже пытался «сломать» своего провайдера, заставив GetStringValue возвращать какую-то тарабарщину каждый раз, когда он вызывается. Но образец провайдера по-прежнему работает как стандартный. И да, я пытался войти через образец провайдера, а не через стандартный, так как их легко отличить по растровым изображениям на их тайлах. Так где же перехватить введенный пароль, который заходит в винду для проверки?


person ambeid    schedule 14.11.2014    source источник


Ответы (2)


Я думаю, что будет лучше сбросить исправленный пароль с помощью ICredentialProviderCredentialEvents::SetFieldString()

ICredentialProviderCredential::GetStringValue() вызывается LogonUI для получения значений статических текстовых полей.

person Alexander    schedule 20.11.2014
comment
Спасибо за ответ! Я нашел свой способ решения проблемы& - person ambeid; 02.12.2014

Отвечая на мой собственный вопрос. У моего провайдера было две проблемы. Во-первых, код провайдера просто не использовался, вместо него использовался стандартный код провайдера. Я не знаю, почему это так, но я решил это, отфильтровав стандартных поставщиков, как это описано в Поставщик учетных данных Windows, фильтрация и сценарий разблокировки рабочей станции. Теперь, что касается примера SDK, доступ к немодифицированному введенному пользователем паролю можно получить в методе CSampleCredential::GetSerialization(). Он хранится в строке _rgFieldString[SFI_PASSWORD]. Пароль может быть передан функции шифрования из этого метода, поэтому его следует изменить перед шифрованием.

person ambeid    schedule 02.12.2014