Beim letzten Beitrag über das Fujitsu DeskUpdate habe ich euch gezeigt, wie das in die baramundi Management Suite integriert werden kann. Natürlich ist es auch möglich dieses Wissen analog auf andere Produkte umzusetzen. Aus diesem Grund gehen wir hier noch mal die Powershell Skripte durch die benutzt werden um Ducmd.exe aufzurufen.
Powershell Skript – Prüfen auf Updates
Wir werden das ganze Abschnittsweise durchgehen, damit ihr eine bessere Übersicht bekommt.
Abschnitt 1: config values
# --------------------------------------------------------------------------- # config values # --------------------------------------------------------------------------- param( [Parameter(Mandatory=$true, Position=0, ParameterSetName="DeskUpdate Path", ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, HelpMessage="Path to location of Ducmd.exe")] [Alias("PSPath")] [ValidateNotNullOrEmpty()] [string[]] $DeskUpdate )
Hier wird definiert welche Parameter das Skript von außen erwartet. DeskUpdate ist als Parameter anzugeben. Dieser muss auf die Ducmd.exe zeigen. Im ersten Abschnitt wird nur überprüft, ob ihr diesen angebt und dieser nicht leer ist.
Abschnitt 2: Prüfen der Powershell Version
# --------------------------------------------------------------------------- # main program starts here # --------------------------------------------------------------------------- # check for powershell version if ($PSVersionTable.PSVersion.Major -lt 4) { Write-Error "Powershell Version 4 required" exit 9000 }
Die verwendeten Funktionen setzen eine Powershell Version von mindestens 4.0 voraus. Es wird also überprüft ob diese Version eingesetzt wird. Sollte die Version kleiner sein, wird eine Fehlermeldung ausgegeben und ein Returnwert von 9000 ausgegeben.
Abschnitt 3: Prüfen ob Ducmd.exe vorhanden ist
# check for Deskupdate if (! (Test-Path $DeskUpdate) ) { Write-Error "Deskupdate not found" exit 9001 }
Im Abschnitt 1 wurde der DeskUpdate Pfad angegeben und hier überprüft ob Ducmd.exe dort vorhanden ist. Im Fehlerfall wird wieder eine Fehlermeldung ausgegeben und ein Returnwert von 9001 zurückgegeben.
Eine zusätzliche Überprüfung auf die Version lässt sich hier ebenfalls einbauen. Das Powershell Skript ist auf die Version 5.x ausgelegt. Ältere Versionen funktionieren unter Umständen nicht korrekt.
Abschnitt 4: Updates suchen – Ausführung erfolgreich
else { # run Ducmd with parameters $content = (cmd /c $DeskUpdate' /WEB /LIST') # if success, next step if ($LASTEXITCODE -eq 0) { # extract only installable packages $content = ($content.Where({$_ -like "Installable packages:"}, 'SkipUntil').Trim()) | Select-Object -Skip 1 if ($content.Count -gt 0) { # return update available Write-Host "Update required $($content)" exit 9002 } else { # return no update available Write-Host "no Update required $($content)" exit 9003 } } else { # return code deskupdate Write-Error "Program terminated with errorcode $($LASTEXITCODE) - check Ducmd.exe /E for more information" exit $LASTEXITCODE } }
Der letzte Abschnitt ist die eigentliche Ausführung des Programms Ducmd.exe. Die erzeugte Ausgabe des Programms wird in die Variable $content gespeichert, die später ausgewertet wird.
Beispiel $content
ducmd 5.00.8.0
Copyright (c) 2017 Fujitsu Technology Solutions
DeskUpdate command line applicationComputer Product Identification:
Product . . . . : ESPRIMO_P556
Board . . . . . : D3400-A1
Operating system: W10 (AMD64)
Marketing name : ESPRIMO_P556Installable packages:
[ID] 4051 – Realtek PCI-E NIC Family all in one NDIS Driver for Windows 10, [version] 10.026.0328.2018
[ID] 4203 – Intel® HD Graphics (KabyLake), [version] 100.6136 – 24.20.100.6136 – PV – 64bit
[ID] 3841 – Intel AHCI 16.0.2.1086 PV, [version] 16.0.2.1086 – PV
[ID] 4127 – FUJ02E3 Device Driver 4.0.2.6 (DCU), [version] 4.0.2.6
[ID] 4237 – Workplace PowerSettings 2.20.0039 (64), [version] 2.20.0039
Auch Ducmd.exe gibt einen Rückgabewert aus. Diesen prüfen wir im nächsten Schritt, nur wenn dieser Erfolgreich, also 0 ist, überprüfen wir den Inhalt von $content. Die nächste Zeile such innerhalb der Variable nach der Zeile “Installable packages:”, verwirft alles bis dahin und gibt die übernächste Zeile, von Leerzeichen am Anfang und Ende bereinigt, aus.
Der einzige Inhalt sind jetzt die “[ID] …”-Einträge diese zählen wir und wenn diese größer als 0 sind, geben wir die Meldung aus “Update required $($content)”. Wird das Script lokal ausgeführt sieht man jetzt die offenen Updates. Gleichzeitig wird das Skript mit dem Returncode 9002 beendet.
Sollten keine “[ID] …”-Einträge vorhanden sein, so wird die Meldung ausgegeben “no Update required $($content)” und der Returncode 9003.
Abschnitt 5: Updates suchen – Ausführung fehlgeschlagen
} else { # return code deskupdate Write-Error "Program terminated with errorcode $($LASTEXITCODE) - check Ducmd.exe /E for more information" exit $LASTEXITCODE }
Sollte Ducmd.exe als Rückgabewert keine 0 ausgegeben haben, so wird am Schluss eine Fehlermeldung “Program terminated with errorcode $($LASTEXITCODE) – check Ducmd.exe /E for more information” ausgegeben und als Rückgabewert der Wert den uns Ducmd.exe gegeben hat.
Powershell Skript – Updates installieren
Abschnitt 1: config values
# --------------------------------------------------------------------------- # config values # --------------------------------------------------------------------------- param( [Parameter(Mandatory=$true, Position=0, ParameterSetName="DeskUpdate Path", ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, HelpMessage="Path to location of Ducmd.exe")] [Alias("PSPath")] [ValidateNotNullOrEmpty()] [string[]] $DeskUpdate )
Hier wird definiert welche Parameter das Skript von außen erwartet. DeskUpdate ist als Parameter anzugeben. Dieser muss auf die Ducmd.exe zeigen. Im ersten Abschnitt wird nur überprüft, ob ihr diesen angebt und dieser nicht leer ist.
Abschnitt 2: Prüfen ob Ducmd.exe vorhanden ist
# check for Deskupdate if (! (Test-Path $DeskUpdate) ) { Write-Error "Deskupdate not found" exit 9001 }
Sollte Ducmd.exe nicht vorhanden sein oder kein Zugriff darauf möglich sein, so wird eine Fehlermeldung ausgegeben und der Rückgabewert 9001.
Abschnitt 3: Updates installieren
else { # run Ducmd with parameters $content = (cmd /c $DeskUpdate' /INSTALL /WEB /X') exit $LASTEXITCODE }
Die Installation wird gestartet und innerhalb der Variable $content gespeichert. Diese kann später auch weiter ausgewertet werden. Diese enthält die Information über den Download und die Installation. Der Inhalt könnte zum Beispiel wie folgt aussehen:
Beispiel $content
ducmd 5.00.8.0
Copyright (c) 2017 Fujitsu Technology Solutions
DeskUpdate command line applicationComputer Product Identification:
Product . . . . : ESPRIMO P420
Board . . . . . : D3230-A1
Operating system: W7 (AMD64)
Marketing name : ESPRIMO P420Creating a system restore point
Package 0/6 downloaded
Package 1/6 downloaded
Package 2/6 downloaded
Package 3/6 downloaded
Package 4/6 downloaded
Package 5/6 downloaded
Package 6/6 downloaded
Package 1/6 installed
Package 2/6 installed
Package 3/6 installed
Package 4/6 installed
Package 5/6 installed
Installation finishedDeskUpdate requires a reboot to activate changes!!!
Der Rückgabewert wird direkt durchgereicht. Eine genauere Auswertung wäre möglich, in den meisten Fällen reicht aber der Rückgabewert.
Auf der nächsten Seite werden wir uns die Rückgabewerte von Ducmd anschauen.
Rückgabewerte von Ducmd
ducmd 5.00.8.0 Copyright (c) 2017 Fujitsu Technology Solutions DeskUpdate command line application ducmd Version 5.00.8.0 Copyright (c) 2017 Fujitsu Technology Solutions DeskUpdate command line application Program exit codes: 0 Success. (no reboot required, if /x is provided, see ERRORLEVEL 300) 1 Syntax error in command line. 3 Configuration file "DuCore.config.json" not found. 4 Unsupported operating system. 5 System not supported. 6 DeskUpdate or DuCmd already running. 7 General error. 10 Error while installing Windows Update. 20 Error while installing driver. 22 DeskUpdate requires administrator rights. 30 Error while installing application. 40 Install error, see output for details. 50 Wrong package ID(s) or BIOS package. Use '/LIST' to get the package ID(s). 99 Unexpected exception. 100 No internet connection available. 110 No connection to web service. 120 Web service currently not enabled. Please retry later. 130 System not supported by DeskUpdate Web. 140 Download of main catalog file not possible. Please retry later. 150 The DeskUpdate version is out of date. Set SelfUpdateAllowed to true in DuCore.config.json or add /AU parameter to allow update of DUCMD.exe. 151 DUCMD.exe started a self-update. 155 The DeskUpdate version was out of date. Update of DUCMD.exe was successful. 157 The DeskUpdate version is out of date. Update of DUCMD.exe failed. 160 Web update disabled. Please enable in CONFIG.ini (WEBUPDATE="1"). 161 Web update only works with systems from Fujitsu. 170 Download denied due to legal requirements. 171 Operating system prerequisite missing (e.g. hotfix). 200 Canceled action by CTRL event. 300 Success. Reboot required. (Note: parameter /x was used) 1025 The remaining battery capacity is too low. Please charge the battery or add /IBAT parameter to ignore the battery capacity.
Anhand dieser Rückgabewerte lassen sich alle Eventualitäten abfangen. Dieses kann durch den Einsatz von Powershell sein. Oder in dem nachgelagerten Programm umgesetzt werden.
Konfiguration von Ducmd
Um die Treiber, Software und eventuelle Windows Updates herunterladen zu können, muss Fujitsu DeskUpdate sich mit dem Internet verbinden. Das geschieht in fast allen Unternehmen durch einen Proxy. Alle benötigten Informationen müssen in der Datei DuCore.config.json eingetragen werden.
"Proxy": { "ProxyType" : 1, "_Comment_ProxyType0" : "0 = ProxyNone", "_Comment_ProxyType1" : "1 = ProxyAuto (default)", "_Comment_ProxyType2" : "2 = ProxyExplicit (uses ProxyUsername, ProxyPassword, ProxyServer)", "_Comment_ProxyType3" : "3 = ProxyAutoConfigUrl (uses ProxyAutoconfigUrl)", "_Comment_ProxyType4" : "4 = ProxyDefault", "_Comment_ProxyType5" : "5 = ProxyDefaultIe", "ProxyUsername" : "proxy1", "ProxyPassword" : "proxy2", "ProxyAutoconfigUrl" : "", "ProxyServer" : "192.168.168.207:808" },
Die Einträge sind selbsterklärend und in allen Fällen wird eine https Verbindung zu der folgenden URL aufgebaut https://webdownloads.ts.fujitsu.com/DeskUpdate5. Ducmd verwendet eine Art von Public-Key-Pinning, solltet ihr also den https-Traffic scannen, muss eine Ausnahme definiert werden.
Innerhalb dieser Datei ist es auch möglich den System-Wiederherstellungspunkt SystemRestore zu deaktivieren. Dieser wird automatisch angelegt sobald eine Installation statt findet. Zu finden im ersten Abschnitt unter Config.
"Config": { "WebUpdateAllowed" : true, "SystemRestore" : true, "Repository" : "..\\html\\json", "FtsDeskUpdateServerUri": "https://webdownloads.ts.fujitsu.com/DeskUpdate5" "PackageRoot" : "..\\", },
Auf der letzten Seite findet ihr die Skripte und die Links zum Fujitsu DeskUpdate.