Échec de l'installation du script de pilote audio à l'aide de Microsoft Update comme source sur Dell
J'essaie d'exécuter le code ci-dessous pour installer le pilote audio realtek sur un ordinateur portable Dell mais j'obtiens une erreur ci-dessous. Est-il possible d'utiliser ce script pour tous les modèles d'ordinateurs portables pour installer le pilote audio manquant ou le mettre à jour? Toute aide serait grandement appréciée
ERREUR:
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 } ```
Réponses
Il y a deux choses que je changerais dans votre code.
D'une part, je pense que vous créez (inutilement) un nouvel Microsoft.Update.UpdateColl
objet deux fois. Ensuite, vous ne vérifiez pas s'il y a réellement des mises à jour à installer, à quel point le code doit se fermer.
Le test pour le fabricant du pilote dans votre code est -like 'Realtek'
, mais sans caractères génériques ( *
) qui l'entourent, c'est le même que -eq 'Realtek'
et à cause de cela, vous risquez d'en manquer quelques-uns.
# 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()