A question on the forum about getting monitor resolution led to this code
Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorId | foreach { $filter = ("InstanceName = '$($psitem.InstanceName)'").Replace("`\", "`\`\") $maxres = Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorListedSupportedSourceModes -Filter $filter | Select-Object -ExpandProperty MonitorSourceModes | Sort-Object -Property {$_.HorizontalActivePixels * $_.VerticalActivePixels} -Descending | Select-Object -First 1 if ($psitem.UserFriendlyNameLength -gt 0) { $name = ($psitem.UserFriendlyName -notmatch '^0$' | foreach {[char]$_}) -join "" } else { $name = 'Unknown' } $props = [ordered]@{ Manufacturer = ($psitem.ManufacturerName -notmatch '^0$' | foreach {[char]$_}) -join "" Name = $name Serial = ($_.SerialNumberID -notmatch '^0$' | foreach {[char]$_}) -join "" MaximumResolution = "$($maxres.HorizontalActivePixels) x $($maxres.VerticalActivePixels)" } New-Object -TypeName PSObject -Property $props }
NOTE – we’re working in the root\wmi namespace not PowerShell’s default of root\cimv2
Use WmiMonitorId to get the attached monitors and for each of them create a filter using the instance name. You have to replace \ with \\ when dealing with WMI.
Use WmiMonitorListedSupportedSourceModes and expand MonitorSourceModes. use sort-object to find the maximum resolution (multiply horizontal by vertical)
Create an output object. I had to deal with the name of the monitor separately because one of my monitors didn’t have a user friendly name.
Results look like this
Manufacturer Name Serial MaximumResolution ------------ ---- ------ ----------------- GSM 22EA63 304NDJX51788 1920 x 1080 LEN Unknown 0 1600 x 900