ハードウェア デバイスのトラブルシューティングについて

こんにちは。Windows プラットフォーム サポートの北原です。

今回は、デバイスのトラブルシューティングに利用頂けるツールをいくつかご紹介したいと思います。

===============
(A) デバイスのトラブルシューティング ツール
===============
Windows 7 及び Windows 8 には、デバイスの問題を自動的に検出し、修復を試みる
ツールが OS に付属されています。何かデバイスの問題が発生した際には、まずこちらを
試してみることをお勧めします。以下はトラブルシューティング ツールの起動手順です。

1. コントロール パネルを開きます
2. [システムとセキュリティ] をクリックします
3. [コンピューターの問題のトラブルシューティング] をクリックします
4. [デバイスを構成する] をクリックします
5. ウィザードに従ってトラブルシューティングを行います

Windows トラブルシューティング - Microsoft Windows
https://windows.microsoft.com/ja-jp/windows7/products/features/windows-troubleshooting

Windows Vista は OS に組み込まれておりませんが、以下のページからツールの入手が必要です。

Windows でのトラブルシューティング - Windows ヘルプ
https://windows.microsoft.com/ja-jp/windows/troubleshooting-windows#troubleshooting-windows=windows-vista
※ [ハードウェアおよびデバイスのトラブルシューティングを実行するには] の項にあります

===============
(B) デバイス マネージャー
===============
トラブルシューティング ツールで問題が解決しない場合は、従来通り、デバイス マネージャー
を利用します。

1. Windows キーを押しながら、Pause/Break キーを押下します
2. [デバイス マネージャー] をクリックします

デバイス マネージャーが起動すると、現在接続されているすべてのデバイスが表示されます。
まずは以下のようなアイコンが無いかを確認します。

1. 無効化
アイコンに画像のような下矢印マークが付いている場合、そのデバイスは無効化されている
ことを示しています。デバイスが無効化されていると、PC はそのデバイスを使用できません。
通常、デバイスが自動的に無効化されることはほとんどありません。何かの不具合があった場合に、
人為的に無効化させる場合がほとんどです。

デバイスを有効化するには、対象のデバイスを右クリックし、[有効] をクリックします。


 

2. 不明なデバイス
画像のように [ほかのデバイス] に含まれているデバイスは、該当するデバイスの種別が
判別できなかったものになります。これは、多くの場合、必要なデバイス ドライバーが
インストールされていないことによるものです。解決にはデバイスの開発元のサイトから
最新のデバイス ドライバーを入手する必要があります。

そもそも、そのデバイスが何であるか分からない場合は、[詳細] タブの [プロパティ] から
[デバイス インスタンス パス] を調べ、それをキーワードに指定してインターネット検索を
してみることをお勧めします。デバイスに関する情報が得られる場合があります。
また、この方法で大した情報が得られなかった場合は、パスに含まれる VEN_XXXX の 4 桁の
英数字と "Vender ID" という文字列、あわせて 2 つのキーワードを指定してインターネット
検索をすると、製造元の企業名がヒットする場合があります。

3. エラー
アイコンに画像のような ! マークが付いている場合、そのデバイスが何らかの理由で正常に
動作していないことを示しています。発生しているエラーには様々な種類があり、種類ごとに
エラー コードが割り振られています。当該のデバイスをダブルクリックすることで、
エラー コードを確認することができます。

 

以下の KB には各エラー コードの説明と対応策が記載されています。
これを参考に Windows 8.1 までの OS 上でトラブルシューティングを行うことができます。

Windows のデバイス マネージャーのエラー コード
https://support.microsoft.com/kb/310123/ja-jp (日本語機械翻訳)
https://support.microsoft.com/kb/310123/en-us (英語)

===============
(C) devcon.exe
===============
devcon.exe は、デバイス マネージャーと同等の機能を持つコマンド ライン ツールです。
コマンド プロンプトでデバイスのトラブルシューティングをする場合に最適です。

