Niepowodzenie instalacji skryptu sterownika audio przy użyciu Microsoft Update jako źródła w firmie Dell
Próbuję uruchomić poniższy kod, aby zainstalować sterownik audio realtek na laptopie Dell, ale pojawia się błąd poniżej. Czy można użyć tego skryptu dla wszystkich modeli laptopów, aby zainstalować brakujący sterownik audio lub zaktualizować go? Każda pomoc byłaby bardzo mile widziana
BŁĄD:
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 } ```
Odpowiedzi
Jest kilka rzeczy, które chciałbym zmienić w Twoim kodzie.
Po pierwsze, myślę, że (niepotrzebnie) Microsoft.Update.UpdateColl
dwukrotnie tworzysz nowy obiekt. Wtedy nie sprawdzasz, czy rzeczywiście są aktualizacje do zainstalowania, w którym momencie kod powinien zostać zamknięty.
Test dla producenta sterownika w twoim kodzie jest taki -like 'Realtek'
, że bez *
otaczających go symboli wieloznacznych ( ) jest to to samo, co -eq 'Realtek'
i dlatego możesz przegapić kilka.
# 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()