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
|<=||Less than or equal to|
|>=||Greater than or equal to|
|!= or <>||Not equal to|
- Like Operator
|[ ]||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.
- Downloaded the driver from Dell’s website. nVIDIA-Quadro-M-and-P-Series-Graphics-Driver_6CKPK_WIN_18.104.22.16808_A06.EXE
- 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_22.214.171.12408_A06 folder.
- Opened the package.xml file. This file contains the PNP id that Dell supports this installation for.
- Open the Configuration Manager Console
- Select the Software Library workspace.
- Expand Overview / Application Management
- Right-click on the Global Conditions node
- 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
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.
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”
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”.
I now have an application object I can deploy directory to a collection of devices, to software center, or use in a task sequence.