Jump to content

Programmversion in Registry mit Skript prüfen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich habe nun schon des Öfteren bei euch im Forum zu einigen Themen erfolgreich Hilfe gefunden - Danke dafür an die fleißigen Antworter. Nun habe ich eine Frage, die leider (nicht ganz) im Forum zu finden ist - verbessert mich gerne, falls ein Artikel hierfür schon existiert.

Leider bin ich in Anwendungsentwicklung nie so richtig gut gewesen und krampfe mich immer durch dieses Thema =)

 

Zur Aufgabenstellung:

- Wir rollen derzeit auf allen Clients verschiedene Instanzen (Host/Full) des neuen TeamViewer Clients per GPO aus.

- Hierfür haben wir ein Skript geschrieben welches die aktuell installierte Version finden, löschen und mithilfe der .msi vom Fileserver neu installieren soll. --> Das klappt auch schon super!

- Grund hierfür ist die Bereitstellung des APITokens bei erneuter Installation, welchen wir auch zukünftig jedem neuen Client automatisch mitgeben möchten.

- Wir benötigen noch eine Abfrage im Skript, die vorab prüft ob schon die aktuelle Version installiert ist, da er sonst diesen Vorgang mit jedem Reboot erneut ausführt.

 

Unser aktueller Code:

@echo off
REM UNINSTALL CURRENT TEAMVIEWER INSTALLATION
tasklist /FI "IMAGENAME eq TeamViewer.exe" 2>NUL | find /I /N "TeamViewer.exe">NUL
if "%ERRORLEVEL%"=="0" (GOTO :KILL) ELSE (GOTO :REMOVEMSI)
:KILL
taskkill /f /im TeamViewer.exe
TIMEOUT 2
GOTO :REMOVEMSI
:REMOVEMSI
wmic product where vendor="TeamViewer"
if not "%errorlevel%"=="0" GOTO :CHECKOS
for /f "tokens=2 delims==" %%f in ('wmic product Where "vendor like 'TeamViewer'" get IdentifyingNumber /value ^| find "="') do set "id=%%f"
msiexec.exe /x "%id%" /qn
GOTO :CHECKOS
:CHECKOS
cd\
Set "OS64=C:\Program Files (x86)"
IF EXIST "%OS64%" (GOTO :UNINSTALL64) ELSE (GOTO :UNINSTALL32)
:UNINSTALL64
cd\
Set "OLD64=C:\Program Files (x86)\TeamViewer\Version*"
IF EXIST "%OLD64%" (GOTO :PREVIOUS64) ELSE (GOTO :REMOVE64)
:UNINSTALL32
cd\
Set "OLD32=C:\Program Files\TeamViewer\Version*"
IF EXIST "%OLD32%" (GOTO :PREVIOUS32) ELSE (GOTO :REMOVE32)
:PREVIOUS32
cd\
cd %ProgramFiles%\TeamViewer\Version*
IF NOT EXIST "*uninstall*" GOTO :REMOVE32
start uninstall.exe /S 
GOTO :REMOVE32
:REMOVE32
cd\
cd %ProgramFiles%\TeamViewer
IF NOT EXIST "*uninstall*" GOTO :REMOVEFILES32
start uninstall.exe /S
GOTO :REMOVEFILES32
:REMOVEFILES32
reg delete "HKLM\Software\TeamViewer" /f
cd %temp%
rd TeamViewer /s /Q
GOTO :INSTALL
:PREVIOUS64
cd\
cd %ProgramFiles(x86)%\TeamViewer\Version*
IF NOT EXIST "*uninstall*" GOTO :REMOVE64
start uninstall.exe /S
GOTO :REMOVE64
:REMOVE64
cd\
cd %ProgramFiles(x86)%\TeamViewer
IF NOT EXIST "*uninstall*" GOTO :REMOVEFILES64
start uninstall.exe /S
GOTO :REMOVEFILES64
:REMOVEFILES64
reg delete "HKLM\Software\Wow6432Node\TeamViewer" /f
cd %temp%
rd TeamViewer /s /Q
GOTO :INSTALL
:INSTALL
start /wait msiexec.exe /i "\\Fileserver\file\Software\Verteilung\Teamviewer\Teamviewer 15\TeamViewerMSI\Host\TeamViewer_Host.msi" /qn CUSTOMCONFIGID="" APITOKEN=""-"" ASSIGNMENTOPTIONS="--reassign --alias %ComputerName% --grant-easy-access --group-id "" --proxy xxx.xxx.xxx.xxx:xxxx
exit

