あなたがやりたいことは実現可能ですが、Java を含まないルールに従わなければなりません。ここでは、ちょっとした歴史、現在の試みがうまくいかない理由、およびそれを修正する方法について説明します。
簡単ではありません。
ちょっとした歴史
まず、Windows Vista 以降、Windows が資格情報を取得する方法が根本的に変更されました。あなたが言及したlogon.exeユーティリティは古いアーキテクチャを使用しています。当時は、ログオン アーキテクチャをいじることはすべて Winlogon のプロセスで DLL として実行されていたため、ほぼ何でも好きなことを行うことができました。私が書いたこのようなカスタム GINA をすでにいくつか見つけているかもしれません。最近のバージョンの Windows では無視されます。
現在、Winlogon は LogonUI に資格情報の取得を要求します。LogonUI は、資格情報プロバイダーをホストするプロセスです。資格情報プロバイダーは、ログオン画面の「タイル」で表されます。LogonUI が資格情報を要求するように実装する COM インターフェイスがいくつかあります。
覚えておくべき重要事項は次のとおりです。
- ログオン プロセスと対話するには、COM インターフェイスを実装する必要があります。
- 表示する UI を決定するか、UI をまったく表示しないかを決定できます
COM インターフェイスを実装すると、Java はほぼ除外されます。
あなたが今直面している問題
ユーザーがログインするということは、そのユーザーのセキュリティ トークンを取得することを意味します。ただし、対話的にユーザーをログに記録するということは、Winlogon にドアを開けるように指示する必要があることを意味します。Winlogon がリッスンする唯一のプロセスは、LogonUI です。
つまり、セキュリティ トークンを作成できるコードがあったとしても、それを使用してデスクトップのロックを解除することはできません。
ちなみに、セキュリティ トークンを作成するための Windows API はLogonUser
です。
修正方法
資格情報プロバイダーを作成する必要があります。Java でそれを行う方法については聞いたことがありません。これはプラットフォーム固有であり、移植性がありません。ドキュメンテーションはすべて C++ 用ですが、.Net でもできると聞きました。出発点として、プラットフォーム SDK の Credential Providers サンプルを使用することをお勧めします。
資格情報プロバイダーが初期化されると、Bluetooth デバイスが表示されるなど、何らかのイベントを待機するスレッドが生成されます。CP と通信できる限り、サービスの実行は機能します。
の実装で、LogonUI のイベント メカニズムへのポインタを保存する必要もありますICredentialProvider::Advise
。
ハードウェア検出スレッドが Bluetooth デバイスを検出したら、 を呼び出しますICredentialProviderEvents::CredentialsChanged
。LogonUI に、すべての資格情報プロバイダーを再度調べるように指示します。呼び出されたら、自分がデフォルトの自動ログオン プロバイダであることを答える必要があります。
ふぅ!まだログオンしていません。
ICredentialProviderCredential::GetSerialization
最後の手順は、そのユーザー用に保存したパスワードを取得し、が呼び出されたときに LogonUI に送信することです。
そこから LogonUI が取得します。Winlogon に認証パッケージを呼び出してユーザーをログインするように指示します。
This SO answerは同じことを言っていますが、少し簡潔です。このMSDM の記事は、私の回答よりも古いものです。
+ユーザーのパスワードの暗号化と管理は演習として残されています ;) しかし、 Data Protection APIを見てみたいと思うかもしれません。