marcimarc85
Goto Top

Windows Updates remote per Powershell abfragen und installieren

Ich bin etwas am verzweifeln. ich versuche nun schon seit einiger zeit ein Powershell Script zu erstellen, Womit ich von einem Server aus, auf allen anderen Servern, die ich im Script definiere, die ausstehenden Windows Updates anzeigen, installieren lassen und ggf. einen Serverreboot auslösen kann.

Die einzelnen Komponenmten funktionieren eigentlich schon.
- Das Auslesen ausstehedner Updates lokal funktioniert
- Das erkennen des ausstehenden Reboots funktioniert
- Der Reboot eines Remoteservers funktioniert.

Es hapert nun aber daran, dass ich die Ausstehenden Updates bei einem Remoteserver nicht abfragen kann. Ich bekomme immer ein Access denied. Ich habe schon etliche Ansätze versucht, die ich in diversen Foren gefunden habe, aber keiner führte bisher zum Ziel. Aktuell probiere ich es mit:

$adminUsername='<domain\admin-user>'  
$plaintextPassword='<admin-user-password>'  
$encryptedPassword=ConvertTo-securestring $plaintextPassword -AsPlainText -Force
$adminCredential=New-Object -TypeName System.Management.Automation.PSCredential -Args $adminUsername,$encryptedPassword

$Computername = '<server-ip>'  
$updatesession = [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session",$Computername))  
$UpdateSearcher = $updatesession.CreateUpdateSearcher()
$searchresult = $updatesearcher.Search("IsInstalled=0") # 0 = NotInstalled | 1 = Installed  
$searchresult.Updates.Count

$Updates = If ($searchresult.Updates.Count -gt 0) {
#Updates are waiting to be installed
$count = $searchresult.Updates.Count
Write-Verbose "Found $Count update\s!"  
#Cache the count to make the For loop run faster
For ($i=0; $i -lt $Count; $i++) {
#Create object holding update
$Update = $searchresult.Updates.Item($i)
[pscustomobject]@{
Title = $Update.Title
KB = $($Update.KBArticleIDs)
SecurityBulletin = $($Update.SecurityBulletinIDs)
MsrcSeverity = $Update.MsrcSeverity
IsDownloaded = $Update.IsDownloaded
Url = $Update.MoreInfoUrls
Categories = ($Update.Categories | Select-Object -ExpandProperty Name)
BundledUpdates = @($Update.BundledUpdates)|ForEach{
[pscustomobject]@{
Title = $_.Title
DownloadUrl = @($_.DownloadContents).DownloadUrl
}
}
}
}
}

$updates |ft kb,title,msrcseverity,url -autosize

Als Ausgabe beokomme ich:

Exception calling "CreateInstance" with "1" argument(s): "Retrieving the COM class factory for remote component with CLSID {4CB43D7F-7EEE-4906-8698-60DA1C38F2FE} from machine <server-ip>  
failed due to the following error: 80070005 <server-ip>."  
At line:2 char:1
+ $updatesession = [activator]::CreateInstance([type]::GetTypeFromProgI ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : UnauthorizedAccessException
 
3

KB      Title                                                                                            MsrcSeverity Url               
--      -----                                                                                            ------------ ---               
4598243 2021-01 Cumulative Update for Windows Server 2016 for x64-based Systems (KB4598243)              Critical     System.__ComObject
4535680 Security Update for Windows Server 2016 for x64-based Systems (KB4535680)                        Important    System.__ComObject
2267602 Security Intelligence Update for Microsoft Defender Antivirus - KB2267602 (Version 1.329.2219.0)              System.__ComObject

Das Ergebnis mit den 3 Updates ist dann vom lokalen Server abgegriffen. Keine Ahnung, warum. der Remote Server hat nämlich lediglich 1 Update ausstehend.
Wie bekomme ich es hin, dass ich dem Befehl "CreateInstance" die vorher definierten Credentials mitgeben kann? Ich denke, daran scheitert das Ganze nämlich.


PS: Alle Server haben keine Internetverbindung! Es geht wirklich rein darum zu prüfen, welcher Server noch ausstehende Updates zu Installation hat und wer einen Neustart benötigt.

Content-Key: 640959

Url: https://administrator.de/contentid/640959

Printed on: April 20, 2024 at 11:04 o'clock

Member: Dr.Bit
Dr.Bit Jan 15, 2021 at 11:24:30 (UTC)
Goto Top
Wie erkennne denn die Server, das Updates verfügbar sind bzw. das sie welche brauchen, wenn die keine Internetverbindung haben? WSUS?

🖖
Member: MarciMarc85
MarciMarc85 Jan 15, 2021 at 12:22:34 (UTC)
Goto Top
Die Server stellt der Kunde bereit, für den wir unsere Software darauf installieren und verwalten. Die Updateigenschaften werden von der Domäne verwaltet und sind daher ausgegraut. Ich denke mal, da wird nen WSUS hinterhängen, der die Updates verteilt. Ist ja auch erstmal zweitrangig.
Die Windows Server zeigen an, dass Updates bereit sind zur Installation. Das möchte ich gern per Scipt abfragen und ausführen lassen, damit ich das nicht per Hand bei jedem Server machen muss und der Kunde das dann immer moniert wenn das nicht bis zu zeitpunkt xy passiert ist.