Nach etlichem Forengewälze erschien mir die Abfrage des Registry Keys als sinnvollere Alternative zu UNC-Pfad und .exe Suche

 

Nun zu dem was ich in eurem Forum gefunden habe:

Link: Forenbeitrag von MC Bain - Regkey per Batch abfragen

reg query "\\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\TeamViewer\Version" /v "15.14.5 HC"
if %errorlevel%==0 GOTO exit
if %errorlevel%==1 GOTO :TASKCHECK
:TASKCHECK

- Der Registry Pfad entspricht dem auf unseren Clients.

- Kann ich diesen Code einfach nach dem Echo einfügen um eine erneute Installation bei aktueller Programmversion zu verhindern?

- Bonusfrage: Gibt es die Möglichkeit, den Erfolg der Datei zu "messen"?

-- Hierbei dachte ich daran, bei übersprungener Installation eine Datei auszugeben die  "Keine_erneute_Installation.txt" bzw. bei erfolgreicher Aktualisierung "Programmaktualisierung_durchgeführt.txt" heißt.

-- Diese Ergebnisdateien werde ich nach meinen Tests aus dem Skript wieder entfernen

- Interessehalber: Was bedeutet in diesem Fall "/v" ?

 

Ich hoffe, ich konnte alles verständlich wiedergeben. Falls ihr noch weitere Informationen benötigt, gebe ich sie gerne weiter. Ich danke vielmals für eure Hilfe.

Beste Grüße.

Link zu diesem Kommentar
vor 3 Stunden schrieb Julez:

Wir rollen derzeit auf allen Clients verschiedene Instanzen (Host/Full) des neuen TeamViewer Clients per GPO aus.

Igitt, da gibt es im Jahr 2021 weitaus bessere und zuverlässigere Methoden. Eine, die ist auch kostenlos, ist die Verwendung vom WSUS und WSUS Package Publisber in Kombination. Das erfordert allerdings 1-2 Stunden Einarbeitung, und das Lesen der HowTos, anschließend kann man deine Anforderung damit sicher recht einfach umsetzen.

WSUS.de > WSUS Package Publisher und Local Update Publisher. Einfach mal alle HowTos lesen und dann langsam anfangen damit. Das aktuelle Release gibt es auf Github: https://github.com/DCourtel/Wsus_Package_Publisher/releases

Link zu diesem Kommentar
vor 3 Stunden schrieb Julez:

Ich bin offen für bessere Vorschläge Deinerseits

Mir ging es um die gewählte Script-Technologie - Batch. Hier werden bestimmt wieder ein paar Kollegen anderer Meinung sein, ich denke aber, dass man für Aufgaben, die deutlich mehr als nur ein oder zwei Befehlszeilen enthalten und eine gewisse Komplexität aufweisen, stattdessen auf Powershell setzen sollte. Da es die deutlich mächtigere und dabei aber auch die besser lesbare und robustere Script-Technologie darstellt.

Bei der "Verteilung" wäre ich dann wieder bei @Sunny61 ... oder, falls verfügbar, eine vernünftige Software-Verteilung wie SCCM oder so. ;-) 

Link zu diesem Kommentar

