前回のエントリで書いた通り指紋リーダーが不調です。これに対策を施しました。
私のLifebook U939/Bの指紋リーダーはログオン時に全く機能しないことがあります。読み取りに失敗するくらいならいいのですが、指を置いたことすら検知しない、あるいはそもそもログイン・オプションに指紋が出てこない場合があります。これは大変イライラします。
対策のために試行錯誤しましたが、とりあえずの解決策にたどりついたように思えます。20回程度しか試行していませんが、スリープからの復帰時に指紋リーダーが反応しない問題が解消しました。
やったことは言葉にすると簡単です。スリープから復帰したときに指紋リーダーデバイスをいったんディセーブルし、即座にイネーブルにしました。これで指紋によるログインができるようになります。
この動作を実現するにあたって、WIndowsのタスク・スケジューラーとマイクロソフト製のdevcon.exeというソフトを使いました。以下、自分へのメモとして手順を残しておきます。
指紋リーダーのIDの特定
最初に指紋リーダーのIDを特定します。このIDはdevcon.exeに引数として与えます。
IDを調べるにはデバイス・マネージャーを開き、指紋リーダーのプロパティを開いてください。「詳細」タブをクリックして、その中のプロパティとして「ハードウェアID」を選択すると、値の中にIDが表示されます。

私のLifebook U939/Bの場合、値は
USB\VID_298D%&PID_2033
でした。なお、この値は機種ごとに変わる可能性があります。また、同じU939/Bでも異なる可能性があります。
devcon.exeの取得
devconはdevice consoleの略で、このソフトはマイクロソフトのドライバSDKに同梱されています。
とはいえ、このSDKは数GBのサイズがあり、devcon.exeのためだけにこのSDKをインストールするのはなかなかに骨が折れます。
ありがたいことに、devcon.exeだけを取得する方法が公開されています。
このページにあるとおり、マイクロソフトからdevcon.exeが入っているcabファイルをダウンロードします。このファイルはファイル・エクスプローラーから開くことが出来ますので、中からfilbad6e2cce5ebc45a401e19c613d0a28fという名前のファイルを取り出します。

取り出した後、このファイルの名前をdevcon.exeに変更し、適当なディレクトリにコピーします。
devcon.exeのコマンドライン引数
devcon.exeを使って指紋リーダーをディセーブル・再イネーブルするには以下のようにコマンドラインから実行します。
devcon.exe restart "USB\VID_298D%&PID_2033"
このコマンドは、管理者権限で実行しなければなりません。管理者権限がない場合は実行に失敗します。
Powershell スクリプト
devcon.exeを使って指紋リーダーをディセーブル・イネーブルする場合に失敗することがありました。理由はわかっていませんが同じコマンドを実行すると2回目以降は成功します。
そこで、スクリプトを書いてdevcon.exeが成功するまでループさせることにしました。さすがに無限ループは気持ち悪いので5回ほどループさせて、ディセーブル・イネーブルが成功したところで終了とします。ディセーブル・イネーブルの成否はdevcon.exeの返り値で知ることが出来ます。
このスクリプト・ファイルはdevcon.exeと同じディレクトリに置かなければ動作しません。
# Lifebook U939/B Fingerprint Reader restart script. for($i=1; $i -le 5; $i++) { Start-Sleep -Milliseconds 100 # sleep 100mS. .\devcon.exe restart "USB\VID_298D&PID_2033" if ($?) { # If successfuly restarted break # quit the script } }
タスク・スケジューラへの登録内容
タスクスケジューラを使うと、スリープからの復帰時にプログラムを実行することが出来ます。
この方法はあちこちで説明されていますが、例えば以下のページがわかりやすいです。
結論から書くと
- ログ「システム」の中の
- ソース「Power-Troubleshooter」が起こす
- イベントID「1」を
- 「イベント」としてタスクを起動する
ことになります。このときタスクはログイン前に管理者権限で起動します。
また、これに加えて
- ログ「システム」
- ソース「Kernel-Boot」
- イベントID「27」
もトリガにしておけばコールド・ブート時にも指紋リーダをディセーブル・イネーブルできます。
タスクとして起動するプログラムはpowershellで、上で説明したシェルスクリプトを引数として与えます。
powershell -ExecutionPolicy Bypass スクリプト・ファイルのパス
タスク・スケジューラーへの登録作業
実際にタスク・スケジューラーへ登録する作業をスクリーンショットで説明します。
タスク・スケジューラーで新しいタスクを作ります。複数のタブがありますが、最初に設定するのは「全般」タブです。
「全般」タブ
実行する場合の権限などを設定します。
- ユーザーを「SYSTEM」に変更。
- 「最上位の特権で実行する」をチェック。
指紋リーダーデバイスの操作はログオン前に実行するため、SYSTEMユーザーによって行います。また、デバイスの操作は管理者特権レベルで行います。

「トリガー」タブ
タスクを起動するトリガーを複数登録できます。ひとつ作り、トリガー条件を設定します。
- タスクの開始「イベント」
- ログ「システム」
- 「Power-Troubleshooter」
- イベントID 「1」
これでスリープから復帰したイベントをシステム・ログへ書き込む動作をトリガーとしてタスクを起動できます。

「操作」タブ
実行するプログラムを複数登録できます。ひとつ作り、新しい操作に先のスクリプトを登録します。
- 操作「プログラムの開始」
- プログラム/スクリプト「powershell」
- 引数の追加「-ExecutionPolicy Bypass スクリプト・ファイルへのパス」
- 開始「スクリプト・ファイルが置かれているディレクトリ」
「開始」という項目の意味が分かりにくいですが、英語では"start in"となっています。つまりワーキング・ディレクトリの指定です。

「条件」タブ
タスクの実行条件を指定します。
- 「コンピュータをAC電源で使用している場合のみタスクを開始する」のチェックを外す
当然ですが、バッテリー動作の時にも必要なタスクです。
