Lifebook U939/Bの指紋リーダー問題と取り組む

前回のエントリで書いた通り指紋リーダーが不調です。これに対策を施しました。

私のLifebook U939/Bの指紋リーダーはログオン時に全く機能しないことがあります。読み取りに失敗するくらいならいいのですが、指を置いたことすら検知しない、あるいはそもそもログイン・オプションに指紋が出てこない場合があります。これは大変イライラします。

対策のために試行錯誤しましたが、とりあえずの解決策にたどりついたように思えます。20回程度しか試行していませんが、スリープからの復帰時に指紋リーダーが反応しない問題が解消しました。

やったことは言葉にすると簡単です。スリープから復帰したときに指紋リーダーデバイスをいったんディセーブルし、即座にイネーブルにしました。これで指紋によるログインができるようになります。

この動作を実現するにあたって、WIndowsのタスク・スケジューラーとマイクロソフト製のdevcon.exeというソフトを使いました。以下、自分へのメモとして手順を残しておきます。

指紋リーダーのIDの特定

最初に指紋リーダーのIDを特定します。このIDはdevcon.exeに引数として与えます。

IDを調べるにはデバイス・マネージャーを開き、指紋リーダーのプロパティを開いてください。「詳細」タブをクリックして、その中のプロパティとして「ハードウェア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という名前のファイルを取り出します。

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
  }
}

タスク・スケジューラへの登録内容

タスクスケジューラを使うと、スリープからの復帰時にプログラムを実行することが出来ます。

この方法はあちこちで説明されていますが、例えば以下のページがわかりやすいです。

www.hide10.com

結論から書くと

  • ログ「システム」の中の
  • ソース「Power-Troubleshooter」が起こす
  • イベントID「1」を
  • 「イベント」としてタスクを起動する

ことになります。このときタスクはログイン前に管理者権限で起動します。

また、これに加えて

  • ログ「システム」
  • ソース「Kernel-Boot」
  • イベントID「27」

もトリガにしておけばコールド・ブート時にも指紋リーダをディセーブル・イネーブルできます。

laboradian.com


タスクとして起動するプログラムはpowershellで、上で説明したシェルスクリプトを引数として与えます。

powershell -ExecutionPolicy Bypass スクリプト・ファイルのパス

タスク・スケジューラーへの登録作業

実際にタスク・スケジューラーへ登録する作業をスクリーンショットで説明します。

タスク・スケジューラーで新しいタスクを作ります。複数のタブがありますが、最初に設定するのは「全般」タブです。

「全般」タブ

実行する場合の権限などを設定します。

  • ユーザーを「SYSTEM」に変更。
  • 「最上位の特権で実行する」をチェック。

指紋リーダーデバイスの操作はログオン前に実行するため、SYSTEMユーザーによって行います。また、デバイスの操作は管理者特権レベルで行います。

全般タブ
「トリガー」タブ

タスクを起動するトリガーを複数登録できます。ひとつ作り、トリガー条件を設定します。

  • タスクの開始「イベント」
  • ログ「システム」
  • 「Power-Troubleshooter」
  • イベントID 「1」

これでスリープから復帰したイベントをシステム・ログへ書き込む動作をトリガーとしてタスクを起動できます。

トリガー条件
「操作」タブ

実行するプログラムを複数登録できます。ひとつ作り、新しい操作に先のスクリプトを登録します。

「開始」という項目の意味が分かりにくいですが、英語では"start in"となっています。つまりワーキング・ディレクトリの指定です。

操作の編集
「条件」タブ

タスクの実行条件を指定します。

  • 「コンピュータをAC電源で使用している場合のみタスクを開始する」のチェックを外す

当然ですが、バッテリー動作の時にも必要なタスクです。

条件タブ
「設定」タブ
  • タスクが既に実行中の場合に適用される規則「既存のインスタンスの停止」
設定タブ

まとめ

Lifebook U939/Bの指紋リーダーの不具合への対策を施しました。

まだ買って7日以内だったので返品要求しても良かったのですが、検索したところ同じような症状が出ている人がいました。どうやら富士通としては頑なに不具合と認めないようです。そこで手元で対応策を考えることにしました。かなりの数の試行錯誤を重ねたため、Windowsのイベント・ビューアとタスク・スケジューラの良い勉強になりました。

対策後は確実に指紋リーダーが動作するため、大変快適にログインできるようになっています。

/* -----codeの行番号----- */