Изменение пароля, введенного пользователем при входе в учетную запись Windows
Я пишу провайдер учетных данных, который исправляет пароль пользователя, когда пользователь входит в учетную запись Windows и случайно вводит пароль, используя неправильные настройки языка клавиатуры (например, украинский, а не латинский). Одни и те же клавиши, но разные буквы. Теперь мне нужен способ перехватить введенный пользователем пароль и, если он введен неправильно, исправить его. В качестве отправной точки я использую поставщика учетных данных из Windows SDK. Он отлично работает в стандартном режиме (например, CP по умолчанию). Но я не могу найти, где можно получить и исправить пароль, введенный пользователем. Я думал, что HRESULT CSampleCredential::GetStringValue( DWORD dwFieldID, PWSTR* ppwz)
метод является правильным местом для этого. Заменить
hr = SHStrDupW(_rgFieldStrings[dwFieldID], ppwz);
строка с
hr = SHStrDupW(ppwstrCorrected, ppwz);
Где ppwstrCorrected содержит либо оригинальный пароль, либо исправленный. Но это ничего не делает. Поставщик учетных данных продолжает работать так же, как и раньше. Я даже пытался "сломать" моего провайдера, заставляя GetStringValue возвращать какую-то тарабарщину при каждом вызове. Но пример провайдера все еще работает как стандартный. И да, я попытался войти через поставщика примеров, а не через стандарт, поскольку их легко отличить по растровым изображениям на их плитках. Так, где я могу перехватить введенный пароль, который входит в Windows для проверки?
2 ответа
Я думаю, что будет лучше сбросить исправленный пароль обратно с помощью ICredentialProviderCredentialEvents::SetFieldString()
ICredentialProviderCredential::GetStringValue()
вызывается LogonUI для получения значений статических текстовых полей.
Отвечая на мой собственный вопрос. Были две проблемы с моим провайдером. Во-первых, код провайдера просто не использовался, и вместо него использовался стандартный код провайдера. Я не знаю, почему это так, но я решил эту проблему, отфильтровав стандартных провайдеров, как это описано в разделе " Сценарий провайдера учетных данных Windows, фильтр и разблокировка рабочей станции". Теперь, что касается примера SDK, доступ к неизмененному введенному пользователем паролю можно получить с помощью метода CSampleCredential::GetSerialization(). Он хранится в строке _rgFieldString[SFI_PASSWORD]. Этот метод может быть передан в функцию шифрования, поэтому его следует изменить до того, как он будет зашифрован.