消えたモニタを探せ!

Adways Advent Calendar 15日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar/archive


みなさんこんにちは。インフラDivの須藤です。このブログを書くのも実に2年ぶりとなりました。
前回はiOSデベロッパーアカウントの管理について執筆させていただきました。
今回は、ハードウェアや備品の管理をバッチファイルを書いて行うという、非常にマニアックなネタを紹介したいと思います。

資産管理の部署のみなさん。どこの誰に備品を貸したか忘れちゃった、または備品を貸したっきり戻ってこない!なんて事ありませんか?
そんな資産管理部門の悩みを解決するべくWindowsのバッチファイルを作りました。

情報収集

まず、モニタを探す手がかりですが、モニタには シリアル番号という固体固有の番号があります。通常は外箱だったり、モニタの背面シールに記載されているのですが、モニタがPCに接続されていれば、レジストリ情報から取ってくることができます。

以下の図はregeditというWindowsのアプリケーションで、レジストリをGUIでカスタマイズするものです。

f:id:AdwaysEngineerBlog:20161219181130p:plain

モニタに関する情報はEDIDという場所に記載されています。シリアル番号が異なるモニタを接続する台数が増えた分だけ、ここのレジストリに登録されます。

因みに接続されていないモニタ、または無効なモニタの場合BAD_EDIDと記録されています。

f:id:AdwaysEngineerBlog:20161219181140p:plain

これですね。

f:id:AdwaysEngineerBlog:20161219181151p:plain

EDIDは最初からバイナリ値ではありません。16進数をバイナリ値に変換した値がシリアル番号として認識できる値となります。

f:id:AdwaysEngineerBlog:20161219181210p:plain

16進数からバイナリ値への変換

16進数からバイナリ値に変換するDOSコマンドはcertutilを使います。
certutilは証明書の管理するコマンドとして知られていますが、エンコードやデコードできることはあまり知られていないようです。(私もバッチファイルを作るまで知りませんでした)このコマンドに-decodehexオプションをつけるとバイナリ値に変換できます。
因みにエンコードする場合は、-encodehex、そのまんまですね。以下に参考URLを載せておきます。

https://technet.microsoft.com/en-us/library/cc732443(v=ws.11).aspx

何台かモニタを試しましたが、DELLのモニタの場合、16進数の176桁目から202桁目までにシリアル番号が記録されているようです。ですので、このコマンドを使ってシリアル番号を取得してみました。

以下はバッチファイルの一部です。EDID値の176桁目から202桁目を取得し、certutilコマンドでバイナリ値に変換しています。

for /F "usebackq tokens=*" %%s in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\%%t" /s^|findstr EDID`) DO @SET RESULT=%%s
    if not "!RESULT!" EQU "" (
    set DISPNUM=!RESULT:~176,26!
    echo !DISPNUM! > %AUDITDIR%\cache\%computername%\serial.txt
    certutil -f -decodehex %AUDITDIR%\cache\%computername%\serial.txt %AUDITDIR%\cache\%computername%\serial.txt.bin
    for /F "usebackq tokens=*" %%t in (`type     %AUDITDIR%\cache\%computername%\serial.txt.bin`) DO @SET mon_seri=%%t

    if "!mon_seri!" == "!mon_seri_back!" goto HW_check

応用してみる

上記のバッチファイルとExcelのマクロを連携すれば、モニタの所有者の検索もできます。

f:id:AdwaysEngineerBlog:20161219181221p:plain

※PC番号はモザイク加工しました。

この他にも、モニタの管理台帳(使用者とモニタのシリアル番号一覧をエクセルで出力したもの)を出力することも可能です。

f:id:AdwaysEngineerBlog:20161219181229p:plain

※個人情報や機密情報に関わる部分はダミーデータに加工しています。
※昭和臭がプンプンしますね(汗)。申し訳ありません。

今後の課題

実はこのバッチファイル、まだ完全ではありません。
PCの電源を入れたときにバッチファイルが実行されるように作成していますが、PCによってはバッチファイルがうまく実行されない場合があります。
それゆえ、地味な割にはバッチのメンテナンスに掛ける人的コストが大きいので、なかなか改善に時間が割けられていないのが現状です。

とはいえ、このバッチファイルで7~8割程度のモニタの所有者を判別できるようになったので、世に出回る資産管理ツールで、モニタのシリアル番号を取得し管理できるツールはまだ存在しないので(2016年12月時点)、時間の許す限りメンテナンスはちょっとずつ続けていきたいと思います。


次は古川さんの記事です。

http://blog.engineer.adways.net/entry/advent_calendar/16