Hmm.. allen Anschein nach hänge ich da wirklich wohl in einer Zeitkapsel fest. Ich werde mir WSUS mal ansehen. SCCM wurde mir auch schon einmal empfohlen. Nur macht das glaube ich in unserem Fall nicht enorm viel Sinn: Wir haben zwar viele Clients und genau so viele Server Deutschlandweit, die Software ändert sich jedoch ausserhalb des Lebenszyklus nur geringfügig.

Ich werde mich mal reinlesen, schaden kann es ja nicht - Danke für die Tipps.

 

Hätte jedoch auch noch jemand eine Antwort auf meine doch so "triviale" Frage, wie ich diese Registrykey-Abfrage in meinen Code rein bekomme?

 

Beste Grüße und vielen Dank.

Link zu diesem Kommentar
vor 5 Minuten schrieb Julez:

.....  Nur macht das glaube ich in unserem Fall nicht enorm viel Sinn: Wir haben zwar viele Clients und genau so viele Server Deutschlandweit, die Software ändert sich jedoch ausserhalb des Lebenszyklus nur geringfügig.

Sind das Windows-Server und Windows-Clients?  Und installiert ihr keine Updates für diese Clients und Server?

Link zu diesem Kommentar

Moin,

 

vor 4 Minuten schrieb Julez:

Hätte jedoch auch noch jemand eine Antwort auf meine doch so "triviale" Frage, wie ich diese Registrykey-Abfrage in meinen Code rein bekomme?

du hast doch den fertigen Code schon. Warum probierst du das nicht einfach aus?

 

Du solltest ein Batch übrigens nicht mit "exit" beenden, weil das den ganzen CMD-Prozess beendet. Das kann zu schwer auffindbaren Fehlern führen. Besser:

GOTO :eof

 

[Goto - Jump to label - Windows CMD - SS64.com]
https://ss64.com/nt/goto.html

 

Gruß, Nils

Link zu diesem Kommentar
vor 1 Stunde schrieb BOfH_666:

Sind das Windows-Server und Windows-Clients?  Und installiert ihr keine Updates für diese Clients und Server?

Unser Systemhaus rollt Updates über WSUS aus.

 

vor 1 Stunde schrieb NilsK:

Moin,

 

du hast doch den fertigen Code schon. Warum probierst du das nicht einfach aus?

 

Du solltest ein Batch übrigens nicht mit "exit" beenden, weil das den ganzen CMD-Prozess beendet. Das kann zu schwer auffindbaren Fehlern führen. Besser:


GOTO :eof

 

[Goto - Jump to label - Windows CMD - SS64.com]
https://ss64.com/nt/goto.html

 

Gruß, Nils

Hi Nils, hat leider nicht geklappt aber ich werde deinen :eof-Rat befolgen und mit einbauen.

Mein abgeänderter Code hat zumindest mal zu einem messbaren Erfolg geführt:

$Version = reg query HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\TeamViewer /f Version /t REG_SZ /c /e
if ($Version -eq "    Version    REG_SZ    15.14.5 HC") 
{echo "ok"} 
else {echo "falsch"}

Danke für eure Hilfe. Ich hab wohl noch einiges an Nachholbedarf, deshalb wird dieses Forum jetzt erstmal zum stöbern in die Favicons gepinnt =)

Bis bald

Link zu diesem Kommentar

Wenn du schon Powershell nutzt musst du kein Reg Query machen.

 

PS> Get-ItemProperty "HKLM:\SOFTWARE\Mozilla\Mozilla Firefox 78.7.1 ESR"

GeckoVer     : 78.7.1
ESR          : 1
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 78.7.1 ESR
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla
PSChildName  : Mozilla Firefox 78.7.1 ESR
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry


PS> if((Get-ItemProperty "HKLM:\SOFTWARE\Mozilla\Mozilla Firefox 78.7.1 ESR").GeckoVer -eq '78.7.1'){"found"}else{"not found"}
found

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...