Jump to content
Julez

Programmversion in Registry mit Skript prüfen

Recommended Posts

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.

Share this post


Link to post
vor 15 Minuten schrieb Julez:

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

Cmd.exe aufrufen > reg query /? eingeben und ENTER drücken.

  • Haha 1

Share this post


Link to post
vor 20 Minuten schrieb Julez:
 

....  Hierfür haben wir ein Skript geschrieben ....

<SCNR>

<OT>

        Wow .... warum man sich im Jahre 2021 noch sowas selbst antut, werde ich wohl nie verstehen.  :hmmm:

</OT>

</SCNR>

Share this post


Link to post
vor 11 Minuten schrieb Sunny61:

Cmd.exe aufrufen > reg query /? eingeben und ENTER drücken.

Danke, und wieder was dazu gelernt

vor 3 Minuten schrieb BOfH_666:

<SCNR>

<OT>

        Wow .... warum man sich im Jahre 2021 noch sowas selbst antut, werde ich wohl nie verstehen.  :hmmm:

</OT>

</SCNR>

Ich bin offen für bessere Vorschläge Deinerseits

Share this post


Link to post
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

Share this post


Link to post
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. ;-) 

Share this post


Link to post

Ach, Batch ist nicht schlecht - nur macht man halt manchmal ganz komische Konstrukte (=Verrenkungen), die in Powershell total trivial wären :-) Und für unattended Installationen - msfn.org kennst Du? Ansonsten gilt das vorgesagte - WSUS/WPP oder SCCM helfen da echt viel.

Share this post


Link to post

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.

Share this post


Link to post
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?

Share this post


Link to post

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

  • Like 1

Share this post


Link to post
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

  • Haha 1

Share this post


Link to post
vor 5 Minuten schrieb Julez:

Unser Systemhaus rollt Updates über WSUS aus.

OK, jetzt bin ich komplett verwirrt.  :hmmm:   ... ihr habt ein Systemhaus, was sich um eure Server und Clients kümmert, ihr installiert aber Software trotzdem allein?

Share this post


Link to post

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

 

Share this post


Link to post
vor 15 Minuten schrieb Dukel:

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

Wie kommst Du auf Powershell?  ... ich glaub mit Powershell hätten wir das Thema schon lange erfolgreich abgeschlossen.  ;-) :D 

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...