Fehler beim Installieren des Audiotreiberskripts mit Microsoft Update als Quelle auf Dell

Nov 24 2020

Ich versuche, den folgenden Code auszuführen, um den Realtek-Audiotreiber auf dem Dell-Laptop zu installieren, erhalte jedoch den folgenden Fehler. Ist es möglich, dieses Skript für alle Laptop-Modelle zu verwenden, um fehlende Audiotreiber zu installieren oder zu aktualisieren? Jede Hilfe wäre sehr dankbar

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 }  ```

Antworten

Theo Nov 25 2020 at 15:24

Es gibt ein paar Dinge, die ich in Ihrem Code ändern würde.
Zum einen denke ich, dass Sie (unnötigerweise) Microsoft.Update.UpdateCollzweimal ein neues Objekt erstellen . Dann überprüfen Sie nicht, ob tatsächlich Updates installiert werden müssen. Zu diesem Zeitpunkt sollte der Code beendet werden.

Der Test für den Treiberhersteller in Ihrem Code ist -like 'Realtek', aber ohne ihn *umgebende Platzhalterzeichen ( ) ist dies der gleiche wie -eq 'Realtek'und aus diesem Grund könnten Sie ein Paar verpassen.

# 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()