WSUS Package Publisher > Chrome per WPP als Update bereitstellen

Wie der Name WSUS bereits erahnen lässt, können damit Updates bereitgestellt werden. Soll beispielsweise eine Software, welche nicht auf allen PCs installiert ist, aktualisiert werden, muss man sich ein paar mehr Gedanken machen. Denn dann kann nicht einfach nur die neue MSI verteilt werden. Der WPP bietet aber auch hierfür die entsprechenden Möglichkeiten.

In meinem Fall ging es darum, den aktuellen Google Chrome for Work nur auf den PCs zu aktualisieren, die bereits eine ältere Version installiert haben. Woran erkennt also der Update Agent, ob bereits eine ältere Version von Google Chrome installiert ist. Die einfache Variante wäre, wenn es eine Liste aller vorherigen MSI Product Codes (z.B. d23a947a-7d38-3af8-b3d5-be988282d40d) gibt, die dann als Bedingung im WPP hinterlegt werden (Vielleicht bringt Google ja auch mal einen SCUP Catalog raus, wie das z.B. Adobe für seinen Flashplayer oder den Reader tut.). Das kann sich allerdings schwierig gestalten, diese Versionen nachträglich rauszufinden, denn wer hat schon alle Chrome Versionen noch rumfliegen? (Anmerkung: Falls jemand eine Liste kennt, dann immer her damit.)

Alternativ gibt es die Möglichkeit die Dateiversion der "chrome.exe" mit der neuen Version zu vergleichen.


Fileversionen von Google Chrome 39.0.2171.95 (ältere Version) und 40.0.2214.115 (Aktuelle Version, die verteilt werden soll)

Hierzu werden im WPP entsprechende "Installable Rules" angelegt, die die Dateiversion prüfen; also ist die bereits vorhandene Version kleiner als die Aktuelle? Dabei stellt man dann zweierlei Dinge relativ schnell fest.

1. Wenn kein Chrome installiert ist, ist die Version auch kleiner als die zu verteilende Version. Das Update würde also an alle verteilt werden.

2. Wenn eine Mischung aus 32-bit und 64-bit Betriebssystemen im Einsatz ist, muss man auch beide berücksichtigen. Zur Sicherheit also einfach gleich beides anlegen.

Leider ist die Handhabung der Regelerstellung im WPP noch nicht sehr intuitiv, aber man kommt auf jeden Fall zum Ziel.

Die bereits bestehende Bedingung "Wenn das MSI noch nicht installiert ist", bleibt erhalten. Danach wird als erstes  eine Oder-Gruppe hinzugefügt. In diese werden dann noch zwei UND-Gruppen eingefügt. Aufpassen, dass die UND-Gruppen nicht geschachtelt sind, sondern auf der gleichen Ebene stehen.

Danach wird in jeder UND-Gruppe eine Bedingung vom Typ "Datei existiert" angelegt und eine weitere Bedingung vom Typ "Dateiversion".



"Datei existiert" im 64-bit Windows (Variable ProgramFiles(x86)) im Standardpfad einer Chrome-Installation (32-Bit Version)
Auf einem 32-bit Windows nutzt man hier einfach die Variable ProgramFiles

Zusätzlich wird in der zweiten Bedingung geprüft, ob die bereits vorhandene Version der chrome.exe "kleiner" als die neu zu verteilende ist.




Hier gilt der Hinweis bzgl. 32-bit identisch zur oberen Regel.

Das Ergebnis sieht dann im WPP etwas "unübersichtlich" aus, aber möglicherweise gibt es irgendwann eine Version, die das besser abbilden kann.



Es ist allerdings möglich, diese Regeln als Regelwerk zu exportieren. Hierzu einfach auf "Regel speichern..." klicken. Das Ergebnis ist dann eine .rules Datei. Diese kann man mit jedem Texteditor öffnen und editieren. Für obiges Beispiel sieht das dann so aus:

 
<lar:And>
<lar:Not>
<msiar:MsiProductInstalled ProductCode=""/>
</lar:Not><lar:Or>
<lar:And>
<bar:FileExists Path="Google\Chrome\Application\chrome.exe" Csidl="42"/><bar:FileVersion Path="Google\Chrome\Application\chrome.exe" Comparison="LessThan" Version="40.0.2214.115" Csidl="42"/></lar:And>
<lar:And>
<bar:FileExists Path="Google\Chrome\Application\chrome.exe" Csidl="38"/><bar:FileVersion Path="Google\Chrome\Application\chrome.exe" Comparison="LessThan" Version="40.0.2214.115" Csidl="38"/></lar:And>
</lar:Or>
</lar:And>
<lar:Or>
<lar:And>
<bar:FileExists Path="Google\Chrome\Application\chrome.exe" Csidl="42"/><bar:FileVersion Path="Google\Chrome\Application\chrome.exe" Comparison="LessThan" Version="40.0.2214.115" Csidl="42"/></lar:And>
<lar:And>
<bar:FileExists Path="Google\Chrome\Application\chrome.exe" Csidl="38"/><bar:FileVersion Path="Google\Chrome\Application\chrome.exe" Comparison="LessThan" Version="40.0.2214.115" Csidl="38"/></lar:And>
</lar:Or>
<lar:And>
<bar:FileExists Path="Google\Chrome\Application\chrome.exe" Csidl="42"/><bar:FileVersion Path="Google\Chrome\Application\chrome.exe" Comparison="LessThan" Version="40.0.2214.115" Csidl="42"/></lar:And>
<lar:And>
<bar:FileExists Path="Google\Chrome\Application\chrome.exe" Csidl="38"/><bar:FileVersion Path="Google\Chrome\Application\chrome.exe" Comparison="LessThan" Version="40.0.2214.115" Csidl="38"/></lar:And>


Anhand der Syntax kann man dann passende Regeln manuell zusammentippen und danach wieder importieren.
Das war dann auch schon alles. Das Update wird veröffentlicht und genehmigt und Chrome wird auf den PCs zur Installation angeboten, die bereits eine ältere Chrome Version installiert haben.

Das ganze Verfahren kann natürlich auch für andere Software adaptiert werden.

Noch ein Nachtrag: Falls sich jetzt jemand fragt, warum man das unbedingt mit „Datei existiert“ und „Dateiversion kleiner als…“ löst, anstatt einfach die Installerversion aus der Registry auszulesen, sei folgender Thread ans Herz gelegt. https://code.google.com/p/chromium/issues/detail?id=67348



Norbert Fehlauer
MVP Group Policy
https://mvp.microsoft.com/de-de/mvp/Norbert%20Fehlauer-9196