Windowsでモニターの型番とシリアル番号をPowerShellで一括取得する方法

Windows環境で接続されているモニターの型番やシリアル番号をまとめて把握したい、という場面は資産管理や問い合わせ対応でよくあります。この記事では、PowerShellだけを使ってメーカー名・モデル名・シリアル番号を安全かつ再利用しやすい形で取得する実践的な方法を詳しく解説します。

目次

Windowsで「モニターの型番・シリアル番号」を自動取得したい理由

社内PCや自宅の複数ディスプレイ環境では、次のようなシーンで「モニターの型番(モデル名)とシリアル番号」を知りたくなることがあります。

  • 資産管理台帳に、PCだけでなくディスプレイも登録したい
  • モニターの不具合でメーカーサポートに問い合わせる際、シリアル番号を一括で取得したい
  • テレワーク用に貸し出しているモニターの返却確認を行いたい
  • 多数の端末に接続されたディスプレイ構成を棚卸ししたい

しかし、実際にはモニター背面のラベルを1台ずつ目視するのはとても非効率です。WindowsとPowerShellを活用すれば、ユーザーの操作は「スクリプトを1回実行するだけ」で、メーカー名・モデル名・シリアル番号を一括で収集できます。

PowerShellでモニター情報を取得する仕組み(EDIDとWmiMonitorID)

Windowsは、接続されたディスプレイから「EDID(Extended Display Identification Data)」という情報を取得しています。EDIDには以下のような情報が含まれます。

  • メーカー名(Vendor ID)
  • 製品コード(Product ID)
  • ユーザーフレンドリー名(いわゆる型番・モデル名に相当)
  • シリアル番号
  • 解像度やリフレッシュレートなどの対応情報

PowerShellからは、このEDID情報の一部をWMI / CIMの WmiMonitorID クラス経由で取得できます。WmiMonitorID には、次のようなプロパティが用意されています。

プロパティ名役割データ型のイメージ
ManufacturerNameモニターのメーカー名(3文字程度のベンダーID)0埋めを含む文字コードの数値配列
UserFriendlyNameユーザーフレンドリー名(型番・モデル名に相当)同上(0埋め混在の数値配列)
ProductCodeID製品コード(機種を識別するID)同上
SerialNumberIDモニターのシリアル番号同上
Active現在使用中かどうか(True / False)ブール値

ポイントは、文字列に見える情報がそのまま文字列ではなく、「文字コードの数値配列+0埋め」になっているという点です。そのまま表示すると、余分な0や空白が混じってしまうため、PowerShell側で少し整形してあげる必要があります。

推奨:Get-CimInstanceでEDID文字列を整形して取得する方法

現在のPowerShellでは、従来の Get-WmiObject よりも、後継である Get-CimInstance の利用が推奨されています。特に PowerShell 7 以降の環境では、Get-CimInstance を使っておくと将来も安心です。

まずは、EDIDの数値配列からきれいな文字列を作る小さな関数を用意し、その関数を使ってメーカー名・モデル名・シリアル番号を整形して取得するサンプルです。

# EDID配列(0埋め混在)を文字列に整形する小関数
function Convert-EDIDString {
  param([int[]]$Value)
  (($Value | Where-Object { $_ -ne 0 } | ForEach-Object { [char]$_ }) -join '').Trim()
}

# すべてのモニター情報を取得(使用中だけに絞るなら | Where-Object Active)
Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorID |
  ForEach-Object {
    [pscustomobject]@{
      メーカー名   = Convert-EDIDString $_.ManufacturerName
      モデル名     = Convert-EDIDString $_.UserFriendlyName   # いわゆる「型番」に近い
      製品コード   = Convert-EDIDString $_.ProductCodeID
      シリアル番号 = Convert-EDIDString $_.SerialNumberID
      使用中フラグ = $_.Active
    }
  }

スクリプトの流れを分解して理解する

  • Convert-EDIDString 関数では、EDID配列から 0 の要素を除外し、残りを [char] で文字に変換して結合しています。
  • Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorID で、接続されているモニターのEDID情報をWMI(CIM)から取得します。
  • ForEach-Object の中で、1台のモニターごとに [pscustomobject] を作り、見やすい日本語プロパティ名にして出力しています。
  • 使用中フラグ は True / False で、OSが「現在使っている」と判断しているモニターかどうかを表します。

実行すると、環境にもよりますが次のようなイメージで結果が出力されます。

