MSEndpointMgr

Modern Driver Management using Web Services during OSD with ConfigMgr

Throughout the years, driver management for operating system deployment in ConfigMgr have been a daunting task that administrators have had to deal with on a regular basis. New computer models are occasionally introduced in the environment, which we can’t deny.

Nickolaj Andersen

Chief Technical Architect and Enterprise Mobility MVP since 2016. Nickolaj has been in the IT industry for the past 10 years specializing in Enterprise Mobility and Security, Windows devices and deployments including automation. Awarded as PowerShell Hero in 2015 by the community for his script and tools contributions. Creator of ConfigMgr Prerequisites Tool, ConfigMgr OSD FrontEnd, ConfigMgr WebService to name a few. Frequent speaker at conferences such as Microsoft Ignite, NIC Conference and IT/Dev Connections including nordic user groups.

176 comments

  • I’m using the non-dynamic plain method of downloading the package and running dism. However, although the log shows “successfully processed driver package” for every driver, none of them are actually installed? Ex with a new Dell 7400 laptop: “Successfully proccessed driver package ‘C:\_SMSTaskSequence\Drivers\ADC00493\7400\win10\x64\video\YF5DY_A00-00\…”

    I am running the drivers step after Apply Network Settings and before Setup Windows and Configuration Manager.
    Download pkg content to custom path %_SMSTSMDataPath%\Drivers, save path as variable “DriverPkg”.
    DISM.exe /Image:%OSDTargetSystemDrive%\ /Add-Driver /Driver:%DriverPkg01%\ /Recurse /logpath:%_SMSTSLogPath%\dism.log

    What might I be missing? Thanks!

  • Trying to implement this, Web service is up and running. I get this error on my smsts.log – Failed to run the action Dynamic BIOS Package Detection Error 1. Other piece i notice is that I don’t have a BIOSPACKAGEDOWNLOAD.LOG

  • How would you use this with a Hyper-V as there are now driver packs to download for that, that I’ve seen anyways?

    • Hi Scott,

      If you wanted to apply hypervisor drivers from either Microsoft or VMWare, you could simply create a custom driver package. You would need to extend the driver matching within the matching script, see the code for examples, as it is just a matter of having a matching value for the content to download and apply.

      Maurice

  • An error occurred while calling ConfigMgr WebService for a list of available packages. Error message at line 622: There is an error in XML document (1, 2465).

    It seems that i get the above error. I have checked local admin permissions, app pool is running, etc, etc. I have also logged onto the local server and done a test with get-cmpackage and everything works perfectly.

    I can even start the task sequence in full os mode and install them when i am at that particular office / location.

    However, when i visit one of our other offices where i wish to do testing i get the above error. I can’t figure it out at all.

    The web service is being hosted on the same server as my sup. my initial thoughts were that i am dealing with a firewall issue but that doesnt appear to be correct because i do not have any issues telneting to port 80 nor do i have issues fetching updates from this sup. This was triple confirmed by my network team that can’t see anything being blocked whatsoever.

    ive checked that my location DP has the software, i can get to the url website just fine.

    What else could be causing this?

    I really need to be able to use this across the entire country, not just at one site unfortunately. any help would be appreciated.

    when you launch Invoke-CMApplyDriverPackage.ps1 with the uri parameters – what else is it doing in the background that could be blocking me?

    ===== SCConfigMgr Invoke-CMApplyDriverPackage Version 2.2.3 ==== ApplyDriverPackage 20/06/2019 11:39:21 AM 6504 (0x1968)
    Driver download package process initiated
    Manufacturer determined as: Hewlett-Packard
    Computer model determined as: HP EliteBook 840 G5
    Computer SKU determined as: 83B2
    An error occurred while calling ConfigMgr WebService for a list of available packages. Error message at line 622: There is an error in XML document (1, 2465).

  • Hello, I am sure I overlooked something in the documentation so I apologize up front. I have implemented this in my environment and the problem I am having is the driver packages are pulling from the main site server and not from the local DP. I have one location that has very limited bandwidth and because of this it went from a 40 minute image process to a 4 +hour imaging process because the driver package download was so slow. Any suggestions on were I should look or check on ? Thank you.

    • Hi Ken,

      We’re not controlling where package content is downloaded from, it’s handled by OSDContentDownload.exe from the task sequence engine. I’d have a look at where you’ve distributed the package content and how your boundaries are setup.

      Regards,
      Nickolaj

  • I’m currently trying to implement this in my environment. I have been reading through all the comments trying to learn more and get past my current issue. Hoping to get assistance.

    Getting this error in the SMSTS.log file
    Failed to run the action: Dynamic BIOS Package Detection.
    Incorrect function. (Error: 00000001; Source: Windows)

    Tried running the powershell commands to verify but I got errors.
    you cannot call a method on a null-valued expression
    at line:1 char:1
    -$web.getcmpackage(“$SecretKey”,””)

  • Hello

    We currently have issues with Driver Package for the Models Dell Latitude 7400V and 7200 2 in 1.
    For the 7400V package the download link is wrong so it will fail.
    In the 7200 2 in 1 package a driver is missing so that the touch screen will not work. It is the driver Intel(R) Serial IO I2C Host Controller.
    Is there anyone with the same issue?

    Thanks for your help!

    Regards
    Noah

  • When I run the following commands from that workstation. (after inserting my info) I get
    # User Variables
    $SiteServer = “servername”
    $SecretKey = “secretkey”

    # Connect to web service
    $URI = $SiteServer + “/ConfigMgrWebService/ConfigMgr.asmx”
    $Web = New-WebServiceProxy -Uri $URI

    # Test-Get-CMPackage
    $Web.GetCMPackage(“$SecretKey”,””)

    Here is my error
    Method invocation failed because [System.String] does not contain a method named ‘GetCMPackage’.
    At line:1 char:1
    + $Web.GetCMPackage(“$SecretKey”,””)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

  • Currently testing the BIOS management of this solution. In my SMSTSlog I see this error.

    Process completed with exit code 1
    The string is missing the terminator: “.
    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    Failed to run the action: Dynamic BIOS Package Detection.
    Incorrect function. (Error: 00000001; Source: Windows)
    Any help or direction appreciated.
    Thanks
    Mark

  • Hi,

    I wonder if you could please advise where we are going wrong with setting up the Web Service.

    We’ve setup the Driver Automation Tool and only just installed the ConfigMgr Web Service.

    We’ve added the ConfigMgr Web Service url as https://Servername.FQDN with the secret key, when attempting to connect to ConfigMgr Web Service we are receiving the error below.

    “An error occured while calling ConfigMgr WebService for a list of available packages. Error Message: You cannot call a method on a null-valued expression.”

    We are receivng a response time from the Web Service.

    Unable to load the site either.

    https://localhost/ConfigMgrWebService/ConfigMgr.asmx

    Thank you in advance.

  • Hello,
    I am getting a failure on one SKU of PC’s when installing the drivers. The log shows 75 packages were found and 75 were installed. I then get “Error: 2”

    “Failed to run the action: Dynamically Apply Drivers.
    Not enough memory resources are available to complete this operation. (Error: 0000000E; Source: Windows)”

    The SKU in question has 16GB of RAM installed. Is there a configuration somewhere I need to tweak?

  • Is the Invoke-CMDownloadDriverPackage script no longer available? I recently tried implementing this solution Invoke-CMApplyDriverPackage.ps1, but it does not work in my environment because our task sequences are normally set to “Access content directly from a dP….”. I’m hoping to give this a try.

  • Perhaps I am overlooking something in the documentation and if so forgive me. We are looking to implement this in our environment but dont have an MDT database setup.
    We do have MDT installed in our Primary Site but its only being used for Creating a MDT boot image\MDT Task Sequence and that’s it.

    Can we do without the MDT database and point it to our SQL database instead? Does the WebService need access to the database to query Make/Model of systems?

    Thank you for great work and appreciate any input.

    • Hi Joel,

      Absolutely. During the web service installation the MDT section states that it’s optional, and MDM/MBM does not require MDT.

      Regards,
      Nickolaj

  • Hi,

    We’re starting to implement SCCM, and this has proved to be so much easier to maintain than the standard driver packages!

    We have noticed that it takes quite a long time for the driver package to download because it is downloading a single unpacked file at a time. Has there been thought to making the package the driver CAB and extracting the contents after it has been downloaded? In one example, the packed version is a single 850MB file, where the unpacked drivers are 1.7GB with over 1000 files!

    Joel

    • I’d find this really useful too. Currently with large application deployments I zip them up and have the install script unpack before installing, it can save a huge amount of time in things with lots of tiny files so should be beneficial for drivers too.

      Thanks,
      Andrew

  • Any best practices for handling different versions of drivers per OS? Example, we’re deploying Win10 v1809 in our environment, but have a few Surface Laptop machines as well. Surface Laptop doesn’t have drivers for 1809 from what I can tell, but does have 1803.

    Is there a way to tell it to ignore the version of the installed OS and only install drivers based on WMI model name instead of OS version?

    • Hi John,

      We’re currently looking at support what we call “fallback operating system”. I don’t have a time frame for it now, but what we’re looking at is to fall back from the detected OS version to the previous version, like 1809 to 1803 if there’s no packages for 1809.

      Regards,
      Nickolaj

  • I’ve been struggling to get this going… Followed all the steps, but I don’t even have a log file writing, but the smsts.log says the initial commands completed. They’re set to Bypass on the powershell scripts. They just don’t seem to do anything. Thoughts? Something easy I may have missed.
    I tried the driver script at first, then I tried the BIOS scripts and followed the instructions for each step. Neither one seems to run. I can reach that web page, so I’m pretty sure that the CONFIGMGR WEBSERVICE is running ok.

    • Hi Mike,

      Have you reviewed the status messages or the SMSTS log to see what is going on at the apply driver step? The script also generates a log file for troubleshooting purposes, this should advise you if it could contact the web service, model details, OS details, etc.

      Maurice

      • I actually figured this out. All the scripts I downloaded for this… I forgot to unblock the .zip file. So all the script files were blocked. As soon as I unblocked them all and put them back in the directories for the packages and updated the packages, it was able to run. Works great Thanks for the help and the tools.

  • Hello I am trying to get this to work with HP ProBook 450 G5, but the scripts does not match the Computer with the driverpackage. Always the error: “Package does not meet computer model and manufacturer criteria.”
    The packagename in SCCM is : “Drivers – HP ProBook 450 G5 – Windows 10 10.0.7763.1 X64”
    For package Manufacturer in SCCM I tried: “HP” and “Hewlett-Packard” both don’t work, same error
    I checked with WMI queries the modelname = “HP ProBook 450 G5 ” so it matches the packagename. WMI gives me “HP” as the manufacturer.

    What is wrong here? I am using Win10 1809 x64

    Thanks

    here’s the log:

  • Hello,

    Great Tool, thans for sharing!

    Question. All seems te be working. But I have an older HP laptop, installing Windows 10 1809. There is no driverpackage. and Win10 already has the correct drivers for it. The DriverpackageDownload.Log says: “Empty driver package list detected, bailing out. It does see my other driverpackages, but do not match this model. The TS fails because of the return Code 1 the step is generating. How to best handle this?
    I’d like older models for which no driverpackage exist to install properly.

    Thanks.

  • Hello,

    we are using a Operating System Upgrade Package instead of a Operating System Image in our Task Sequence. The problem is, that the Webservice cannot return the Operating System Upgrade Package with the “GetCMOSImageForTaskSequence” command. I didn’t really saw the point why the script needs the informations about the OS if i only have one “Apply Operating System” step in my TS? Is there even a way to use an extracted ISO-File for the Image or do you need a WIM-File? Do you have any idea how we can solve this problem?

    Thanks in advance!

    Kind Regards,
    Noah

    • Hi Noah,

      For the Invoke-CMApplyDriverPackage.ps1 script to know which package to retrieve when it comes to the Windows build version, either just ‘Windows 10’ or for some vendors ‘Windows 10 1809’ for instance, it’s required to know what version and in some instances also the build of the operating system is going to be put down on the system during deployment. Which version of the ConfigMgr WebService are you using? And why an upgrade package for deployment? It works, but not as it’s intended.

      Regards,
      Nickolaj

  • We are using Windows Server 2012 R2 build 9600 and when I load the Driver Automation tool and go tot the “Common Settings” tab to connect to my server the “Site Server” is greyed out and I can’t enter any text in the field. Any ideas on where to go from here? I unzipped the DriverAutomationTools zip to the local E drive.

    • Hi Pete,

      Which deployment platform did you select on the Make & Model selection?

      Maurice

  • Hi there ! Thanks for your great work, because we all know that sccm + drivers are the worst thing to maintain and deploy. However, I tried to install ConfigMgrWebservice 1.6.0 + Automation Tool + TS step to dynamically inject drivers, and it doesn’t work with an exception “SoapException”. I tried the script to test $Web.GetCMPackage($secretkey,””) like said in the comments, but same error. I follow recommandations, I’ve my ApplicationPool with my SCCM Service ACCOUNT which is Full Admin, I’ve my FQDN ok, I can browse /ConfigMgrWebService/ConfigMgr.asmx and the CCM file is copied under C:\inetpub\ConfigMgr WebService\bin. Any idea to follow for resolving ? 🙂

  • Hi guys,

    We are having some issues with this great tool and Surface Pro.. (Working great with HP!)

    ApplyDriverPackage.log:

    “Unable to Determine systems SKU Value”

    Attempting to find a match for driver package: Drivers – Microsoft Surface Pro – Windows 10 1803 x64 (00100253)

    Driver package does not meet computer model criteria: Drivers – Microsoft Surface Pro – Windows 10 1803 x64 (00100253)

    We are using Driver Automation Tool 6.1.0 , WebService 1.6.0 and Modern Driver Management 2.1.2

    Any idea what might be wrong?

  • Having a problem with v1.6 of the script. Computer Model is not matching despite the package name containing the computer model string. Also this particular system OptiPlex 980 returns Unable to determine system SKU value so is reverting computer model matching but not working..

    The dell 980 package was originially a windows 7 package but as there are no 10 drivers available from dell for this model I changed the package name from 7 to 10 .. should it still work? applydriverpackage.log here:

    https://1drv.ms/u/s!Ap0j1EVcfAgFhT0HdubHumoCMP9_

  • Hi Nikolaj,

    How do suppress the driver signing warnings. I’m currently using the process in my tasks sequence and its working great, but I get a warning about driver signing. I’m using the DeploymentType DriveUpdate parameter. This is happening on my Lenovo clients when building Windows 10

  • Hi Nikolaj,

    Thanks for this tool, implemented it and it works perfect. Makes my life a lot easier.

    Kind regards,

    Hans

  • Hi Nikolaj,
    Could you please let me know naming convention I have to use for manual driver package creation? WMIC gives me “HP ProDesk 600 G1 DM”. I am creating a standard package with name “Drivers – Hewlett-Packard ProDesk 600 G1 DM – Windows 10 10.0.16299.15 x64″ and MAnufacturer set to Hewlett-Packard” but the script cannot detect it during OSD. It can see it from Web Service, but does not consider as applicable.

      • Thank you for the replay Nicolaj. This is exactly what I tried. Unfortunately, HP XML file DAT uses contains names not matching to WMI. So I renamed the package to Drivers – – Windows 10 10.0.16299.15 x64 and the package was found; I guess I could make search even more effective by adding the model SKU (it should be added in the package description, right?). As a suggestion – is it possible to put in the ApplyDrivers.log file a line what name the script is looking for in the package library? So it will be easy to rename a package to get a match.

  • Can you help me with the “dummy package”? in the Download Package Content step please?

    Everything seems to be working, up until the DISM section.

    I watch the drivers be downloaded during the TS step, then it gets to DISM and it fails.

    When I look in the logs, it is listing the “dummy package” in the DISM command, and not the package it downloaded with the actual drivers.

    I get this error:
    Failed to run the action: Apply Drivers via DISM.
    The system cannot find the file specified. (Error: 00000002; Source: Windows)

    I’m not sure why it is looking for the “dummy package”, when it actually downloads the correct driver package.

    During the download driver package step, I’m using these settings:
    Custom path: %_SMSTSMDataPath%\Drivers\
    Save path as a varaible: DriverPackage

    During the Apply drivers via DISM section, I’m using:
    DISM.exe /Image:%OSDTargetSystemDrive%\ /Add-Driver /Driver:%DriverPackage01%\ /Recurse

    Any help would be greatly appreciated.

  • Hi Maurice,

    Is there a reason why you save the driver path to a variable called
    “DriverPackage”, but in the DISM command line, you refer to %DriverPackage01%?
    Where does the “01” part fit in?

    Regards
    Claude

  • Hi,

    Is it possible to configure the script to ignore the SKU and just use computer model?

    In my environment we’re still using version 1.2.0 of the script – I’d like to upgrade to the latest but when I’ve tried I get a lot of OSD failures due to error 9. This tends to be down to a missing SKU from the driver pack description – it seems Lenovo aren’t too good at maintaining this info in their driver packs. We also have a few old desktops that aren’t from Dell, HP or Lenovo where it grabs the SKU, fails to match it and so it sees all packs from that manufacturer as an appropriate match rather than looking at the computer model and applies the first match from the list.

    Many thanks,
    Andrew

    • Hi Andrew,

      We’ve worked a lot with this in the past couple of months to have a logic that first attempts to detect based on SKU, and if it’s empty it’s falling back to computer model. Give version 2.0.9 a try, I think it should work better for you.

      Regards,
      Nickolaj

  • Sorry, but there is still another issue:
    You check in line 689 and 702 this
    —————
    if ($PSBoundParameters.ContainsKey(“DriverUpdate”) -eq $false) { …}
    elseif ($PSBoundParameters.ContainsKey(“DriverUpdate”) -eq $true) { …}
    —————-

    Correct is:
    ————-
    if ($DeploymentType -notmatch “DriverUpdate”) { …}
    else { …}
    ————–
    Line 704 you do
    ————
    Start-Process “$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe” -WorkingDirectory $OSDriverPackage01 -ArgumentList “pnputil /add-driver *.inf /subdirs /install | Out-File -FilePath (Join-Path C: ‘Install-Drivers.txt’) -Append” -NoNewWindow -Wait
    ————–
    This does not work
    I uses your line from the normal driver package installation
    ————————-
    $ApplyDriverInvocation = Invoke-Executable -FilePath “powershell.exe” -Arguments “pnputil /add-driver $(Join-Path -Path $TSEnvironment.Value(‘OSDDriverPackage01’) -ChildPath ‘*.inf’) /subdirs | Out-File -FilePath (Join-Path -Path $LogsDirectory -ChildPath ‘Install-Drivers.txt’) -Force”
    ———————-
    Here it is possible to discuss if it it is better with or without /install switch

    • Without /install switch, the installation does not start. So it is better with.

    • Hi Ulf,

      You’re correct on the if condition. I’ve made the changes you suggested. However, could you share more information about the stuff from line 704? Maurice has tested it quite extensively, so your feedback would be greatly appreciated.

      Regards,
      Nickolaj

  • Hi,
    there are some problems with the script.
    1. It makes a difference if the Filter is “Driver” or “Drivers”. “Drivers” does not catch the Fallback Package
    2. There is an error in your code.
    —————————
    # Process packages returned from web service
    if ($Packages -ne $null) {
    Write-CMLogEntry -Value “Attempting to match a driver fallback package” -Severity 1
    foreach ($Package in $Packages) {
    Write-CMLogEntry -Value “Processing $($Package.PackageName)” -Severity 1
    if (($Package.PackageName -match “Driver Fallback”) -and ($Package.PackageName -match $OSName) -and ($Package.PackageName -match $OSImageArchitecture)) {
    $PackageList.Add($Package) | Out-Null
    }
    #———————
    } # <– This is missing, you have it somewhere later
    #———————
    if ($PackageList.Count -eq 1) {
    …………….
    }
    else {
    Write-CMLogEntry -Value "Either empty or an unsupported count of fallback package content detected" -Severity 3; exit 16
    }
    }
    # } <– It is too late here, to close the foreach ($Package in $Packages) loop
    ——

    3. All Drivers in the Fallback package are installed in "DriverUpdate" Mode. I would prefer also only to insert the drivers and let windows choose, which are the best on reboot. Otherwise i can only insert really standard drivers and thats seems to be useless. Therefore its is easier to catch a missing driver package in the task sequence with "continue on error".
    4. Could you include Fujitus drivers? 🙂

    Sorry for that bunch of issues. But i am still excited of your work and your amazing tool.
    Best Regards
    Ulf

  • Hi,

    thank your for this great tool.
    Unfortunatly i have a problem to load the driver for a Lenovo Thinkpad X230. It is not listed in lenovo catalogue, so I tried to use the FallBack option. I created a Driver Fallback Package vor Windows 10, put the extracted Intel Graphics Driver (3rd Generation) for the X230 model from the lenovo site in the source path an distribute it. When I start the tasksquence i got the error message, that the fallback package “either is empty or an unsupported count of fallback package content detected”.
    ——————————————-
    Driver download package process initiated ApplyDriverPackage 13.03.2018 12:23:32 4644 (0x1224)
    Manufacturer determined as: Lenovo ApplyDriverPackage 13.03.2018 12:23:33 4644 (0x1224)
    Computer model determined as: ThinkPad X230 ApplyDriverPackage 13.03.2018 12:23:33 4644 (0x1224)
    Computer SKU determined as: 2325 ApplyDriverPackage 13.03.2018 12:23:33 4644 (0x1224)
    Retrieved a total of 7 driver packages from web service ApplyDriverPackage 13.03.2018 12:23:35 4644 (0x1224)
    Translated OSName from OSImageVersion: Windows 10 ApplyDriverPackage 13.03.2018 12:23:35 4644 (0x1224)
    Translated OSImageArchitecture: x64 ApplyDriverPackage 13.03.2018 12:23:35 4644 (0x1224)
    ComputerSystemType: 23252FG ApplyDriverPackage 13.03.2018 12:23:35 4644 (0x1224)
    Attempting to find a match for driver package: Drivers – Lenovo ThinkPad S3 Yoga 14 – Windows 10 x64 (ING00061) ApplyDriverPackage 13.03.2018 12:23:35 4644 (0x1224)
    Driver package does not meet computer model criteria: Drivers – Lenovo ThinkPad S3 Yoga 14 – Windows 10 x64 (ING00061) ApplyDriverPackage 13.03.2018 12:23:35 4644 (0x1224)
    ……..
    Driver package does not meet computer model criteria: Drivers – FUJITSU ESPRIMO Q957 – Windows 10 x64 (ING0007C) ApplyDriverPackage 13.03.2018 12:23:36 4644 (0x1224)
    Driver fallback parameter specified and no matching driver packages found ApplyDriverPackage 13.03.2018 12:23:36 4644 (0x1224)
    Attempting to match a driver fallback package ApplyDriverPackage 13.03.2018 12:23:36 4644 (0x1224)
    Processing Drivers – Lenovo ThinkPad S3 Yoga 14 – Windows 10 x64 ApplyDriverPackage 13.03.2018 12:23:36 4644 (0x1224)
    Either empty or an unsupported count of fallback package content detected ApplyDriverPackage 13.03.2018 12:23:36 4644 (0x1224)
    ———————————————–
    The processing of Lenovo ThinkPad S3 Yoga 14 package seems strange to me.
    Can you please help, how i can find or debug the error?
    I don’t want to create a special package for the X230 manually, i want to test the fallback function.
    Best Regards
    Ulf

  • Hello, I have followed the steps and I am getting error 0xfffd0000 from my task sequence. I have not had any luck resolving this issue. I ensured that Powershell is included in my winPE image and it is version 5.0. I do not see any errors in my SMSts.log.

    When I run the script manually inside winpe it completes with no errors.

  • Is there a good method for updating drivers in the field? We have a very large environment and currently we manually script \ create packages delivered by SCCM to update drivers \ firmware in the field. Any automation is desperately needed.

  • Hello,

    I am trying this took but the Lenovo drivers cannot be queried. Is anyone seeing this – maybe I am missing something? I did try the tool against Dell and HP and they model list populates. For the Lenovo, this statement appears in the log:

    Warning: No Lenovo models found. If you are using a proxy server please specify the proxy in the Proxy Server Settings tab.

    Thanks

  • I have had a few problems with the initial setup and installation not returning any drivers. I uninstalled & reinstalled ConfigMgr WebService v1.5.0 and generated a new secret key. I am using v5.1.5a of the driver automation tool and drivers are now returned when I test using the builtin method on the MDM/MBM Diags tab.

    However, after importing some drivers I receive the following error in the DriverAutomationTool.log

    Errors occured while communicating with the ConfigMgr WebService. Error message: Method invocation failed because [mshtml.HTMLBodyClass] does not contain a method named ‘getElementsByClassName’.

    I would appreciate if anyone can provide any clues as to why I might be receiving this error.

    Thanks

  • I’m finally getting around to trying to implement this and I’m running into a problem . I’m using the latest version of Driver Automation, the latest version of Configmgr Webservice, and the latest version of Invoke-CMApplyDriverPackage.ps1

    I’m using a task sequence that’s using a UDI Wizard front end. This task sequence is used for imaging Windows 8.1 and Windows 10 machines. The user select’s which OS to install from a drop down menu. In my test of the Invoke-CMApplyDriverPackages.ps1 script I’m selecting a Windows 10 image but when I look at the ApplyDriverPackage.log I see the line that says “Determined OS name from version: Windows 8.1”

    In the script documentation I see this:
    1.1.0 – (2017-08-29) Updated script to only check for the OS build version instead of major, minor, build and revision for HP systems. $OSImageVersion will now only contain the most recent version if multiple OS images is referenced in the Task Sequence.

    My question is can Invoke-CMApplyDriverPackage.ps1 script reference other task sequence variables created in an earlier step? The reason I ask is the UDI wizards sets OSDImageName to “Windows 10” or “Windows 8.1” depending on what the user selects. If Invoke-CMApplyDriverPackage.ps1 can reference the OSDImageName then I could use some logic and set $OSImageVersion to either “Windows 10” or “Windows 8.1”. This would allow the correct package to be selected when imaging.

    • Hi Keith,

      This is of course possible as you can read in the variable previously set by the UDI wizard. You will need to edit the sections of the Invoke-CMApplyDriverPackage script that deal with setting the OS package. If you could send me a copy of your task sequence or screenshots of the full sequence I can give you some guidance.

      Maurice

      • I ended up changing line 331 of your script to this:
        $OSImageVersion = (Get-WmiObject -class Win32_OperatingSystem).Version
        This does a WMI query to get the version number and it seems to work fine. Thanks for the help.

    • Hi Shaun,

      This post has been superseded. If you look at the solutions section you will see a link for Modern Driver Management. The up to date links and version info is maintained there.

      Maurice

  • I have done everything like in the tutorial but I have a situation at the first step (dynamic driver package detection).

    Errorlog from SMSTS.log :
    The execution of the group (Install Operating System) has failed and the execution has been aborted. An action failed.
    Operation aborted (Error: 80004004; Source: Windows)
    Failed to run the last action: Dynamic Driver Package Detection. Execution of task sequence failed.
    The system cannot open the file. (Error: 00000004; Source: Windows)

    The machine detection is working now as I changed the line in the script from “Get-WmiObject -Namespace root\wmi -Class MS_SystemInformation | Select-Object Expand-Property SystemSKU” to “(Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty Model).Trim()” on line 240.

    Printscreen of the error in ApplyDriverPackages.log -> https://image.ibb.co/ckAoLG/Capture.jpg

    • Hi Michael,

      This is a known bug in the web service and will be fixed in version 1.5.0 that will be released shortly (hopefully next week).

      Regards,
      Nickolaj

      • Just want to make clear, this is a Win7 image. I am trying to apply 2-2 from the wim
        Thanks
        Mike

  • Hi there!

    Super excited trying to pilot this here, however running into a snag ( have read all the comments so far and that has helped immensly).

    WinPE 10.0.16299.15 with PS/.net/html components enabled, imaging Win10 1709 .wim

    I get a TS failure on the first step (Dynamic Driver Package Detection) of 0x00000008 and there is nothing in the SMSTS.log after reporting that it successfully applied the OS image.

    After failing, manually ran

    # User Variables
    $SiteServer = “YOURSERVERNAMEHERE”
    $SecretKey = “YOURSECRETKEYHERE”

    # Connect to web service
    $URI = $SiteServer + “/ConfigMgrWebService/ConfigMgr.asmx”
    $Web = New-WebServiceProxy -Uri $URI

    # Test-Get-CMPackage
    $Web.GetCMPackage(“$SecretKey”,””)

    And it correctly pulled all packages so I know webservice and user permissions are working ok.

    Next I tried running the ps1 out of the package folder:

    .\Invoke-CMApplyDriverPackage.ps1 -URI “https://xxx/ConfigMgrWebService/ConfigMgr.asmx” -SecretKey “xxx” -Filter “Drivers”

    and it didn’t error out however still no log present. We are currently using a USB bootable media (do not have PXE setup yet), would that be an issue?

    Unsure what to try next, any help would be appreciated!

    • Hi Curtis,

      What does it say in the ApplyDriverPackage.log generated by the script during the TS?. Can you also ensure that your boot media has the PowerShell components added.

      Maurice

      • Apologies, should have written an update on this. Happened to connect with Nickolaj on Slack and he was gracious enough to assist. Will add the details here if anyone else runs into these issues.

        Was having issues troubleshooting as unable to find the driver log and smsts.log stopped at applying the image step… We were looking at the smsts.log in “C:\_SMSTaskSequence\Logs” and finally find out that it was still writing to “X:\windows\temp\smstslog\smsts.log” (driver log was also there).

        0x000000008 is no package match (we were testing with new horrible HP models :). Driver download tool did not have those models in the list so we manually created the legacy driver package with files from HP’s SDM. Still having issues with matching until we ensured all all details were filled in (download a model from the driver tool and compare properties).

        The key field we were missing was “(models included:)” in the description which looks to list the systems mainboard options. We boot to winpe and ran “Get-WMIObject -Class Win32_ComputerSystem” and “Get-WmiObject Win32_BaseBoard” in PS and ensured our manual package had the right name and description. All good now!

        Lastly Nickolaj informed us we don’t need the 2nd or 3rd step as its all included in the script now “https://msendpointmgr.com/modern-driver-management/”

        Thanks again for the assist Nickolaj and Maurice! Amazing work on this.

        Cheers

  • What a nice add-on you’ve made 😉 I was enthusiastic about the mail from Kim Oppalfens but when you integrate some of his work with yours it’s a very interesting tool.
    I have some quick questions;
    We have folders (DRV and DRVPKG) to import new drivers and the model driver package. These folders are used during ‘Apply Driver Package’ phase. Your tool is making simple packages so I don’t have to put them in the DRV and DRVPKG folder.
    Your “Repository Path” and “Package Path” is not used when a new package is created. This is used during the creation in the “Data source” tab in “Source folder:”
    1.When the driver package in your tool is made can we delete the repository path folder of that model?
    1.a How is your folder hierarchy made?
    2. Packages made with the tool, can they be deleted through the tool too or is it manually ‘delete’ and that’s it?
    3. Under “Package” I have a folder named “SYSTEM” and I will create 2 more (BIOS and DRIVERS) to regroup your packages. Will the service still find them as they will not be in the root folder ‘Packages’ anymore?

    Thanks!!!

    • Hi Michael,

      In response to your queries:

      1. Once the package is made you can indeed remove the package path used for the driver package. BIOS packages are created in the package path. There is an automated method of doing this via the GUI itself also if you wish.
      1a. The hierarchy is %Make%\%Model%\%OS%-%Version
      2. It is a manual delete unless you are superseding the previous version, in which case there is an option in the GUI.
      3. The service will indeed still find them as it looks for the package name, which does not rely on the folder structure within ConfigMgr.

      Maurice

  • Found a problem with the Computermodel detection on Microsoft models.

    It must be:
    (Get-WmiObject -Namespace root\wmi -Class MS_SystemInformation | Select-Object -ExpandProperty SystemProductName).Trim()

    this command does also work –> same like dell models:
    (Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty Model).Trim()

    the original command produces an error (it’s -ExpandProperty not Expand-Property and the SystemSKU returns the model with underlines instead of space):
    Get-WmiObject -Namespace root\wmi -Class MS_SystemInformation | Select-Object Expand-Property SystemSKU

  • Thanks, guys. What a great tool! Ultimately, I think I’ll need to adapt this approach to use HP’s SDM tool for downloading drivers. Your driver tool works fine for downloading HP’s pre-made driver packs. But I have found that those driver packs are often missing important drivers. Not your fault, obviously.

    Using HP’s SDM app, I can have it download and unpack the very latest versions of all applicable drivers. So, I’ll just need to script something to automate the SDM tool, then move the unpacked drivers into my SCCM content library and force the packages to update.

    Couldn’t do any of this without your Web Service and detection/download scripts, though. Thanks again!

  • Hi,

    i have a Problem with the DynamicDriverDetection Step in the Task Sequence with the Dell Models Optiplex 755, 760 and 780. I’m using Version 1.1.0 of Invoke-CMDownloadDriverPackage.ps1 and Webservices Version 1.4.0. The Script won’t find the matching Packages for those three Models because in the Detection it has some spaces after the computer model name.

    To comparison I have two logs (one of the Opitplex 780 (755 and 760 look the same) and one of the Optiplex 790). I deleted the unnecessary packages from the logfile:

    Optiplex 780:

    Opitplex 790:

    I tried updating the Scrip to Version 1.1.1 but then I get another error on all models:
    Object reference not set to an instance of an object.]LOG]!>

    Is there a way to get rid of this issue?

    Thanks for your help,
    Raphael

  • I have a problem with the proxy settings. Powershell complains that I have to use “-ProxyUsage Override” and the default setting in the script is : “-ProxyUsage SystemDefault”.

    If I change to Override, it works nicely with configuring proxy settings.

    Using Dell only download. But I am sure it is the same for the others.
    This is the line that works for me:

    Start-BitsTransfer -Source $DellXMLCabinetSource -Destination $global:TempDirectory -RetryInterval 60 -RetryTimeout 180 -ProxyList $ProxyServer -ProxyAuthentication NTLM -ProxyCredential $ProxyCred -ProxyUsage Override -Priority Foreground

  • Well I feel stupid. I was calling the script from MDT Toolkit, and I had “Use Toolkit Package” at the beginning of my TS (to use Gather)… and forgot to call that step again after applying the OS.

  • Just as a quick note – our issues with the 00000001 Incorrect function error were due to copy-pasting the suggested URI from step 3:
    https://configmgr01.scconfigmgr.com/ConfigMgrWebService/ConfigMgr.asmx”
    Note the ‘smart’ quotation mark? While typographically correct, it causes problems when entered in the task sequence.

    Thought that, since we’d sorted this out and hadn’t seen it specifically mentioned above (though there’s a good chance it’s where Joe’s error is coming from), the fix should be noted.

    Thanks for making this useful tool.

  • Hi Maurice,

    Thank you guys for putting all these together. It would tremendously help our deployments. I’m just hitting a break wall trying to get the DSIM command to work. It fails with error 2 not being able to access the image. All variables and paths seem to be correct but at that stage there is only one “_SMSTaskSequence” folder in the root of C: and DSIM is not able to find Windows folder in there so it fails. Below is what shows in SMSTS.Log
    ——————————-
    Expand a string: WinPEandFullOS TSManager 8/14/2017 1:01:36 PM 1952 (0x07A0)
    Executing command line: smsswd.exe /run: DISM.exe /Image:%OSDTargetSystemDrive%\ /Add-Driver /Driver:%DriverPackage01%\ /Recurse TSManager 8/14/2017 1:01:36 PM 1952 (0x07A0)
    [ smsswd.exe ] InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    PackageID = ” InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    BaseVar = ”, ContinueOnError=” InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    ProgramName = ‘DISM.exe /Image:C:\ /Add-Driver /Driver:C:\_SMSTaskSequence\Drivers\MSB0019F\ /Recurse’ InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    SwdAction = ‘0001’ InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    Command line for extension .exe is “%1” %* InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    Set command line: Run command line InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    Working dir ‘not set’ InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    Executing command line: Run command line InstallSoftware 8/14/2017 1:01:36 PM 624 (0x0270)
    Process completed with exit code 2 InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Deployment Image Servicing and Management tool InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Version: 10.0.15063.0 InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Error: 2 InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Unable to access the image. InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Make sure that the image path and the Windows directory for the image exist and you have Read permissions on the folder. InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    The DISM log file can be found at X:\windows\Logs\DISM\dism.log InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Command line DISM.exe /Image:C:\ /Add-Driver /Driver:C:\_SMSTaskSequence\Drivers\MSB0019F\ /Recurse returned 2 InstallSoftware 8/14/2017 1:01:37 PM 624 (0x0270)
    Process completed with exit code 2 TSManager 8/14/2017 1:01:37 PM 1952 (0x07A0)
    ——————————

    https://www.dropbox.com/s/29u7m72udys2kew/taskseq.JPG?dl=0

    What Am I Missing?!

    • We figured it out! The Apply OS task must use a WIM file for the DSIM step to work. We were using an OS package instead.

      Thank you for an awesome solution!

  • Hi Maurice-

    I created a new account and followed your steps. Here is what is returned when I try and filter for driver:

    • I ended up uninstalling/reinstalling the web service and used a different account to get this working. Thank you.

  • Thank you guys for a great tool. I am having an issue getting it to work. When I run the Powershell script to get a list of packages, nothing is returned. No errors or anything:

    # User Variables
    $SiteServer = “mysite”
    $SecretKey = “mykey”

    # Connect to web service
    $URI = “https://” + $SiteServer + “/ConfigMgrWebService/ConfigMgr.asmx”
    $Web = New-WebServiceProxy -Uri $URI

    # Test-Get-CMPackage
    $Web.GetCMPackage(“$SecretKey”,””)

    1. Installed web service v 1.3 via installer
    2. Gave appropriate permissions to account in App pool for SCCM and on MDTDatabase
    3. Can browse to https://mysite/ConfigMgrWebService/ConfigMgr.asmx
    4. Downloaded a SCCM STD PKG for a Lenovo ThinkPad T470 via Driver tool
    5. Double-checked and package name is in correct format “Drivers – WMI NAME – Windows 10 x64”

    How should I go about troubleshooting this? Thank you!

    • Hi Ryan,

      This sounds like a user account issue. Set up a new account in active directory, add the account in the SCCM console and assign the role read-only analyst. Now change the application pool account to match this account and restart the application pool. Now browse to the https://mysite/ConfigMgrWebService/ConfigMgr.asmx locally on the server, select the Get-CMPackage option and enter the key and filter as “driver” then click on invoke and see if anything is returned.

      Maurice

  • This is being output to the log by the Download Driver Package script:

    The string is missing the terminator: “. TaskSequencePSHost 8/10/2017 4:26:14 PM 0 (0x0000)
    ParserError: (:) [], ParentContainsErrorRecordException TaskSequencePSHost 8/10/2017 4:26:14 PM 0 (0x0000)
    TSHOST: Fatal error running script. TaskSequencePSHost 8/10/2017 4:26:14 PM 0 (0x0000)

    I did a copy-paste direct from the raw code display in to ISE and saved the script. I can’t find any quotes missing. How can I find where this error is coming from?

  • Hello,

    I am trying to run this with SCCM 1706 and WIndows 10 1703 for HP EliteBook 840 G3 it seems like it doesn’t download anything. Here is my log’s
    8/4/2017 4:01:41 PM
    12
    Dynamic Drivers
    Install Operating System
    11138
    The task sequence execution engine ignored execution failure of an action
    0

    8/4/2017 4:01:43 PM
    13
    Download Package Content
    Install Operating System
    11134
    The task sequence execution engine successfully completed an action
    0
    … sksequence\packages\efm00083\removeapps is a directory. Setting directory security
    c:\_smstasksequence\packages\efm00083\wallpaper is a directory. Setting directory security
    c:\_smstasksequence\packages\efm00083\wallpaper\4k is a directory. Settingdirectory security
    c:\_smstasksequence\packages\efm00083\wallpaper\defaultres is a directory. Setting directory security
    Content successfully downloaded at C:\_SMSTaskSequence\Packages\EFM00083.
    Downloading content for SMS Package EFM00083 successfulResolved and downloaded package EFM00083 to C:\_SMSTaskSequence\Packages\EFM00083
    Moving package: EFM00083 to destination location ‘c:\Windows\Temp\EFM00083’ from download location ‘C:\_SMSTaskSequence\Packages\EFM00083’
    Download package EFM00083 to ‘c:\Windows\Temp\’ successfull
    Setting the custom destination variable ‘Drivers01’ to ‘c:\Windows\Temp\EFM00083’
    Adding Drivers01 to the list of paths that needs to be remapped on reboot (based on drive configuration).
    Download packages action completed
    8/4/2017 4:01:48 PM
    14
    Apply Drivers via DISM
    Install Operating System
    11135
    The task sequence execution engine failed executing an action
    2
    [ smsswd.exe ]
    PackageID = ”
    BaseVar = ”, ContinueOnError=”
    ProgramName = ‘DISM.exe /image:C:\ /Add-Driver /Driver:C:\Windows\Temp\ /Recurse’
    SwdAction = ‘0001’
    Command line for extension .exe is “%1” %*
    Set command line: Run command line
    Working dir ‘not set’
    Executing command line: Run command line

    Deployment Image Servicing and Management tool
    Version: 10.0.15063.0

    Image Version: 10.0.15063.0

    Searching for driver packages to install…
    8/4/2017 4:01:48 PM
    14
    Apply Drivers via DISM
    Install Operating System
    11138
    The task sequence execution engine ignored execution failure of an action
    0

    Driver download package process initiated 1/1/1601 12:00:00 AM 0 (0x0000)
    Manufacturer determined as: HP 1/1/1601 12:00:00 AM 0 (0x0000)
    Computer model determined as: HP EliteBook 840 G3 1/1/1601 12:00:00 AM 0 (0x0000)
    Retrieved a total of 0 driver packages from web service 1/1/1601 12:00:00 AM 0 (0x0000)
    Retrieved OS Image version from web service: 1/1/1601 12:00:00 AM 0 (0x0000)
    Determined OS name from version: 1/1/1601 12:00:00 AM 0 (0x0000)
    Unable to detect current operating system name from task sequence reference, bailing out 1/1/1601 12:00:00 AM 0 (0x0000)

  • Hi Valterri,

    By the looks of this there were no driver packages available from the web service. Have you verified that the web service is returning details manually from ConfigMgr?.

    Maurice

    • Have you looked at the log file generated by the script?. If you could send me a copy also.

  • Hi Maurice,

    i just started over with WebService 1.3 and Driver Management 4.0

    Device: HP ProBook 640 G1
    OS: Windows 10 1607 x64
    I’ve downloaded Windows 8.1 x64 Drivers as there are no Windows 10 Drivers.
    As it was not working, i renamed the Package to: Drivers – HP ProBook 640 G1 – Windows 10 x64

    but still it get an error which i can’t allocate…

    Error in DriverPackageDownload.log:
    Computer model determined as HP ProBook 640 G1
    An error occured while calling ConfigMgr Webservice for a list of available packages. Error Message: Server was unable to process request —-> The source was not found but some or all event logs could not be searched. Inaccessible logs: Security.

    What is the issue? Where should i start searching?
    I can manually run the script, it produces the error again and again.
    I can browse the ConfigMgrWebService website.

      • Hi Maurice,

        thanks! That solved the first problem 🙂
        No i got another 🙁

        Screenshot of DriverPackageDownload.log:
        https://prntscr.com/g0ie1z

        Last package should match…
        Is it because Hewlett-Packard is not present in the Package Name?

      • Ben,

        The HP and Microsoft driver builds for Windows 10 are distinguished by their build number. So take an example of a HP ProBook 640 G2 download for Windows 10 1703 and this will create a package called “Drivers – HP ProBook 640 G2 Notebook PC – Windows 10 10.0.15063.0 x64” where 10.0.15063.0 is the build. So in your example if you rename your package to “HP ProBook 640 G1 Notebook PC – Windows 10 10.0.14393.0 x64” it should provide a match. It might however be an idea just to try the G2 driver for Windows 10, rather an a Windows 8.1 driver.

        Maurice

  • Hi Maurice,

    Just wanted to say that I’ve been using your script for the production OSD builds in my environment, and it has been working great.

    I’m also using this script at the beginning of my Windows 10 in-place upgrade task sequence as a way to verify if the machine attempting the upgrade is a supported model (if the script doesn’t find a Windows 10 driver pack for the model that’s attempting the upgrade, it exits the task sequence), and I’m also using a modified version of the script so that it will work with legacy driver packages as well, using the ConfigMgr WebService function “$WebService.GetCMDriverPackageByModel”.
    My task sequence first attempts to find a ‘modern’ driver package, but if one is not found, it then tries to search for a legacy driver package.
    That way I can still use this automated solution in my task sequences, without having to re-create all of my pre-existing driver packages (I just simply re-name the legacy driver packages).

    Like some of the other people who have posted comments here, I too ran into some challenges when first trying to use this script (particularly with WMI-related issues on HP machines), so I figured I’d share some slight modifications I’ve made to this script in my own environment, in hopes that it might help some other users out there:

    1. One of the main challenges I’ve had was with HP’s inconsistent naming for similar models, even though they all share the same driver pack (.e.g., HP ProDesk 600 G3 DM, HP ProDesk 600 G3 SFF, etc.). I wanted to be able to use a single package for these drivers, but since the script is designed to only work if the machine model and name of the driver package match, I kept receiving the error message “No Package Found” whenever the WMI information of the machine was different than the name of the driver package.

    To get around this issue, I created a new variable called “$DriverPackage” (inside the “foreach $Package” loop), with the following parameters:
    $DriverPackage = ($Package.PackageName.Split(“-“)[1].Trim() -replace $ComputerManufacturer).Trim()

    So now, if my driver package is named “Drivers – HP ProDesk 600 G3 – Windows 10.0.10493”, my “$DriverPackage” variable will simply be: “ProDesk 600 G3”

    I also modified the “if” statement in my script where it is attempting to match the correct driver package and OS version with the machine model, so that it now uses the following statement:

    “if ((($ComputerModel -match $DriverPackage) -and ($ComputerManufacturer -match $Package.PackageManufacturer) -and ($Package.PackageName -match $OSName))) {”

    This way, even if the machine’s WMI information reports “HP ProDesk 600 G3 SFF”, it will still find my matching driver package, since it is now checking against my custom variable.

    2. For many of HP’s machines, a single driver pack is used for multiple models (.e.g., EliteBook 820 G3, EliteBook 840 G3, EliteBook 850 G3, etc.). Rather than having to distribute 3 copies of the same driver package (so that the name of each package would match each machine model), I created a custom “switch” in my script for any machines that share a single driver package, so that it will re-name the “$ComputerModel” variable to a custom value. I then use this same value as the name of the driver package in ConfigMgr.

    For example, I have one driver package in ConfigMgr for my EliteBook G3’s named: “Drivers – HP EliteBook 8x G3 – Windows 10”. In my modified script, I’ve added the following switch after the “($ComputerManufacturer)” section:

    # Switch Computer model to use shared driver packages
    switch -Wildcard ($ComputerModel) {

    # HP Models
    “*EliteBook 8* G3*” {
    $ComputerModel = “EliteBook 8x G3”
    Write-CMLogEntry -Value “Switching Computer Model to the following value so that shared driver package can be used: $($ComputerModel)” -Severity 1
    }

    Sorry for the long post, hopefully someone else will find this useful.

    • Hi Danny,

      It’s great to hear that you are both using the scripts in your production environment as well as tailoring them to suit the needs of your own environment.

      Indeed WMI matching has been a particular issue for some manfucaturers, something I would hope manfucaturers would take onboard and perhaps subscribe to the Dell method of keeping things consistent. Most recently I’ve put in updates for Lenovo models to more accurately match the model based on WMI and XML cross referencing which appears to be working much better now.

      I’ll be sure to put some additional work into the HP model matching for the next build, taking into account your feedback which is greatly appreciated.

      Maurice

      • SFF and Small Form Factor PC.

        ___LOG
        Removing driver package due to inconsistency between computer model value from WMI ‘HP ProDesk 600 G1 SFF’ and the translated driver package computer model name ‘HP ProDesk 600 G1 Small Form Factor PC’ ApplyDriverPackage 5/24/2019 1:25:35 PM 2912 (0x0B60)
        ____

        Would the following be possible:
        Create a Wildcard where Model type “Letters excists in the given Package”?
        example TOWER contains TWR = true

        Thanks,

        Erwin

  • Reading through the comments I read about some challenges with HP hardware. Some findings from my testing today with a HP model and Windows 1703.

    The name which is given to the package is for instance ‘Drivers – HP EliteBook 820 G3 Notebook PC – Windows 10 10.0.15063.0 x64’

    When running the Invoke-CMDownloadDriverPackage.ps1 script in the task sequence or manually the model is detected as ‘HP Elitebook 820 G3’. Since this name is not the same as the name in the package, the script exits with error 1.

    I renamed the package to ‘Drivers – HP EliteBook 820 G3 – Windows 10 10.0.15063.0 x64’ and ran the script again from the F8 command prompt.

    The second problem I ran into was with the Windows version. The version was detected as 10.0.15063.296 but the package name includes 10.0.15063.0

    I finally got it working after renaming the package to ‘Drivers – HP EliteBook 820 G3 – Windows 10 10.0.15063.296 x64’

    I like the way the Download Tool works but at the moment there are too many factors that can make the final detection fail.

    The name HP gives to their models is something you have no influence in. You might consider using a conversion table in the script if you know the real name detected by WMI during the TS.
    For the Windows versioning problem I would suggest filtering out the last digits. If the script detects the version of Windows as 10.0.15063.296 I think the 10.0.15063 already makes clear we are working with Windows 10 1703, the .296 is just the added buildnumber. This logic could also work for other versions of Windows 10 I assume.

    If you need help with testing HP hardware. I have 820 Elitebook G1/G2/G3 and 850 Elitebook G1/G2/G3 models available and for desktops the HP Prodesk 600 G1 and G2.

    • Hi Marcel,

      Indeed we are having issues with a small number of vendor WMI model names not matching their product catalogs and we aim to address this in future builds with additional matching logic. In regards the build number, the obvious workaround will be to as you state remove the final section of the build number so expect this to be fixed in an updated version I am to have up late next week which will include a number of other features community members have been asking for.

      Maurice

      • Hi Maurice,

        will this next release also capture the issues with HP Models and there Driver Packs?
        e.g.
        WMI: EliteDesk 800 G3
        DriverPack: HP ElitePro 600/800 G3 PC Win10 x64 Driver Pack
        Comments: sp80492
        HP EliteDesk 800 G3 DM
        HP EliteDesk 800 G3 SFF
        HP EliteDesk 800 G3 TWR
        HP EliteDesk 880 G3 TWR
        HP ProDesk 600 G3 DM
        HP ProDesk 600 G3 MT
        HP ProDesk 600 G3 SFF
        HP ProDesk 680 G3 MT

        If so, i’d wait before i restart my testing environment and recreate all the packages 🙂

        Thanks!
        Ben

      • Hi Ben

        I will be putting in further logic for HP devices next week as long as some additional features and version checking during the download process.

        Maurice

      • I like the idea about installing drivers in this manner but at the moment in combination with HP it’s giving me too much headaches. The driver pack for HP seems to consist of both intel and AMD64 drivers and first the installation exited on a AMD64 folder for the graphics card. I removed that folder from the package but now it’s giving more errors and exceptions on other drivers included in the default driver pack.

        Installing 4 of 74 – C:\Windows\Temp\A01000EB\Windows10-10.0.15063.0-x64-6.00.A1\audio\conexant\SP80323\OE\IntcOED.inf: Error – An error occurred. The driver package could not be installed. InstallSoftware 7-7-2017 14:38:24 2368 (0x0940)

        Installing 17 of 74 – C:\Windows\Temp\A01000EB\Windows10-10.0.15063.0-x64-6.00.A1\network\intel\P00PWG-B2Q\src\Win7Plus\Win64\Drivers\WinT\PSM.inf: Error – An error occurred. The driver package could not be installed. InstallSoftware 7-7-2017 14:39:05 2368 (0x0940)

        Installing 20 of 74 – C:\Windows\Temp\A01000EB\Windows10-10.0.15063.0-x64-6.00.A1\other\alcor mi\P00LNQ-B2L\src\program_files\AlcorMicro\x64\SZCCID.INF: Error – An error occurred. The driver package could not be installed. InstallSoftware 7-7-2017 14:39:06 2368 (0x0940)

        Upon further inspection it turned out that the installation was missing files in a specific folder so I looked inside that folder in the package folder and indeed the folder was empty.
        I looked again in the repository folder where the driver pack was unpacked and there the folder was not empty.

        I compared two folder in the repository map and in the package folder and for this specific driver the difference was 108MB in the package (87 files) vs 143MB in the repository map (214 files).

        I don’t know what method is used to create the package but if the idea is to include every file from the repository folder into the package than for some reason it is failing. The logical thing to try now is to sync the repository folder with the package folder and update the package to see if it works. I’ll try that on monday but could you shed some light on these findings?

      • Hi Marcel

        If you could provide further information such as the models you are having issues with in a mail to [email protected] I’ll look into it for you. I believe the issue here will be down to the folder path depth, HP in particular use very long folder paths which can at times exceed the maximum UNC path limit when copying. If there are issues with particular models we could look at a work around.

        Maurice

  • Hey,

    I’m trying to reference the variable defined within the “Download Package Content” step in the “Apply Drivers via DISM” step but the variable doesn’t seem to get set. %OSDisk% gets expanded fine, but %Drivers% doesn’t.

    Example:
    The command line looks like this in the task sequence:
    DISM.exe /Image:%OSDisk%\ /Add-Driver /Driver:”%Drivers%” /Recurse

    But the command line being run during the task sequence ends up being (which fails):
    DISM.exe /Image:C:\ /Add-Driver /Driver:”%Drivers%” /Recurse

    Any idea why %Drivers% isn’t getting expanded and how I can get it to work?

    Thanks,
    Daniel

    • Hi Daniel,

      Try updating your task sequence with the following;

      Download Driver Pack Step
      Custom Path: %_SMSTSMDataPath%\Drivers
      Save As Variable: DriverPackage

      Apply Drivers Via DISM Step
      DISM.exe /Image:%osdisk%\ /Add-Driver /Driver:%DriverPackage01%\ /Recurse

      Maurice

      • Hi Maurice – thanks for the quick response. That indeed solved it 🙂

  • Hi,
    We’ve started to implement this great solution and enjoy the ease of it, but during our testing
    we’re experienced a minor issue(using the latest version of the script dated 26th of may, 1.0.7), when having different versions of a Driver package (A01 and A02) like

    Drivers – Dell Latitude 7480 – Windows 10 x64 A01
    Drivers – Dell Latitude 7480 – Windows 10 x64 A02

    The Task Sequence crashes and in the Driverpackagedown.log we see this:

    Driver download package process initiated DriverPackageDownloader 16-06-2017 10:58:39 956 (0x03BC)
    Manufacturer determined as: Dell Inc. DriverPackageDownloader 16-06-2017 10:58:39 956 (0x03BC)
    Computer model determined as: OptiPlex 7050 DriverPackageDownloader 16-06-2017 10:58:39 956 (0x03BC)
    Retrieved a total of 6 driver packages from web service DriverPackageDownloader 16-06-2017 10:58:46 956 (0x03BC)
    Retrieved OS Image version from web service: 10.0.14393.0 DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Determined OS name from version: Windows 10 DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Package does not meet computer model and manufacturer criteria: DC_Terminal_V01 Additional Drivers (PS100472) DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Package does not meet computer model and manufacturer criteria: Monitor Drivers R1 (PS1005EA) DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Match found for computer model, manufacturer and operating system: Drivers – Dell OptiPlex 7050 – Windows 10 x64 (PS10094D) DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Package does not meet computer model and manufacturer criteria: Drivers – Dell Latitude 7480 – Windows 10 x64 (PS100960) DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Match found for computer model, manufacturer and operating system: Drivers – Dell OptiPlex 7050 – Windows 10 x64 (PS10099C) DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Package does not meet computer model and manufacturer criteria: Drivers – Dell OptiPlex 3040 – Windows 10 x64 (PS10099D) DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    Driver package list contains multiple matches, attempting to set task sequence variable DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)
    An error occured while setting OSDDownloadDownloadPackages variable. Error message: Cannot index into a null array. DriverPackageDownloader 16-06-2017 10:58:48 956 (0x03BC)

    As soon as we rename one of the packages, so the script only resolves one match for the model it works perfectly. So it seems like something is getting mixed-up, when there are multiple matches, at least in my setup.

    In the script it states that it will look at the package creation date if multiple matches is found, but wouldn’t it be better to look at the Version (A01, A02 the highest versionnr, is the newest), we did experience that the package creation date changed for an older package version(making A01 appears more recent than A02), when changing the package source.

    Kind Regards
    Jakob

    • Hi Jakob

      I’ll have a look at this when I get back from vacation.

      Maurice

  • I am struggeling with this “walkthrough” luckily some of the comments have helped me progress, for instance step 3) Add a Run PowerShell Script command after the Apply Operating System phase, calling the “Invoke-CMDownloadDriverPackage.ps1” script with parameters for the following:
    there is no indication of what the verbage should be in the command line, and your screenshot cuts off before showing it.
    Next step is the “Download Package Content” what is that supposed to do, i dont think you have walked through a step to create this package that we are downloading here? and in my SCCM 2012 R2 sp1 environment I do not have an option to create a “Download Package” in any of my menus, I did not integrate MDT, as i was under the impression that it was optional? Is that what I am missing?

      • Hi Jesper

        Looking at your comment I suggest it’s only a simple matter of looking over the documentation and the examples in the scripts. I’ll be back from vacation next week if you want to follow up with me, drop me a mail to [email protected] and I’m sure we can get you up and running with this.

        Maurice

      • Maurice, Thanks for your assistance through mail,
        My first problem with this process was that my SCCM server was an older version than what was needed for this. i was running sccm 2012 R2 sp1, and I needed CB 1511(I did not see that mentioned anywhere) for this to work, unfortunately I do not have a license for this version, so I cannot proceed, If I ever convince my manager to buy a new license i will pursue this further,as this is much easier than manually updating drivers in sccm.

      • Hi Jesper,

        No problem at all. Fingers crossed you get yourself a new license and get back on the latest build.

        Maurice

  • Im having a minor issue in having a brand new Dell Model Precision 7520, where the M.2 SSD Drive is not included in the driver package from Dell, so this have to be injected manually. The Intel Rapid Storage driver.

    Can i inject drives into std.Package, or do i need to use Driver Package for this.

    • Hi Thomas,

      You can add in extracted drivers into the source path of the package and then refresh your distribution points. DISM simply looks at each directory and inf file contained within the package to apply drivers, so once it is there it will attempt to match the hardware and install the driver.

      Maurice

    • I finally figured it out just some minutes after to replace the files in the storage folder and update content.:)

      I do however get an error on Apply Drivers with Dism, that doesnt make any sense.

      Failed to run the Action: Apply drivers via DISM, the system cannot find the file specified (Error: 00000002)

      • I figured it out, it was because of %osdisk% that was mentioned in previous comments, once i changed this it worked much better.

        I still had another issue after that again with drivers, because the cab file included some win7 security inf files that it failed to install, and therefore the TS was cancelled, so its not entirely smooth sailing using this method., but i have become much better in reading logs from this:)

      • Hi Jack,

        I presume you are talking about this step – DISM.exe /Image:%osdisk%\ /Add-Driver /Driver:%DriverPackage01%\ /Recurse. The %OSDisk% variable should be assigned earlier in the task sequence when formatting the OS partition (Advanced Options – Variable – OSDisk).

        Maurice

      • i used Trevors suggestion earlier up with:

        %OSDTargetSystemDrive%, so the DISM command becomes: “DISM.exe /Image:%OSDTargetSystemDrive%\ /Add-Driver …”

  • Awesome work both of you

    But a minor “bug”
    When using the driver download tool for Lenovo it gets imported to sccm as “Drivers – Lenovo T460s – Windows 10 x64”
    Problem is when you use the “Invoke-CMDownloadDriverPackage.ps1” the detection spits out “Thinkpad T460s”
    So it returns no package found.
    I tested by renaming the package to “Drivers – Thinkpkad T460s – Windows 10 x64” and it worked.

  • Hi,
    really great tool, but the WMI Name of the Driver for the Model “HP EliteOne 800 G2 23-in Non-Touch AiO” is to long for the Driver Name. Is there a way to shorten this?
    Regards,
    Robert

    • Hi Robert,

      The model names come from HP’s XML model listings and indeed there are some very long model names. The issue with shortening these is we need to cater for model detection when using our modern driver management process so we need as much info as possible to match against WMI.

      Maurice

    • Hi Robert,

      The model names come from HP’s XML model listings and indeed there are some very long model names. The issue with shortening these is we need to cater for model detection when using our modern driver management process so we need as much info as possible to match against WMI.

      Maurice

      • Hi, the PackageName can be longer, if I edit it afterwards. Only in the ConfigMgr Package-Creation-Wizzard the field for the Name is limited. I don’t know if the Driver Automation Tool can create the long Names, because it doesn’t find any HP Packages so I download the Packages with the HP SDM.
        Robert

  • I love this solution, but is it possible for this to differentiate on OS version? Some of our customers that we manage have MDT integrated task sequence that deploy both Windows 7 and Windows 10.

    An optional parameter named -OS to the “Invoke-CMDownloadDriverPackage.ps1” would solve this, then the script would know exactly which operating system to download drivers.

    • Hi Anders,

      Check out the latest version of the Invoke-CMDownloadDriverPackage.ps1 on GitHub. It now supports multiple operating systems for the driver packages (and legacy packages). It does however require ConfigMgr WebService 1.2.1 that can be found in this post. However, if you’re deploying multiple OS from the same task sequence, it won’t work. I usually consider this a bad practice as well, for a number of reasons. But everything can be overcome with PowerShell and some logic.

      Regards,
      Nickolaj

  • how does it work if we have a remote branch office to image the PC? can we setup the webservice on multiple site servers or remote DPs ?

    • Hi,

      In a branch office environment clients can talk to a centralised web service and retrieve the driver package ID, the local DP will then be used to obtain the package from (obviously if the package is available). That said if you wish you could also house the web service on multiple site servers, however you would need to cater for this in your task sequences or via a load balancing mechanism.

      Maurice

  • It looks like the model names in the Microsoft DownloadLinks.xml do not match the model names in WMI. For example, the xml contains ‘SurfacePro4’, but the model name in WMI is ‘Surface Pro 4’ (with spaces). This causes Surface driver packages to not be applied during the task sequence.

  • Thanks Maurica & Nickolaj

    We have a Robert Marshall with us at the moment working through this in our model office. Great tool.

    A slight enhancement request if possible. I have found that with two packages created for the same device one per OS so 7 and 10 in our environment. That as you would expect we get two returned values. Only problem I have is that this then lead us into the comments that Trevor left above, with the error on setting the variable OSDownloadDownloadPackage. Any chance you could find some way to detect the OS version being installed, and cross reference that so only a single package assignment is returned?

    Thanks

    • Hi Mark,

      Thanks for the feedback, you’re also in good hands with Robert looking after your SCCM environment for you. In regards to the packages, Nickolaj and I spoke about this briefly earlier on and we are sure we can do something here to resolve this for you.

      We will follow up on email so you can test an updated script.

      Maurice

  • Found a small bug in the line 161 of the PowerShell script (for when multiple packages are found) – you are just missing a “1” on the end, so:

    $Package = $PackageList | Sort-Object -Property PackageCreated -Descending | Select-Object -First

    Should be:

    $Package = $PackageList | Sort-Object -Property PackageCreated -Descending | Select-Object -First 1

    Otherwise you get this error:

    An error occured while setting OSDDownloadDownloadPackages variable. Error message: Missing an argument for parameter ‘First’. Specify a parameter of type ‘System.Int32’ and try again.

    Also, the package filter will not work for the “Dell Latitude E6430” model if you also have drivers for the “Dell Latitude E6430s” (s) model. I had to add a space in the computer model variable so that the filter could correctly distinguish between the two similar model names:

    If ($ComputerModel -eq “Latitude E6430″)
    {
    $ComputerModel = $ComputerModel + ” ”
    }

  • This is a sweet solution, thanks for posting!

    I found that with a UDI deployment, you cannot use the %OSDisk% variable as it gets cleared by the UDI wizard (read more here https://www.fosund.com/udi-wizard-clears-the-osdisk-variable/).

    You can use %OSDTargetSystemDrive% instead, so the DISM command becomes: “DISM.exe /Image:%OSDTargetSystemDrive%\ /Add-Driver …”

    You could also just use “%_SMSTSMDataPath%\Drivers\” instead of “C:\Windows\Temp\” for the driver package, so the package will get cleaned out along with the other OSD packages before the deployment ends (unless you want to keep them on disk of course…)

  • Maurice / Ben,

    Sorry, I did not see your reply to my original question before I posted my 2nd post.

    Just to provide an update, I noticed that the Driver Download Tool was created the SCCM package with the vendor listed as “Hewlett-Packard”, but when the “Invoke-CMDownloadDriverPackage.ps1” is running in the task sequence, it appears to only be looking for packages with a Vendor name of HP.

    On my package in SCCM that was created by the Driver Download Tool, I changed the vendor to “HP”, and then everything started working correctly in the task sequence. The machine was still missing some drivers after the build was complete, but at least the automation part is working correctly now.

    If not too much trouble, For HP machines it might be worth updating the script to accept Packages with a vendor listed as “Hewlett-Packard” or “HP” (since HP is not always very consistent when it comes to the vendor WMI class), and that might allow it to have better results when running in the task sequence.

    Either way, thanks again!

  • Great tool/script. Is it possible to add a variable that gets set on failure which can be used to call a auto add drivers step? We have a large number of obscure and consumer grade computers in our environment along with your standard Optiplexes and Latitudes so this would really help.

  • Hi,

    Could you please let me know how you think I could troubleshoot and determine why I’m receiving “– Empty driver package list detected, bailing out” in the DriverPackageDownload.log?

    I am using the Driver Automation Tool to download a “SCCM – Standard Package”, the package is created in SCCM and distributed to my DP correctly, and is approximately 1.9 GB in size.

    When I run the following steps manually in a PowerShell session during OSD, it returns several packages (so the rights for SCCM and the Web Service appear to be fine), and I have also tried switching out the “Dummy” package, but I continue to experience the issue of “Empy driver package list detected”.

    –Here are the steps I’m following to verify that I can access packages using the WebService during OSD:

    # User Variables
    $SiteServer = “YOURSERVERNAMEHERE”
    $SecretKey = “YOURSECRETKEYHERE”

    # Connect to web service
    $URI = $SiteServer + “/ConfigMgrWebService/ConfigMgr.asmx”
    $Web = New-WebServiceProxy -Uri $URI

    # Test-Get-CMPackage
    $Web.GetCMPackage(“$SecretKey”,””)

    –When I run this, I receive several packages, including the one I created with the Driver Automation Tool:

    PackageName : Drivers – HP ZBook 15 G3 Mobile Workstation – Windows 10 x64
    PackageID : CM002D4
    PackageManufacturer : Hewlett-Packard
    PackageVersion : 4.00 A 1
    PackageCreated : 4/10/2017 9:08:35 AM

    Any help or suggestions you could provide would be most helpful.

    Thanks.

  • Great post – however, I’m struggling to make it work. The TS keeps failing on the Dynamic Driver Detection step. Looking a the SMSTS.log its throwing an incorrect function error?

    • Hi Steve,

      Have you tried opening an a command prompt in WinPE and launching PowerShell to test the script is working with the web service?. Also have you PowerShell enabled in the boot image and the Win 10 ADK?.

      Maurice

      • Hi Maurice, PowerShell is enabled in the boot image. Not sure what you mean by in the ADK?

        Tested the script in PE with powershell and it seems to run the drop back to the prompt, as in there does not seem to be any output.

        Thanks,
        Steve

    • Hi Steve,

      I had the same error as you, it turned out to be the account in AppPool missing rights in SCCM or MDT (depending if you use MDT database).

  • Hi,

    I’m currently stuck getting trying to get this to work successfully. I’ve followed steps 1 – 3 in this article to download the driver packages (selecting “SCCM – Standard Pkg”) distributed my package, have installed the web service and tested that it works correctly, but in my OSD task sequence nothing happens when I try to download and apply the drivers. Here is what I’ve receiving in the “DriverPackageDownload.log”:

    – Driver download package process initiated
    – Manufacturer determined as: HP
    – Computer model determined as: HP ZBook 15 G3
    – Retrieved a total of 4 driver packages from web service
    – Empty driver package list detected, bailing out

    • Hi Danny,

      because HP Naming Convention is a pain..
      Check for the correct driver package name.
      If you download the driver package for the Zbook 15 G3 the name is “HP Zbook 15/17 G3….” because it applies to both models.
      But the script is looking for a driver package with Zbook 15 g3 in the name maybe thats the issue you have. I have a similar issue with Probooks 640 G1 and EliteBook 1040…

      BR
      ben

      • Hi Danny / Ben,

        Indeed HP model naming is causing some issues with the WMI model query, especially since the download script was updated to copy for the many models which share SoftPaq’s. We are looking at working on an update to add in logic to determine matches based on regular expressions to cater for this.

        Maurice

      • Hi Maurice,

        thanks for getting back.
        I corrected the Driver Package Name for the 640 G1 and now it technically works (with W7 driver pack, because there is no W10 pack for the 640G1…)

        But as you already have written before, there are multiple models sometime that apply the same driver pack.
        A solution for this would be very appreciated

  • My TS failes at Dynamic Driver Package Detection step. Error in SMSTSLog: “Failed to run the action : Dynamic Driver Package Detection: Incorrect function. (Error: 00000001;Source:Windows).
    Any idea?

    • Hi Bjørnar,

      What happens when you try running the script via a PS window in WinPE?. Also have you PowerShell enabled in the boot image and the Win 10 ADK?.

      Maurice

      • Hi Maurice,

        I figured it out. It turned out to be that the account in AppPool did’t have the enough rights in SCCM. Now it’s working like a glowe! Your DynamicDriver log file helped me solve the problem.

      • Hi Bjornar,

        i have exactly the same issue, PS is running in PE but is returning nothing.
        Can you let me know which rights you granted to the user?
        I’m not running it against MDT, it’s running only via SCCM.

      • Hi Ben,

        The minimum rights required is to be a member Read-Only analyst security role in SCCM. What happens if you query the web service from a normal PowerShell session using the following;

        # User Variables
        $SiteServer = “YOURSERVERNAMEHERE”
        $SecretKey = “YOURSECRETKEYHERE”

        # Connect to web service
        $URI = $SiteServer + “/ConfigMgrWebService/ConfigMgr.asmx”
        $Web = New-WebServiceProxy -Uri $URI

        # Test-Get-CMPackage
        $Web.GetCMPackage(“$SecretKey”,””)

        Maurice

      • It’s a lab enviroment, so i used my account, which is administrator in SCCM and on my SQL database.

      • Hi Maurice,

        i adjusted your script to:

        $URI = “https://” + $SiteServer + “/ConfigMgrWebService/ConfigMgr.asmx”

        then it works fine, providing an output of all packages.

        In my Task Sequence i’m using this as parameter (it’s uri not url or?)

        -URI “https://HOSTNAME.FQDN/ConfigMgrWebService/ConfigMgr.asmx” -SecretKey “5987d9fa-5fd9-48f5-8827-5d5c1c8814e1” -Filter “Drivers”

        If i start the script directly with the above parameters i get:

        WARNING: Unable to construct Microsoft.SMS.TSEnvironment object

      • Hi Ben,

        I did intend for you to put in https://YOURSERVERNAME, but glad you figured that out. The script parameter is URI not URL and running this inside of a normal PS environment will result in the warning message as it looks for a PE/TS environment. Can you reply with the model returned from the following PS command – Get-WMIObject -Class Win32_ComputerSystem so we can look at the naming used for the driver package?.

        Maurice

      • Hi Maurice,

        yes sure. Model Output is “HP ProBook 640 G1”
        But, i noticed that i was not using the up2date Driver Download Tool (was running 2.8)
        I’ve now adjusted the driver package names and now it’s working fine.

        But anyway, i need to test all other HP Models aswell… pain as i have a lot of different “G’s”

  • Hi guys, great article. This is the way forward! One quick Q from me. I download the drivers and I seem the models in my repository share, but no packages appear in SCCM. (under Software Library > OS > Driver Packages). Have I missed a step?

    Ta

    • Hi Mark,

      If you followed the steps on the post, then you should see the packages listed in the Software Library > Applications Management > Packages folder. Remember that using this method we are not importing the drivers into the SCCM database, simply creating a package that will be used during the TS.

      Maurice

      • Why are you using the standard package instead of a driver package? It seems to me it would make more sense to use the driver package.

      • Hi Keith,

        The main reasons we are recommending standard packages over driver packages are as follows;

        1. Improved driver package creation time, no need to wait for every driver to import
        2. Reduces the load on the SQL database as driver entries are not maintained
        3. Avoids issues with driver imports, incorrect versions etc
        4. Provides greater control over the specific drivers applied to each model as each drivers are contained within physically separate packages

        There is nothing wrong as such with using Driver Packages, but for the reasons mentioned we recommend using Standard Packages. If you are concerned about space issues on your DP’s, you can enable data-deduplication to claw back any space used by the duplicate entries.

        Maurice

  • Hi,

    Great post! just one question; the Download Package Content step, what package is that? Where is that created? or is it just a random package?

    -Bjørnar

    • Hi,

      I can see that the part about the dummy package may not have been clearly stated, so it’s been updated now. Simply use any package of your choice, it doesn’t matter what, since it won’t be downloaded.

      Regards,
      Nickolaj

  • Hi,
    Did you think about second part of driver certification? How to automate driver download and importing that can’t be included in drivers packs, because they have only setup.exe without any INF file?

    I have some draft “PS scirpt” for automating hardware application detection, downloading, preparation and importing for HP computers. If you are interested in it, please contact with me.

    Thank you.

    • Hi Kristians,

      If the script can do anything to help HP deployments, then by all means send over a copy to review. If any of the code is included in the tool I will provide an acknowledgement to you.

      Maurice
      [email protected]

  • Amazing, I look forward to testing this out. Does this mean we could also do BIOS updates in a similar way ?

  • Hi,
    Great post(and work) and very interesting. Just a single question is it possible to manage the download of the right driver package when you have multiple OS (Windows 7, Windows 10) and different architectures (x86 and x64) for the same hardware model by using this approach?
    Kind regards
    Jakob

    • Hi Jakob,
      I haven’t tried x86 and x64 yet (everything is x64 here), but for Multiple OS I have set my package names to W10Drv and W7Drv as a prefix and used that in the -filter of the TS step instead of using “Drivers” like in the guide above.
      Regards,
      Andrew

      • Hi Andrew,
        Thank you for your post. I got inspired by the solution Matthew Teegarden posted recently and decided to add some code from his script to the code of Nikolaj and Maurice and made it possible to support multiple os and architecture(according to a Tweet by Maurice I Think it was,, an Update is on it’s Way supporting multiple OS etc.
        Kind Regards,
        Jakob

Sponsors