Windowsの環境を報告するときはdxdiagで確認しよう

# はじめに

障害の報告チケットなどでWindowsの環境情報を記入する欄がありますが、何を書くのか困ることはありませんか？

あるいは障害が発生した場合に発生環境の記載がばらばらで管理できていないことはありませんか？

環境情報を記載する場合は、システムのプロパティのOSやCPU情報を手動で入力している人が多いように感じます。

dxdiagでいい感じの情報が取れるのに、あまり普及しているように感じないので、ざっくり紹介してみます。



# DirectXの情報を取得するんでしょ？

dxdiagは「DirectX 診断ツール」というツールです。
DirextXっぽい情報も取得していますが、それ以前の基本的な情報もいろいろ取得できます。

上司や先輩が使っていなくても、積極的に使っていきましょう。

dxdiagを知らない先輩は、業務用アプリを作ってるんだからDirectXなんて関係ないでしょ。ゲームを作ってるんじゃないだよ？
みたいなこと言ったりするかもしれません。

ですが、現在のWindowsは全部DirectX入ってるし、dxdiagも標準でインストールされています。
DirectXを使ってWindows標準アプリも実装されているし、ゲーム用ってわけでもないです。~~いつの時代の知識だよ。。。~~

保守的な人が反対したとしても、大抵の場合は「Windows標準の機能です」で突破できると思います。



# dxdiagを起動してみる

コマンドプロンプトで以下を実行します。

```

dxdiag

```

画面が起動して、PCの情報がいろいろ表示されます。
システムのプロパティより情報は細かく表示され、開発や障害調査に必要な情報が取得できます。

![dxdiag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/68a423f8-1126-9dfa-db61-f3f36558ed92.png)



# オプションの確認

適当な引数をつけてdxdiagを起動すると、ヘルプのメッセージボックスが表示されます。

```

dxdiag /?

```

以下の引数が実装されているようです。


```

使用法: dxdiag [/dontskip] [/whql:on | /whql:off] [/x 出力ファイル] [/t 出力ファイル]
/x 出力ファイル	- 画面に情報を表示せずに XML 情報を <出力ファイル> に保存し、終了します。
/t 出力ファイル	- 画面に情報を表示せずにテキスト情報を <出力ファイル> に保存し、終了します。
/dontskip	- dxdiag で以前に発生したクラッシュに関する診断を回避しません。
/whql:on	- dxdiag が WHQL デジタル署名を確認することを許可します。
/whql:off	- dxdiag が WHQL デジタル署名を確認することを許可しません。
注意: WHQL デジタル署名の確認を許可した場合、インターネット接続を使って WHQL 証明書が更新されることがあります。

```

テキストで出力できるオプションがあるので、これで情報を取得しておきましょう。


# テキストで出力する

画面から「情報をすべて保存」ボタンを押下するとテキストで保存できます。

コマンドプロンプトで出力する場合は以下を実行します。

```

dxdiag /t out.txt

```


カレントディレクトリにout.txtが出力されているはずです。

一番上のSystem Informationの情報があれば、基本的なWindowsの環境の情報としては十分だと思います。
GUI系やGPUコンピューティングの人はDisplay Devicesの情報も必要かもしれません。


```out.txt

------------------
System Information
------------------
      Time of this report: 10/24/2019, 00:00:00
             Machine name: xxxxx
               Machine Id: xxxxx
         Operating System: Windows 10 Pro 64-bit (10.0, Build 18362) (18362.19h1_release.190318-1202)
                 Language: Japanese (Regional Setting: Japanese)
      System Manufacturer: xxxxx
             System Model: xxxxx
                     BIOS: 5.011 (type: UEFI)
                Processor: Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz (4 CPUs), ~2.2GHz
                   Memory: 8192MB RAM
      Available OS Memory: 8108MB RAM
                Page File: 5395MB used, 4632MB available
              Windows Dir: C:\WINDOWS
          DirectX Version: DirectX 12
      DX Setup Parameters: Not found
         User DPI Setting: 120 DPI (125 percent)
       System DPI Setting: 144 DPI (150 percent)
          DWM DPI Scaling: Disabled
                 Miracast: Available, with HDCP
Microsoft Graphics Hybrid: Not Supported
 DirectX Database Version: Unknown
           DxDiag Version: 10.00.18362.0387 64bit Unicode

(以下略)

```




# 使うときに気を付けること


いろんな情報が出力されているので、意図せずに機密情報が漏れる可能性があります。

問題になる例としては以下のようなことが想定されます。

- 使用しているハードウェアやソフトウェアの情報が洩れるとセキュリティの穴になってしまう
- ドライバを開発している場合に開発製品名が設定ファイルに保存されるので情報が流出してしまう

必要な情報のみを切り出して使うようにしましょう。
次に出力したXMLをパースして必要情報のみを取得する方法を記載します。



# XMLを出力してパース

xオプションで、xmlファイルに出力することができます。
パースして必要な環境情報を抽出することで安全に情報が利用できます。


PowerShellでパースするならば、以下のような感じ

```powershell:dxdiag.ps1

$xml_file_name = (Get-Date).ToString("yyyyMMdd_HHmmss") + ".xml"

dxdiag.exe /x $xml_file_name
# 処理待ち
$nid = (get-process dxdiag).id
wait-process -id $nid

# UTF8指定が必要
$file_data = Get-Content -Encoding UTF8 $xml_file_name

$xml_doc = [XML]($file_data)
$xml_navigator = $xml_doc.CreateNavigator()

function print_node($path){
  $nodes = $xml_navigator.Select($path)
  While ( $nodes.MoveNext() ){
    Write-Host $nodes.Current.Name ":" $nodes.Current.Value
  }
}

# 表示したい情報をパスで指定
print_node("/DxDiag/SystemInformation/OperatingSystem")
print_node("/DxDiag/SystemInformation/Language")
print_node("/DxDiag/SystemInformation/Processor")
print_node("/DxDiag/SystemInformation/Memory")
print_node("/DxDiag/DisplayDevices/DisplayDevice/CardName")

pause


```

print_node()に渡すpathを変更して必要な情報を取得してください。



## 実行

エクスプローラーでdxdiag.ps1を右クリックし[PowerShellで実行]

![2019-10-24 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264524/491e9369-09f2-2e1c-d5f2-903f71030b69.png)



# おわりに

環境の報告でCPUの型番がないと困るという旨の記事を読んで、あるあるだなーと思ったので、私がやっている方法についてまとめてみました。

環境報告をする新人さんはdxdiagを使って正確な環境情報を報告できるようになってください。

そして、管理者の方はdxdiagで自動的に環境情報を収集することでうまくプロジェクトを管理してもらえればと思います。
私はIntel CPUの世代やドライバのバージョンに依存する問題が発生した時にこの方法にたどりつきました。
障害が発生する現場に調査チームを派遣する場合もまずこの情報をとってもらうことを徹底することで調査の工数がかなり削減できました。




[サンプルソース置き場](https://github.com/part-time-penguin/qiita_powershell_samples)