メーカー名モデル名製品コードシリアル番号使用中フラグ
DELLU2720Q0001ABCD1234XYZTrue
DELLP2419H0002EFGH5678JKLFalse

このように、1回のスクリプト実行で、複数モニターのメーカー名・型番・シリアル番号をまとめて取得できるのが大きなメリットです。

実際の実行手順(初心者向け)

  1. スタートメニューから「Windows PowerShell」または「PowerShell」を検索して起動します。
    ※ PowerShell 7 を使用している場合は「PowerShell 7」や「pwsh」と表示されます。
  2. 上記スクリプトをウィンドウにコピー&ペーストします。
  3. Enterキーを押して実行します。
  4. 数秒待つと、モニターの一覧が表示されます。内容を確認して、必要であればコピーしてメモ帳やExcelに貼り付けることもできます。

最短で確認したいときのワンライナー(加工最小)

毎回関数を定義するのが面倒な場合は、次のような「ワンライナー」に近い形で、必要な情報だけを取り出すこともできます。

Get-CimInstance -Namespace root\wmi -Class WmiMonitorID |
  Select-Object @{
    n='メーカー名';e={($_.ManufacturerName | ? {$_ -ne 0} | % {[char]$_}) -join ''}
  },@{
    n='モデル名';e={($_.UserFriendlyName | ? {$_ -ne 0} | % {[char]$_}) -join ''}
  },@{
    n='シリアル番号';e={($_.SerialNumberID | ? {$_ -ne 0} | % {[char]$_}) -join ''}
  }

この方法では、Convert-EDIDString 関数を定義せずに、Select-Object の中でインラインで文字列化を行っています。スクリプトファイルとして配布するなら関数版のほうが読みやすく保守もしやすいですが、その場でサッと確認したいだけならこの書き方も非常に便利です。

レガシー環境向け:Get-WmiObject版(互換性重視)

古いスクリプトや、Windows PowerShell 5.1 のみがインストールされている環境では、従来の Get-WmiObject を使ったサンプルのほうが馴染み深い場合もあります。互換性を重視した例を以下に示します。

Get-WmiObject WmiMonitorID -Namespace root\wmi |
  Select-Object @{
    l='メーカー名';e={[Text.Encoding]::ASCII.GetString($_.ManufacturerName)}
  },@{
    l='モデル名';e={[Text.Encoding]::ASCII.GetString($_.UserFriendlyName)}
  },@{
    l='シリアル番号';e={[Text.Encoding]::ASCII.GetString($_.SerialNumberID)}
  }

この書き方では、EDIDの数値配列を [Text.Encoding]::ASCII.GetString() で一気に文字列化しています。ただし、環境によっては末尾に余分な空白や制御文字が含まれることがあるため、必要に応じて .Trim() などで整形するとよりきれいな出力になります。

とはいえ、Get-WmiObject は今後非推奨となっていく方向であり、PowerShell 7 以降では動作しないケースも出てきます。そのため、新しく作るスクリプトは基本的に Get-CimInstance に統一することをおすすめします。

項目Get-CimInstanceGet-WmiObject
位置付けWMIの後継。今後の主流レガシーAPI。非推奨方向
PowerShell 7 でのサポート標準で利用可能基本的に利用不可
リモート管理機能WS-Manベースで柔軟DCOMベースで制約多め
新規スクリプトでの推奨推奨互換用途に限定

実運用で役立つ発展例

CSVにエクスポートして資産管理台帳に取り込む

モニター情報は「その場で見るだけ」で終わらせず、CSV形式にしておくとExcelや資産管理ツールにそのまま取り込めるようになります。以下は、前述の Get-CimInstance の結果をCSVに出力する例です。

$mon = Get-CimInstance -Namespace root\wmi -Class WmiMonitorID | ForEach-Object {
  [pscustomobject]@{
    Maker  = (($_.ManufacturerName | ? {$_ -ne 0} | % {[char]$_}) -join '')
    Model  = (($_.UserFriendlyName  | ? {$_ -ne 0} | % {[char]$_}) -join '')
    Serial = (($_.SerialNumberID    | ? {$_ -ne 0} | % {[char]$_}) -join '')
    Active = $_.Active
  }
}
$mon | Export-Csv -Path .\Monitors.csv -NoTypeInformation -Encoding UTF8

このスクリプトを実行すると、カレントディレクトリに Monitors.csv が作成されます。Excelで開くと、次のようなイメージになります。

MakerModelSerialActive
DELLU2720QABCD1234XYZTrue
DELLP2419HEFGH5678JKLFalse