以下は devcon.exe を使ってデバイスを有効化した例です。

 

devcon.exe は、Windows Driver Kit (WDK) の中に含まれておりますので、WDK を
インストールすることで、devcon.exe を入手できます。現在の最新の WDK の
インストーラーは以下のページにあります。

WDK と WinDbg のダウンロード
https://msdn.microsoft.com/ja-jp/windows/hardware/hh852365
※ [WDK 8.1 Update のダウンロード] にあります

なお、WDK 8.1 内のデフォルトの devcon.exe の保存場所は以下のとおりです。

- x86 版
  C:\Program Files (x86)\Windows Kits\8.1\Tools\x86\devcon.exe
- x64 版
  C:\Program Files (x86)\Windows Kits\8.1\Tools\x64\devcon.exe

詳細なツールの使い方は、以下の技術文書に記載があります。

デバイス マネージャーとして機能する DevCon コマンド ライン ユーティリティ
https://support.microsoft.com/kb/311272/ja

余談ですが、devcon.exe はデバイスのトラブルシューティング以外でも、スクリプトに
組み込むことで日々の運用にも使用できます。例えば、現在 OS に接続されていないデバイスの中から、
クラスが「ポータブル デバイス」のものを全て削除したい場合、以下のような VB スクリプトを
用意することで実現できます。

on error resume next
' 未接続を含む ポータブル デバイスの一覧を取得します
Set objShell = CreateObject("WScript.Shell")
If UCase(objShell.Environment("Process").Item("PROCESSOR_ARCHITECTURE")) = "X86" Then
    strDevcon = "x86\devcon.exe"
Else
    strDevcon = "x64\devcon.exe"
End If
Set outExec = objShell.Exec(strDevcon & " findall =WPD")
Set outStream = outExec.StdOut

' 現在接続されているデバイスの一覧を取得します
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colServices = objWMIService.ExecQuery("Select * From Win32_PnPEntity")
Do While Not outStream.AtEndOfStream
  strLine = outStream.ReadLine()
  arrFields = Split(strLine," ")
  FLG = 0
  For Each objService in colServices
    ' Win32_PnPEntity の結果と devcon findall コマンドの結果を比較します
    If arrFields(0) = objService.DeviceID Then
      FLG = 1
      Exit For
    End If
  Next
  ' 比較後、一致する情報が無い (未接続デバイス) 場合、ドライバを削除します
  If FLG = 0 and not IsNumeric(arrFields(0)) Then
     If Right(arrFields(0), 1) = ":" Then
       strDevice = Left(arrFields(0), Len(arrFields(0)) - 1)
     else
       strDevice = arrFields(0)
     End If
     objShell.Run strDevcon & " remove @" & chr(34) & strDevice & chr(34)
  End If
Loop
Set colServices = Nothing
Set outStream = Nothing
Set outExec = Nothing
Set objWMIService = Nothing
Set objShell = Nothing

スクリプトの簡単な解説ですが、devcon.exe の findall オプションを使うと、未接続のデバイスも
含めた全てのデバイスのリストを出力させることができます。そして現在接続中のデバイスの一覧を
WMI から取得し、それらを突き合せることで未接続のデバイスだけを抽出しています。

また、findall オプションの引数に "=" とクラス名を付けると、特定のクラスのデバイスのみを
抽出することができます。ここではポターブル デバイス クラスだけを抽出するよう設定しています。
findall オプションの詳しい指定方法については、以下の技術文書をご参照ください。

DevCon FindAll
https://msdn.microsoft.com/ja-jp/library/windows/hardware/ff544761(v=vs.85).aspx

スクリプトの最後で、抽出した未接続のポータブル デバイスを remove オプションで
一つ一つ削除しています。

※ 上記のスクリプトはあくまでサンプルです。ご使用の際には必要に応じてカスタマイズをし、
    十分にテストをされた上でご使用ください。