Hi there,

Has anyone had success with retrieving monitor serial numbers remotely and have them add to inventory?

if so, how did you do it?

Many thanks

0 Comments   [ - ] Hide Comments


Please log in to comment

Answer this question or Comment on this question for clarity



I modified the script from robvanderwoude.com I mentioned above to output a textfile to C:\Windows\Temp\KACE-Monitor-info.txt. I also made a custom inventory rule to return the fileinfo of that file.

It shows up in the custom inventory, but double spaced. So the only improvements it could use would be to come up single spaced, and also for some reason on my home PC, it shows 2 monitors (with same SN).

Here is the modified script.

' Script modified from
' http://www.robvanderwoude.com/files/dispedid_vbs.txt

Option Explicit

Dim blnControl
Dim i, j, k
Dim arrControl, arrKeys, arrRawEDID, arrSubKeys
Dim objReg, wshShell, objFso
Dim strComputer, strDeviceDesc, strMfg, strModel, strMsg, strKeyPath, strSerial, strSubKeyPath, strSubSubKeyPath
Dim strOutputFile, objOutputFile

'Hive Constants
Const HKEY_CLASSES_ROOT       = &H80000000
Const HKEY_CURRENT_USER       = &H80000001
Const HKEY_LOCAL_MACHINE      = &H80000002
Const HKEY_USERS              = &H80000003
Const HKEY_PERFORMANCE_DATA   = &H80000004
Const HKEY_CURRENT_CONFIG     = &H80000005
Const HKEY_DYN_DATA           = &H80000006

'RegFormat Constants
Const REG_NONE                = 0
Const REG_SZ                  = 1
Const REG_EXPAND_SZ           = 2
Const REG_BINARY              = 3
Const REG_DWORD               = 4
Const REG_LINK                = 6
Const REG_MULTI_SZ            = 7
Const REG_RESOURCE_LIST       = 8

'FileSystemObject OpenTextFile constants
Const ForReading              = 1
Const ForWriting              = 2
Const ForAppending            = 8

If WScript.Arguments.Count > 0 Then Syntax

strComputer = "."
strMsg      = ""

On Error Resume Next
Set objReg = GetObject( "winmgmts:{impersonationLevel=impersonate}!//" & strComputer & "/root/default:StdRegProv" )

strKeyPath = "SYSTEM\CurrentControlSet\Enum\DISPLAY"
objReg.EnumKey  HKEY_LOCAL_MACHINE, strKeyPath, arrKeys

If IsArray( arrKeys ) Then
  For i = 0 To UBound( arrKeys )
    strSubKeyPath = strKeyPath & "\" & arrKeys( i )
    objReg.EnumKey  HKEY_LOCAL_MACHINE, strSubKeyPath, arrSubKeys
    If IsArray( arrSubKeys ) Then
      For j = 0 To UBound( arrSubKeys )
        strSubSubKeyPath = strSubKeyPath & "\" & arrSubKeys( j )
        objReg.EnumKey  HKEY_LOCAL_MACHINE, strSubSubKeyPath, arrSub2
        blnControl = False
        If IsArray( arrSub2 ) Then
          For k = 0 To UBound( arrSub2 )
            If arrSub2(k) = "Control" Then blnControl = True
        End If
        If blnControl Then
          objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubSubKeyPath, "Mfg", strMfg
          If IsNull( strMfg ) Then strMfg = "unknown"
            If InStr( strMfg, ";" ) Then strMfg = Mid( strMfg, InStr( strMfg, ";" ) + 1 )
              objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubSubKeyPath, "DeviceDesc", strDeviceDesc
          If InStr( strDeviceDesc, ";" ) Then strDeviceDesc = Mid( strDeviceDesc, InStr( strDeviceDesc, ";" ) + 1 )
            objReg.GetBinaryValue HKEY_LOCAL_MACHINE, strSubSubKeyPath & "\Device Parameters", "BAD_EDID", arrBadEDID
          If Not IsArray( arrBadEDID ) Then
            objReg.GetBinaryValue HKEY_LOCAL_MACHINE, strSubSubKeyPath & "\Device Parameters", "EDID", arrRawEDID
            If IsArray( arrRawEDID ) Then
              Test 54
              Test 72
              Test 90
              Test 108
            End If
            If ((strSerial <> vbNull) And (strSerial <> "")) Then
              If StrMsg = "" Then
                strMsg = "Manufacturer: " & strMfg & vbCrLf _
                & "Description: " & strDeviceDesc & vbCrLf _
                & "Model (EDID): " & strModel & vbCrLf _
                & "Serial# (EDID): " & strSerial & vbCrLf
                strMsg = strMsg & vbCrLf _
                & "Manufacturer: " & strMfg & vbCrLf _
                & "Description: " & strDeviceDesc & vbCrLf _
                & "Model (EDID): " & strModel & vbCrLf _
                & "Serial# (EDID): " & strSerial & vbCrLf
              End If
            End If
          End If
        End If
    End If
End If

If ((StrMsg = vbNull) Or (StrMsg = "")) Then
End If

Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFso = WScript.CreateObject("Scripting.FileSystemObject")

strOutputFile = "C:\Windows\Temp\KACE-Monitor-info.txt"

If objFso.FolderExists("C:\windows\temp") then
  set objOutputFile = objFso.OpenTextFile(strOutputFile, ForWriting, True)
  'WScript.Echo strMsg
  objOutputFile.Write strMsg
End If