あとは、このCSVを社内の資産管理台帳やインベントリ管理ツールに取り込めば、PCごとに接続されているモニターをきれいに紐付けて管理することができます。

使用中のモニターだけに絞って出力する

デスクに何台もモニターをつないでいる環境では、「今は使っていないけれどケーブルだけつながっているモニター」が混ざることがあります。その場合は、Active プロパティが $true のものだけに絞ると運用しやすくなります。

Get-CimInstance -Namespace root\wmi -Class WmiMonitorID |
  Where-Object Active |
  ForEach-Object {
    [pscustomobject]@{
      メーカー名   = (($_.ManufacturerName | ? {$_ -ne 0} | % {[char]$_}) -join '')
      モデル名     = (($_.UserFriendlyName  | ? {$_ -ne 0} | % {[char]$_}) -join '')
      シリアル番号 = (($_.SerialNumberID    | ? {$_ -ne 0} | % {[char]$_}) -join '')
    }
  }

「今まさに表示に使われているモニターだけ」を対象にしたい場合は、このように Where-Object Active でフィルタリングしておくのがおすすめです。

マルチモニター環境で「どの画面がどのモニターなのか」を対応付けるコツ

シリアル番号の一覧が取れても、「どの物理モニターがどの行に対応しているのか」が分からないと困る場合があります。完全に自動で一致させるのは難しいケースもありますが、次のような手順でかなり絞り込むことができます。

  • ディスプレイ設定で「識別」を押す
    Windowsの「設定」→「システム」→「ディスプレイ」で「識別」ボタンを押すと、各モニターに1, 2, 3…と大きな番号が表示されます。
  • スクリプトでインスタンス名や解像度も一緒に取得する
    別クラス(例:WmiMonitorBasicDisplayParams など)から解像度やサイズ情報を取得し、モデル名とセットで一覧にしておくと、見た目と照合しやすくなります。
  • モデル名+サイズで推測する
    例えば「U2720Q」が27インチ4K、「P2419H」が24インチフルHDと分かっていれば、画面を見ただけでどちらか判断しやすくなります。

厳密なマッピングが必要な場合は、ユーザーに「今この画面に表示されている型番を教えてください」といった運用の工夫も組み合わせるとよいでしょう。

うまく取得できないときのチェックポイントと注意点

モニターの型番やシリアル番号は、必ずしもすべての環境で取得できるとは限りません。うまく出ないときに確認すべきポイントを整理しておきます。

症状よくある原因対処・確認ポイント
シリアル番号が空欄になるモニター側がEDIDにシリアル番号を書き込んでいない
USB接続モニター・KVMスイッチ経由など
HDMI/DisplayPortで直接接続してみる
別のPCに接続しても同じ結果か確認する
モデル名が略称・ブランド込みで返るモニターの設計上の仕様(EDIDの記載そのもの)「U2720Q」「DELL U2720Q」など、形が違っても同じ機種として扱うルールを決める
リモートデスクトップ経由だと何も出ないRDPセッションでは物理モニターが直接見えない対象PCに物理的にログオンするか、リモートでもコンソールセッション側で実行する
仮想マシン上ではモニターが1台としてしか見えないハイパーバイザーや仮想GPUが抽象化している物理ホスト側で実行するか、モニター管理はホスト側のポリシーに統一する
管理者として実行しないと不安WMI/CIMクラスの読み取り権限の誤解今回のクラスは原則「通常ユーザー」で読み取り可能。不要な管理者実行は避けても問題ないケースがほとんど

特に重要なのは、シリアル番号やモデル名は「モニター側がEDIDで提供している」ことが前提という点です。古い機種や、一部のUSBモニター・ドッキングステーション経由の接続では、そもそもEDIDが正しく伝わらず、PowerShell側ではどうしようもないケースもあります。

スクリプトを自分の環境向けにカスタマイズするアイデア

ここまで紹介したスクリプトは「汎用的に動く最小構成」です。実際の運用では、業務や環境に合わせてカスタマイズするとさらに便利になります。

PC名やユーザー名も一緒に出力する

資産管理の観点では、「どのPCにどのモニターがつながっているか」を紐付けたいことが多いです。その場合、$env:COMPUTERNAME や $env:USERNAME を追加してしまいましょう。

$computer = $env:COMPUTERNAME
$user     = $env:USERNAME

