PowerShell :モニターのシリアル番号情報

PowerShell を使ってPCハードウェア情報を入手することが出来ることを前のメモに残しました。

では、パソコンにつながっているモニター情報を知ることが出来るか?
パソコンには、内蔵、外部接続という違いはあるものの、通常はモニターがなければ操作できません。モニターに関してもOSは情報をレジストリに格納しているとの情報が見つかりました。

このページの情報によると、

  • 接続されているモニターのキー情報
  • 接続されているモニター数
  • 接続されているモニター情報

がレジストリーに記録されているそうです。
レジストリに記録されているので、アクセス権さえあれば目的レジストリを開いて手作業で調べるという手もありますが、モニター情報はバイナリーデータで格納されているようです。

モニターのメーカー名やシリアル番号がスクリプトにより入手できればそれはそれで便利です。修理を行う場合に、メーカーへ連絡すれば、今の時代、何でもシリアル番号とかサービスタグですからね。できれば一つの PowerShell スクリプトの中で処理できればありがたいことです。

いろいろ検索してみましたが、残念ながら Win32_xxxxx クラスにはモニターのシリアル番号を得る方法は見つかりませんでした。しかし、WmiMonitorID class というものがあると判明。

gwmi WmiMonitorID -Namespace root\wmi

という具合に記述するようです。リモートPCの場合は、-ComputerName <host> を入れればいいだけ。

このコマンドは、結局前述のレジストリ情報をプリントしているだけのようで、シリアル番号は結局バイナリーデータで格納されているようです。余談ですが、製造年と製造週番号まで記録されています。

> gwmi WmiMonitorID -Namespace root\wmi

__GENUS                : 2
__CLASS                : WmiMonitorID
__SUPERCLASS           : MSMonitorClass
__DYNASTY              : MSMonitorClass
__RELPATH              : WmiMonitorID.InstanceName="DISPLAY\\MEL47A5\\4&75c42d1&2&UID16843008_0"
__PROPERTY_COUNT       : 9
__DERIVATION           : {MSMonitorClass}
__SERVER               : AD2700
__NAMESPACE            : root\wmi
__PATH                 : \\AD2700\root\wmi:WmiMonitorID.InstanceName="DISPLAY\\MEL47A5\\4&75c42d1&2&UID16843008_0"
Active                 : True
InstanceName           : DISPLAY\MEL47A5\4&75c42d1&2&UID16843008_0
ManufacturerName       : {77, 69, 76, 0...}
ProductCodeID          : {52, 55, 65, 53...}
SerialNumberID         : {56, 54, 50, 48...}
UserFriendlyName       : {77, 68, 84, 50...}
UserFriendlyNameLength : 13
WeekOfManufacture      : 24
YearOfManufacture      : 2008
PSComputerName         : AD2700

このクラス紹介ページにある

gwmi WmiMonitorID -Namespace root\wmi | ForEach-Object {($_.UserFriendlyName -notmatch 0 | foreach {[char]$_}) -join ""; ($_.SerialNumberID -notmatch 0 | foreach {[char]$_}) -join ""}

がバイナリ→ASCII変換になっているようで、全部そのまま実行すると、

MDT1WG
8604059CJ

と表示され製品名とシリアル番号らしい表示が行われましたが、ちょっと変。何文字か途中が抜けているようで、レジストリの値をそのまま読み取った場合と違う値になっています。でもまあ、スクリプトを書く時にちゃんと確認してコマンド行に修正を加えればいいでしょう。いずれにせよこのコマンドでモニター情報(の一部?)を取り出せることがわかりました。

コメントを残す