こんにちは。Windows プラットフォーム サポートの北原です。
今回は、デバイスのトラブルシューティングに利用頂けるツールをいくつかご紹介したいと思います。
===============
(A) デバイスのトラブルシューティング ツール
===============
Windows 7 及び Windows 8 には、デバイスの問題を自動的に検出し、修復を試みる
ツールが OS に付属されています。何かデバイスの問題が発生した際には、まずこちらを
試してみることをお勧めします。以下はトラブルシューティング ツールの起動手順です。
1. コントロール パネルを開きます
2. [システムとセキュリティ] をクリックします
3. [コンピューターの問題のトラブルシューティング] をクリックします
4. [デバイスを構成する] をクリックします
5. ウィザードに従ってトラブルシューティングを行います
Windows トラブルシューティング - Microsoft Windows
http://windows.microsoft.com/ja-jp/windows7/products/features/windows-troubleshooting
Windows Vista は OS に組み込まれておりませんが、以下のページからツールの入手が必要です。
Windows でのトラブルシューティング - Windows ヘルプ
http://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 のデバイス マネージャーのエラー コード
http://support.microsoft.com/kb/310123/ja-jp (日本語機械翻訳)
http://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 のダウンロード
http://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
詳細なツールの使い方は、以下の KB に記載があります。
デバイス マネージャーとして機能する DevCon コマンド ライン ユーティリティ
http://support.microsoft.com/kb/311272/ja
余談ですが、devcon.exe はデバイスのトラブルシューティング以外でも、運用で使う
スクリプトに組み込むことでも使用できます。例えば、OS の起動時に現在未接続の
USBデバイスを削除したい場合、以下のような VB スクリプトを用意して、スタート
アップに設定することで実現できます。
on error resume next
' 以下のデバイスの一覧 (未接続デバイスを含む) を取得します
' ディスク ドライブ
' ポータブル デバイス
' ユニバーサル シリアル バス コントローラー
' 記憶域ボリューム
Set objShell = CreateObject("WScript.Shell")
If UCase(objShell.Environment("Process").Item("PROCESSOR_ARCHITECTURE")) = "X86" Then
strDevcon = "devcon.exe"
Else
strDevcon = "devcon64.exe"
End If
Set outExec = objShell.Exec(strDevcon & " findall @usb* @*usbstor*")
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 オプションの引数にはワイルドカードを
設定できますので、“@usb* @*usbstor*” のように指定することで、USB 関連のデバイスのみ抽出する
ことができます。スクリプトの最後で、抽出した未接続の USB デバイスを remove オプションで一つ一つ
削除しています。
※ 上記のスクリプトはあくまでサンプルです。実際にお使いになられる場合は、
環境にあわせてカスタマイズをし、十分にテストをした上でご使用ください。