Get-CimInstance -Namespace root\wmi -Class WmiMonitorID |
  ForEach-Object {
    [pscustomobject]@{
      PC名        = $computer
      ユーザー名  = $user
      メーカー名  = (($_.ManufacturerName | ? {$_ -ne 0} | % {[char]$_}) -join '')
      モデル名    = (($_.UserFriendlyName  | ? {$_ -ne 0} | % {[char]$_}) -join '')
      シリアル番号= (($_.SerialNumberID    | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Active      = $_.Active
    }
  }

この結果をCSVにすれば、「どのPCのどのユーザーが、どのモニターを使っているか」が一目で分かります。

特定メーカーだけを抽出する

例えば「DELL製モニターだけ一覧にしたい」といった場合は、変換後の文字列に対してフィルタをかけても良いですが、処理の都合上、次のように「一旦オブジェクトを作ってからWhere-Objectで絞る」形にすると分かりやすくなります。

$monitors = Get-CimInstance -Namespace root\wmi -Class WmiMonitorID |
  ForEach-Object {
    [pscustomobject]@{
      Maker  = (($_.ManufacturerName | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Model  = (($_.UserFriendlyName  | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Serial = (($_.SerialNumberID    | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Active = $_.Active
    }
  }

$monitors | Where-Object { $_.Maker -eq 'DELL' }

このように一度変数に格納しておけば、あとからメーカー別・Activeフラグ別に何度でも絞り込みができるので、ログ分析やレポート作成にも応用しやすくなります。

JSON形式にして他ツールと連携する

最近のシステム連携では、CSVだけでなくJSON形式でやり取りすることも増えています。PowerShellオブジェクトは ConvertTo-Json を使うだけで簡単にJSON化できます。

Get-CimInstance -Namespace root\wmi -Class WmiMonitorID |
  ForEach-Object {
    [pscustomobject]@{
      Maker  = (($_.ManufacturerName | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Model  = (($_.UserFriendlyName  | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Serial = (($_.SerialNumberID    | ? {$_ -ne 0} | % {[char]$_}) -join '')
      Active = $_.Active
    }
  } | ConvertTo-Json -Depth 3

このJSONをWeb APIや管理ツールにPOSTするような形に発展させれば、「PowerShellでモニター情報を取得 → 別システムに自動連携」といったワークフローも構築できます。

セキュリティと権限面の整理

WMI / CIMでハードウェア情報を取得する場合、「管理者権限が必要なのでは?」と不安になる方も多いです。今回利用している WmiMonitorID のような読み取り専用の情報は、基本的に通常ユーザー権限でアクセス可能です。

  • モニターのEDID情報は読み取り専用であり、OSやハードウェア構成を変更するものではありません。
  • ドメイン環境などでWMIアクセスが制限されている場合を除き、一般ユーザーでも問題なく取得できます。
  • 万一ポリシーで制限されている場合は、情報システム部門と相談し、必要なクラスのみ許可する運用を検討しても良いでしょう。

「毎回管理者としてPowerShellを起動する」という運用は、逆にリスクになる場合もあります。今回の用途は通常権限で十分ということをチーム内で共有しておくと安心です。

まとめ:WmiMonitorIDのEDID配列を文字列化すれば、メーカー名・モデル名・シリアル番号を一括取得できる

Windowsで接続中のモニター情報(型番・シリアル番号)を取得するポイントを整理すると、次のようになります。

  • モニター情報はEDIDとしてモニター側から提供され、WmiMonitorID クラス経由で参照できる。
  • ManufacturerName / UserFriendlyName / ProductCodeID / SerialNumberID は、0埋めを含む数値配列なので、0を除外して1文字ずつ結合する必要がある。
  • Get-CimInstance を使えば、PowerShell 7 以降でも安定してモニター情報を取得できる。
  • CSVやJSONに変換しておくと、資産管理やトラブル対応で再利用しやすく、運用効率が大きく向上する。
  • シリアル番号・モデル名が取得できるかどうかはモニター依存であり、USBモニターや古い機種では空欄になることもある。

つまり、WmiMonitorID のEDID配列から0埋めを取り除いて文字列化するだけで、メーカー名・モデル名(型番)・シリアル番号をPowerShellだけで確実に取得できます。特に、Get-CimInstance+整形関数の組み合わせは短く書けて再利用もしやすく、CSV出力まで含めて一気通貫で運用できるのが大きな利点です。

日々の手作業を減らし、ミスのない資産管理やトラブルシューティングを行うために、ぜひ自分の環境に合わせてスクリプトをカスタマイズしながら活用してみてください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次