То, что вы хотите сделать, осуществимо, но вы должны играть по правилам, которые не включают Java. Вот небольшая история, почему ваша текущая попытка не работает, и как вы можете это исправить.
Это будет нелегко.
Немного истории
Во-первых, начиная с Windows Vista произошли фундаментальные изменения в том, как Windows получает учетные данные. Упомянутая вами утилита logon.exe использует старую архитектуру. В то время вы могли делать практически все, что хотели, поскольку все, что связано с архитектурой входа в систему, выполнялось как DLL в процессе Winlogon. Возможно, вы уже нашли несколько пользовательских GINA, таких как это, которое я написал. Они игнорируются в последних версиях Windows.
В настоящее время Winlogon запрашивает LogonUI для получения учетных данных. LogonUI — это процесс, в котором размещаются поставщики учетных данных. Поставщик учетных данных представлен плиткой на экране входа в систему. Существует несколько COM-интерфейсов, которые необходимо реализовать, чтобы LogonUI запрашивал у вас учетные данные.
Важно помнить:
- Вы должны реализовать COM-интерфейс для взаимодействия с процессом входа в систему.
- Вы можете решить, какой пользовательский интерфейс вы представляете, или не пользовательский интерфейс вообще.
Реализация COM-интерфейса в значительной степени исключает Java.
Проблема, с которой вы столкнулись прямо сейчас
Вход пользователя означает получение для него токена безопасности. Но регистрация пользователя в интерактивном режиме означает, что вы должны указать Winlogon открыть дверь. Единственный процесс, который Winlogon будет прослушивать, — это LogonUI.
Другими словами, даже если у вас есть код, который может создать токен безопасности, вы не сможете использовать его для разблокировки рабочего стола.
Windows API для создания токена безопасности: LogonUser
, кстати.
Как это исправить
Вы должны написать Credential Provider. Я никогда не слышал, как это сделать на Java, это слишком специфично для платформы и непереносимо. Вся документация написана для C++, но я слышал, что это можно сделать и в .Net. Хорошей отправной точкой являются примеры поставщиков учетных данных в Platform SDK.
Когда ваш Credential Provider инициализируется, вы создадите поток, ожидающий некоторого события, например появления устройства Bluetooth. Запуск службы будет работать, если вы можете связаться с вашим CP.
Вам также необходимо сохранить указатель на механизм событий LogonUI в вашей реализации ICredentialProvider::Advise
.
Когда поток обнаружения оборудования обнаружит ваше устройство Bluetooth, вызовите ICredentialProviderEvents::CredentialsChanged
. Это сообщит LogonUI, чтобы снова пройти через всех поставщиков учетных данных. При вызове вы должны ответить, что вы являетесь провайдером автоматического входа в систему по умолчанию.
Фу! И мы еще не вошли в систему!
Последним шагом является получение пароля, сохраненного для этого пользователя, и отправка его в LogonUI, когда ICredentialProviderCredential::GetSerialization
.
LogonUI возьмет его оттуда. Это даст Winlogon указание вызвать для вас пакет проверки подлинности и выполнить вход пользователя.
Этот ответ SO говорит то же самое, но немного кратко. Эта статья MSDM устарела и будет более полной, чем мой ответ.
+ Шифрование и управление паролем пользователя остается в качестве упражнения;) но вы можете взглянуть на API защиты данных.
person
ixe013
schedule
11.03.2015