PowerShellで画面解像度を取得するときは、「現在の対話セッションで使える各画面のBounds」「グラフィックスアダプターが報告する現在値」「モニターの物理解像度」「Windowsの拡大率」を区別します。Windowsには解像度専用の標準PowerShellコマンドレットがないため、Windows FormsのScreenクラスやWin32_VideoControllerを読み取ります。RDP、仮想マシン、ヘッドレス端末では値の意味が変わる点に注意が必要です。
何を「解像度」として取得したいか決める
アプリの画面配置なら対話セッションの作業領域、資産管理なら接続モニターとアダプター、表示障害なら現在の幅・高さ・拡大率、リモートサポートならRDPセッションのサイズが必要です。同じ1920×1080でも、拡大率150%、仮想デスクトップ、複製表示では見える領域が異なります。目的と対象セッションを記録します。
PowerShellをサービスやタスクの非対話セッションで実行すると、画面が存在しない、仮想画面、既定値だけが返ることがあります。リモートPowerShellで取得した値は、利用者のログオンセッションではなく管理セッションの状態を反映する場合があります。誰がどこで実行した結果かを明確にします。
Windows FormsのScreenクラスを利用する
Windowsデスクトップ上ではAdd-Type -AssemblyName System.Windows.Formsの後、[System.Windows.Forms.Screen]::AllScreensで画面一覧を取得できます。各ScreenにはDeviceName、Bounds、WorkingArea、Primary、BitsPerPixelなどがあります。Bounds.WidthとBounds.Heightが、そのセッションで画面として扱われる幅と高さの手掛かりです。
例として[System.Windows.Forms.Screen]::AllScreens | Select-Object DeviceName,Primary,@{Name="Width";Expression={$_.Bounds.Width}},@{Name="Height";Expression={$_.Bounds.Height}}と表示できます。System.Windows.FormsはWindows向けで、LinuxやmacOSのPowerShellでは同じ方法を前提にしません。利用可能性を確認してから実行します。
BoundsとWorkingAreaを区別する
Boundsは画面全体の矩形、WorkingAreaは通常タスクバーなどを除いたアプリ利用可能領域です。ウィンドウを最大化したサイズを決めたい場合はWorkingArea、画面キャプチャや配置の基準にはBoundsを使うなど、目的で選びます。タスクバーの位置、自動的に隠す設定、複数画面で値が変わります。
複数モニターでは左や上に置いた画面のXまたはY座標が負になる場合があります。WidthとHeightだけでなくBounds.X、Bounds.Yを記録すると配置を再現できます。Primaryは主画面を示します。画面順は固定と想定せず、DeviceNameと座標で識別します。
Win32_VideoControllerの現在値を確認する
Get-CimInstance -ClassName Win32_VideoController | Select-Object Name,CurrentHorizontalResolution,CurrentVerticalResolution,CurrentRefreshRateで、ビデオコントローラーが報告する現在の水平・垂直解像度やリフレッシュレートを確認できます。Microsoftのクラス資料では各プロパティの意味と対応状況を確認できます。
値が空、複数アダプターで重複、実際のモニター数と一致しない場合があります。ノートPCの統合GPUと外付けGPU、DisplayLink、仮想アダプター、RDPドライバーなどが列挙されるためです。この方法だけで各物理モニターの解像度を完全に対応付けず、Screen結果や設定画面と照合します。
拡大率とDPIは解像度とは別
Windowsの拡大率が125%や150%でも、Screen.Boundsはデスクトップ座標として扱われ、アプリのDPI認識方式により見える値が変わる場合があります。解像度が正しいのにアプリがぼやける、文字が大きすぎる場合は、拡大率、アプリのDPI対応、モニター間の拡大率差を確認します。
PowerShellホスト自身がDPI Awareか、Windows PowerShellとPowerShell 7、Terminal、ISEで結果が違う可能性があります。正確なDPI取得やアプリ配置が目的なら、Win32 APIとDPI認識コンテキストを扱う専用コードが必要です。単純な解像度一覧をDPI計測と混同しません。
RDPと仮想環境ではセッションサイズを読む
リモートデスクトップでは、接続時に選んだ解像度やウィンドウサイズ、複数モニター設定がリモートセッションの画面として見えます。接続先の物理モニター解像度を取得しているとは限りません。RDPウィンドウをリサイズすると動的解像度変更で値が変わる場合があります。取得時刻と接続モードを記録します。
仮想マシンのコンソール、VDI、クラウドPCでも仮想ディスプレイドライバーが値を提供します。ヘッドレスサーバーでは解像度が空または既定値になることがあります。監視で「解像度不正」と判定する前に、物理端末、RDP、VM、非対話セッションを分類し、それぞれの期待値を設定します。
結果をCSVへ保存して比較する
Screen結果をSelect-ObjectでDeviceName、Primary、Bounds座標、Width、Height、WorkingAreaへ展開し、Export-Csvで保存できます。BoundsオブジェクトをそのままCSVへ渡すと文字列表現になり比較しにくいため、個別の数値列へ分けます。端末名、ユーザーセッション、取得時刻も追加します。
表示構成はドッキング、ケーブル、スリープ復帰、ドライバー更新で変わります。一回の棚卸しを恒久情報とせず、障害発生時と正常時を比較します。ユーザー名やDeviceNameが資産情報に該当する場合、CSVの保存先と閲覧権限を制限します。
取得後の検証と設定変更の注意
PowerShell結果は「設定」「システム」「ディスプレイ」の画面で、接続モニター、配置、解像度、拡大率、主画面と照合します。既知のテスト画面を表示し、ウィンドウが期待するモニターへ移動できるか、文字や画像が鮮明かを確認します。値だけ正常でもケーブルやEDID、ドライバー問題は残ることがあります。
解像度を変更するPowerShellやAPI操作は、画面が見えなくなる、RDP接続が切れる、利用者作業へ影響する可能性があります。この記事は取得に限定し、変更を自動化しません。変更が必要なら、サポートされる設定画面や管理ポリシーを使い、元の値、利用者通知、復旧方法を準備します。
実務での確認チェックリスト
- 目的が画面Bounds、作業領域、アダプター値、物理解像度のどれかを決める
- System.Windows.Forms.ScreenのAllScreensで対話セッションを確認する
- BoundsとWorkingArea、座標、Primaryを分けて記録する
- Win32_VideoControllerの値をScreen結果と照合する
- DPI・拡大率と解像度を混同しない
- RDP・VM・非対話セッションの値を物理モニターと誤認しない

コメント