Hey, Scripting Guy! Question

Hey, Scripting Guy! In Device Manager, any time a device isn’t working that device is marked with a yellow exclamation mark. How can I use a script to get a list of the devices that aren’t working?

-- OL

SpacerHey, Scripting Guy! AnswerScript Center

Hey, OL. Sometimes in baseball a batter absolutely hammers one, but the ball takes a lucky bounce and lands right in your glove. That’s often referred to as a “candy hop.” Turns out that this question is the scripting equivalent of a candy hop: it looks like it might be a tough one to answer, but it turns out to be pretty easy.

WMI actually has a class - Win32_PNPEntity - that returns information about the devices found in Device Manager. Meanwhile, Win32_PNPEntity has a property - ConfigManagerErrorCode - that tells you whether or not the device is working properly. If the value of ConfigManagerErrorCode is 0, then the device appears to be working. If ConfigManagerErrorCode is anything but 0, then something must be wrong. And here’s the good part: any device with a ConfigManagerErrorCode value other than 0 will also have a little yellow exclamation mark next to it in Device Manager.

In other words, to write a script that returns a list of the devices that aren’t working properly we just need to connect to the Win32_PNPEntity class and query for all devices with a ConfigManagerErrrorCode other than 0:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_PNPEntity Where ConfigManagerErrorCode <> 0")

For Each objItem in colItems
    Wscript.Echo "Name: " & objItem.Name
Next

And what if you’d like more detailed information about all the devices installed on a computer? Well, because this question turned out to be an easy one to answer, we’re feeling generous: here’s a bonus script that returns all sorts of data about installed devices:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PnPEntity")
For Each objItem in colItems
    Wscript.Echo "Class GUID: " & objItem.ClassGuid
    Wscript.Echo "Device is Working: " & objItem.ConfigManagerErrorCode
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "Manufacturer: " & objItem.Manufacturer
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID
    Wscript.Echo "Service: " & objItem.Service
Next

No, no charge for the bonus script. That one is on us!