Sub Test( ByVal myIndex )
  Dim idx, arrTemp, arrTestModel, arrTestSerial, blnModel, blnSerial, strTemp
  arrTestModel  = Split( "0 0 0 252" )
  arrTestSerial = Split( "0 0 0 255" )
  blnModel      = True
  blnSerial     = True

  For idx = 0 To 3
    If CInt( arrTestModel( idx )  ) <> CInt( arrRawEDID( idx + myIndex ) ) Then blnModel  = False
    If CInt( arrTestSerial( idx ) ) <> CInt( arrRawEDID( idx + myIndex ) ) Then blnSerial = False

  If blnModel Or blnSerial Then
    For idx = 4 To 17
      Select Case arrRawEDID( myIndex + idx )
        Case 0
          strTemp = strTemp & " "
        Case 7
          strTemp = strTemp & " "
        Case 10
          strTemp = strTemp & " "
        Case 13
          strTemp = strTemp & " "
        Case Else
          strTemp = strTemp & Chr( arrRawEDID( myIndex + idx ) )
      End Select
    strTemp = Trim( strTemp )
    ' The following lines are disabled because they truncate model names at the first space
    'If InStr( strTemp, " " ) Then
    '  arrTemp = Split( strTemp, " " )
    '  strTemp = arrTemp(0)
    'End If
    If blnModel  Then strModel  = strTemp
    If blnSerial Then strSerial = strTemp
  End If
End Sub

Sub Syntax
  strMsg = vbCrLf _
    & "DispEDID.vbs,  Version 2.30" _
    & vbCrLf _
    & "Read and parse monitor EDID asset information from the registry" _
    & vbCrLf & vbCrLf _
    & "Usage:  DISPEDID.VBS" _
    & vbCrLf & vbCrLf _
    & "Based on a script by Michael Baird (link no longer available)" _
    & vbCrLf & vbCrLf _
    & "(Re)written by Rob van der Woude" _
    & vbCrLf _
    & "http://www.robvanderwoude.com"
  ' WScript.Echo strMsg
  WScript.Quit 1
End Sub

Answered 01/25/2013 by: flip1001
Third Degree Brown Belt

  • this is awesome... how can I get this txt file info into a custom inventory rule?
  • I created a custom inventory field:

    Display Name (title): Monitor Serial Number
    Publisher (Vendor): My Company (replace this with yours)

    Supported OS: Windows - I picked all Windows I saw, except Windows 2000. Because I have very few of those left < 1%. If you need Win2k support, the script would need to be modified and also the custom inventory rule.

    Custom Inventory Rule:
    FileExists(C:\Windows\Temp\KACE-Monitor-info.txt) AND ShellCommandTextReturn(cmd /c type C:\Windows\Temp\KACE-Monitor-info.txt)

    For the script I put it as an offline kscript.
    • I agree this is awesome... but we've only had our kbox for a few months and i havent learned to do scripts before today (the auditor is here for a month :( uggg) Is there a comprehensive import vbs scripts to kace script somewhere?

      I am able to run the above script from a pc (not from kace console) and get the resulting text file to show in kace custom inventory field.

      I just cant figure out how to combine the above script with the:

      "The following is an example of the XML structure for an appliance script:
      <?xml version="1.0" encoding="utf-8" ?>
      <kbots xmlns="http://kace.com/Kbots.xsd">
      <config name="name="" type="policy" id="0" version="version="" description="description="">

      <execute disconnected="false" logged_off="false">


      requirement from the Creating and editing scripts help section. How can do?
  • After seeing the script in action I see some potential drawbacks:

    The monitor sn will not be unique in the custom inventory fields, because if a computer monitor was not uninstalled on a PC before removal, it will still show up in the registry.

    Also, the monitor may show up on a lot of computers registry if it was on the master sysprep image.

    I plan to test out Extron EDID manager to see if it reads from the monitor EDID instead of the windows registry.

Please log in to comment

Here is a vbscript that will get that info. 

Capture the output to a txt file and use in a custom inventory rule


  Set wshShell = WScript.CreateObject( "WScript.Shell" )
 strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" ) 
 WScript.Echo "Computer Name: " & strComputerName 
 Set objWMIService = GetObject("winmgmts:\\" & strComputerName & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_ComputerSystemProduct",,48) theValue = "" For Each objItem in colItems theValue = objItem.IdentifyingNumber Next 
 getPCSerialNumber = theValue WScript.Echo "Serial Number: " & theValue
Answered 01/14/2013 by: jdornan
Red Belt

  • Probably the best solution would be Monitor Asset Manager from EnTech Taiwan. It reads the EDID directly from the monitor. But it also costs $1 per user according to http://www.entechtaiwan.com/util/moninfo.shtm

    Some alternatives that may work are DumpEDID from www.nirsoft.net/utils/dump_edid.html, or this script from http://www.robvanderwoude.com/files/dispedid_vbs.txt.

    These will read from the registry, which may not be entirely accurate. The reg entries are under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY.

    For instance, DumpEDID returns 2 results even though I have 1 monitor. The results for the monitor model and sn are the same, but the registry keys are slightly different. I believe this is because I updated the driver for my monitor instead of uninstalling it.

    The script will probably be better because you can easily modify it to write to a text file and then read that file with a Custom Inventory rule. But I haven't tried the script on a dual monitor setup so I don't know if it works completely.

    All this info for Windows only.
Please log in to comment
Five Steps for Easier- and More Effective- IT Inventorying
Having an accurate inventory of all your IT assets is critical to ensuring that users are productive and that every dollar is well spent. This white paper outlines five steps that improve inventorying both hardware and software.