Failing to install audio driver script using microsoft update as source on dell

0

I am trying to run below code to install realtek audio driver on dell laptop but getting below error. Is it possible to use this script for all model laptop to install missing audio driver or update it? Any help would be greatly appreciated

ERROR:

RegistrationState ServiceID                            IsPendingRegistrationWithAU Service           
----------------- ---------                            --------------------------- -------           
                3 7971f918-a847-4430-9279-4a52d1efe18d                       False System.__ComObject
Exception from HRESULT: 0x80240024
+ $Downloader.Download()
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
 
Installing Drivers...
Exception from HRESULT: 0x80240024
+ $InstallationResult = $Installer.Install()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException


 
**CODE:** 

$UpdateSvc = New-Object -ComObject Microsoft.Update.ServiceManager            
$UpdateSvc.AddService2("7971f918-a847-4430-9279-4a52d1efe18d",7,"")     

$Session = New-Object -ComObject Microsoft.Update.Session           
$Searcher = $Session.CreateUpdateSearcher() 

$Searcher.ServiceID = '7971f918-a847-4430-9279-4a52d1efe18d'
$Searcher.SearchScope =  1 # MachineOnly
$Searcher.ServerSelection = 3 # Third Party
          
$Criteria = "IsInstalled=0 and Type='Driver'"
Write-Host('Searching Driver-Updates...') -Fore Green     
$SearchResult = $Searcher.Search($Criteria)          
$Updates = $SearchResult.Updates | Where-Object { $_.DriverManufacturer -like 'Realtek' }
    
#Show available Drivers...

$Updates | select Title, DriverModel, DriverVerDate, Driverclass, DriverManufacturer | fl

#Download the Drivers from Microsoft

$UpdatesToDownload = New-Object -Com Microsoft.Update.UpdateColl
$updates | % { $UpdatesToDownload.Add($_) | out-null }
Write-Host('Downloading Drivers...')  -Fore Green  
$UpdateSession = New-Object -Com Microsoft.Update.Session
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $UpdatesToDownload
$Downloader.Download()

#Check if the Drivers are all downloaded and trigger the Installation

$UpdatesToInstall = New-Object -Com Microsoft.Update.UpdateColl
$updates | % { if($_.IsDownloaded) { $UpdatesToInstall.Add($_) | out-null } }

Write-Host('Installing Drivers...')  -Fore Green  
$Installer = $UpdateSession.CreateUpdateInstaller()
$Installer.Updates = $UpdatesToInstall
$InstallationResult = $Installer.Install()
if($InstallationResult.RebootRequired) {  
Write-Host('Reboot required! please reboot now..') -Fore Red  
} else { Write-Host('Done..') -Fore Green }  ```
powershell
asked on Stack Overflow Nov 24, 2020 by PGT

1 Answer

0

There are a couple of things I would change in your code.
For one thing, I think you are (unnecessarily) creating a new Microsoft.Update.UpdateColl object twice. Then you are not checking if there actually are updates to install, at which point the code should exit.

The test for the driver manufacturer in your code is -like 'Realtek', but without wildcard characters (*) surrounding it, this is the same as -eq 'Realtek' and because of that you might miss a couple.

# check if the Windows Update service is running
if ((Get-Service -Name wuauserv).Status -ne "Running") { 
    Set-Service -Name wuauserv -StartupType Automatic
    Start-Service -Name wuauserv 
} 
# check if there are updates available
$UpdateSession  = New-Object -Com Microsoft.Update.Session
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
Write-Host 'Searching Driver-Updates...' -ForegroundColor Green     
$SearchResult   = $UpdateSearcher.Search("IsInstalled=0 and Type='Driver' and IsHidden=0")

# collect the updates
$UpdateCollection = New-Object -Com Microsoft.Update.UpdateColl
$Updates = for ($i = 0; $i -lt $SearchResult.Updates.Count; $i++) {
    $Update = $SearchResult.Updates.Item($i)
    # we are only interested in RealTek Audio driver updates
    # if you need to add more manufacturers, change the first part in the 'if' to for instance
    # $Update.DriverManufacturer -match 'Realtek|Conexant|Intel'
    if ($Update.DriverManufacturer -like '*Realtek*' -and
       ($Update.Title -like '*audio*' -or $Update.Description -like '*audio*')) {
        if (-not $Update.EulaAccepted) { $Update.AcceptEula() | Out-Null }
        [void]$UpdateCollection.Add($Update)
        # output a PsCustomObject for display purposes only
        $Update | Select-Object Title, DriverModel, DriverVerDate, Driverclass, DriverManufacturer
    }
}

# no updates found; exit the script
if ($null -eq $Updates -or $Updates.Count -eq 0) {
     Write-Host 'No Driver-Updates available...' -ForegroundColor Cyan
}
else {
    # Show available driver updates...
    $Updates | Format-List
   
    # download the updates
    Write-Host 'Downloading driver updates...' -ForegroundColor Green  
    $Downloader = $UpdateSession.CreateUpdateDownloader()
    $Downloader.Updates = $UpdateCollection
    $Downloader.Priority = 3  # high
    [void]$Downloader.Download()

    # install the updates
    Write-Host 'Installing Drivers...' -ForegroundColor Green
    $Installer = $UpdateSession.CreateUpdateInstaller()
    # accept all Critical and Security bulletins.
    $Installer.ForceQuiet = $true
    $Installer.Updates    = $UpdateCollection
    $InstallationResult   = $Installer.Install()

    $ResultCode = $InstallationResult.ResultCode

    # test if the computer needs rebooting
    if ($InstallationResult.RebootRequired) {
        Write-Host 'Reboot required! please reboot now..' -ForegroundColor Red
    }
    else {
        Write-Host 'Done..' -ForegroundColor Green
    }
}

# Clean-up COM objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSession)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSearcher)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateCollection)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($SearchResult)
if ($Downloader) { $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Downloader)}
if ($Installer)  { $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Installer)}
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
answered on Stack Overflow Nov 25, 2020 by Theo • edited Nov 27, 2020 by Theo

User contributions licensed under CC BY-SA 3.0