Falha ao instalar o script do driver de áudio usando a atualização da Microsoft como fonte na Dell
Estou tentando executar o código abaixo para instalar o driver de áudio Realtek no laptop Dell, mas obtendo o erro abaixo. É possível usar este script para todos os modelos de laptop para instalar o driver de áudio ausente ou atualizá-lo? Qualquer ajuda seria muito apreciada
ERRO:
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 } ```
Respostas
Existem algumas coisas que eu mudaria em seu código.
Por um lado, acho que você está (desnecessariamente) criando um novo Microsoft.Update.UpdateColl
objeto duas vezes. Então, você não está verificando se realmente há atualizações para instalar e, nesse ponto, o código deve ser encerrado.
O teste para o fabricante do driver em seu código é -like 'Realtek'
, mas sem caracteres curinga ( *
) ao seu redor, é o mesmo -eq 'Realtek'
e por isso você pode perder alguns.
# 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()