Using SCCM Application Objects for Bad Drivers

When deploying an operating system with SCCM there are good drivers and bad drivers. The good drivers are the ones with INF files that can be installed as a part of driver’s packages or with SCConfigMgr Modern Driver Management (http://www.scconfigmgr.com/modern-driver-management). What I am writing about today is the Bad drivers. Ones that for whatever reason you need to run the setup.exe to install them. These can be video or network drivers that to receive all the functionality, you need to install the software. I like to install these drivers as SCCM application objects. This way they can be used in the task sequence to build the computer, and as deployments to upgrade the existing computer drivers.

For the most part, you would think it is just a matter of creating the application. Setting the command line to the silent command line for installation and setting up the detection method that the uninstall registry key exists. However, there are 2 tricky parts to this. What if the computer has a newer version of the driver installed? Also, how do I know if the driver is required on the computer? A good example of the second question in the Dell Precision laptop. This laptop comes with an Intel graphics driver and either a nVidia or AMD graphics card. I do not know the background on why we were shipped the same computer model with either of these graphics cards and not just the standard AMD card, but we have a mix of Precision 9520’s with either the nVidia or the AMD graphics card along with the built-in Intel card. Having a combination of different cards on the same computer model eliminated the possibility of using the computer model as a requirement. When installing drivers as application objects, I found that creating a global condition for the PNP ID for the driver works best. I create the global condition and then add that to the application object as a requirement.

I will walk you through my “nVidia Quadro M and P Series Graphics Driver” application object. In my example I use the WQL query to find matching hardware PNP IDs.  There are several WQL query syntax rules to be aware of:

  • The following characters are reserved: backslash, \, single quote,’, and double quote, “.  To use these characters in the Where clause they must be prefixed with a backslash as an escape character.
  •  WQL Operators
Operator Description
= Equal to
Less than
Greater than
<= Less than or equal to
>= Greater than or equal to
!= or <> Not equal to
  • Like Operator
Character Description
[ ] Any one character within the specified range ([a-f]) or set ([abcdef]).
^ Any one character not within the range ([^a-f]) or set ([^abcdef].)
% Any string of 0 (zero) or more characters. The following example finds all instances where “Win” is found anywhere in the class name: SELECT * FROM meta_class WHERE __Class LIKE “%Win%”
_ (underscore) Any one character. Any literal underscore used in the query string must be escaped by placing it inside [] (square brackets).

My example is using the Dell installer for the driver.

  1. Downloaded the driver from Dell’s website. nVIDIA-Quadro-M-and-P-Series-Graphics-Driver_6CKPK_WIN_23.21.13.8908_A06.EXE
  2. Double-clicked on the executable to expand the package. This expanded the software installation files to the C:\ProgramData\Dell\drivers\nVIDIA-Quadro-M-and-P-Series-Graphics-Driver_6CKPK_WIN_23.21.13.8908_A06 folder.
  3. Opened the package.xml file. This file contains the PNP id that Dell supports this installation for.

XML Section

  1. Open the Configuration Manager Console
  2. Select the Software Library workspace.
  3. Expand Overview / Application Management
  4. Right-click on the Global Conditions node
  5. Select Create Global Conditions
  • Enter the Name:  nVidia Quadro M and P Series Graphics Driver
  • Description: nVidia Quadro M and P Series Graphics Driver WMI Query
  • Device type:  Windows
  • Condition type:  setting
  • Setting type:  WQL query
  • Data type:  String
  • Namespace:  root\cimv2
  • Class: Win32_PnpEntity
  • Property: DeviceID
  • WQLquery WHERE clause:
    • This is where the PNP ID’s in the package.xml file come into play. When querying the WMI Win32_PnPEntity class the “DeviceID” property is written like “PCI\VEN_10DE&DEV_13B6&SUBSYS_07B01028&REV_A2\4&23C3CF15&0&0008”.
    • In the package.xml file the DeviceID, subDeviceID, subVendorID, and vendorID are listed in the first 37 characters of the string.
    • VendorID is characters 9 thru 12 (2nd character after VEN)
    • DeviceID is characters 18 thru 21 (2nd character after DEV)
    • SubDeviceID is characters 30 thru33 (1st characters after SubSys)
    • SubVendorID is characters 34 thru 37 (last 4 characters prior to &REV)
    • The rest of the line will be replaced with a wildcard in the query string.
    • The where condition of the WMI query is
      deviceID like ‘PCI\\VEN[_]10DE&DEV[_]13B6&SUBSYS[_]07B01028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]13B6&SUBSYS[_]17B01028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1436&SUBSYS[_]07B01028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1436&SUBSYS[_]17B01028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]13B6&SUBSYS[_]07B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]13B6&SUBSYS[_]17B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1BB8&SUBSYS[_]07B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1BB8&SUBSYS[_]17B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1BB7&SUBSYS[_]07B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1BB7&SUBSYS[_]17B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1BB6&SUBSYS[_]07B11028%’
      OR deviceID like ‘PCI\\VEN[_]10DE&DEV[_]1BB6&SUBSYS[_]17B11028%’
  • The Global Condition
  • GlobalCondition

I then created the application object.  I will not go through all the details on how to create an application object, rather just the requirements and detection methods.

My first requirement is a simple requirement of Windows 10 x64 operating system.

  • Click on the Requirements tab
  • Click on the Add button
    • Category:  Device
    • Condition:  Operating system
    • Rule Type:  Value
    • Operator:  One of
    • Select:  All Windows 10 (64-bit)
    • Click on the OK button.
    • Windows 10 Deployment Rule

My second requirement is the global condition created above.

  • Click on the Requirements tab
  • Click on the Add button
    • Category:  Custom
    • Condition:  nVidia Quadro M and P Series Graphics Driver
    • Rule Type:  Existential
    • “The selected global condition must exist on client devices”
    • Existential Requirment

The global condition on the requirements got me past the 2nd issue of how to deploy to only the computers that have this specific video card.  The other tricky part was how to determine if the driver or a newer version was installed.  If I had a detection method of the driver version equals 1.2, computers with newer driver models would show as non-compliant and try to downgrade themselves.  This problem is resolved by setting the DataType in the detection rule to “version” and the Operator “Greater than or equal to”.

DetectionMethod

I now have an application object I can deploy directory to a collection of devices, to software center, or use in a task sequence.

 

 

References:  https://docs.microsoft.com/en-us/windows/desktop/wmisdk/wql-sql-for-wmi


Posted

in

by

Tags:

Comments

2 responses to “Using SCCM Application Objects for Bad Drivers”

  1. zncstr Avatar
    zncstr

    so that’s what “bad driver” means during the build!

    Like

  2. Manuel Avatar
    Manuel

    Wow, great job! Thank you!

    Like

Leave a comment