Zum Inhalt springen

GeoGebra Installation und Patching im Schulnetzwerk

Liebe Leserinnen und Leser!

Der verpflichtende Technologieeinsatz im Rahmen des Mathematikunterrichts bzw. der Reifeprüfung bringt auch für die Netzwerkverwaltung neue Herausforderungen mit sich. Als Softwarelösung kommt in vielen Schulen die OpenSource-Software Geogebra zum Einsatz, die in vielen unterschiedlichen Versionen einen großen Funktionsumfang bietet und sehr gut gewartet wird. Die Entwickler*Innen stellen zum Zwecke der Softwareverteilung in Windows Netzwerken auch ein MSI-Paket zur Verfügung, das sich mit gängigen Methoden verteilen lässt. Leider erkennt es der Installer bei Updates – trotz mehrmaliger Rückmeldungen meinerseits – nicht, wenn bereits eine ältere Version installiert ist und installiert parallel dazu die neuere Version. Eine weitere Schwierigkeit in der Netzwerkverwaltung besteht darin, dass die Auto-Update Funktion der Software nicht nutzbar ist und das Programm durch andere Methoden gewartet werden muss.

Write-Host "Suche nach Geogebra 6 und installiere dieses gegebenenfalls."

if (-Not (Test-Path "$env:programfiles (x86)\Geogebra Classic")) { 

$Geogebra_MSI = (Get-ChildItem -Path "\\Pfad\zum\Installer\von\GeoGebra" -Filter *.msi -Recurse).FullName 
Start-Process -FilePath msiexec.exe -NoNewWindow -Wait -ArgumentList "/I $Geogebra_MSI ALLUSERS=2 /qn"; Write-Host "GeoGebra 6 wurde erfolgreich installiert." 
Remove-Item -Path "$env:SystemDrive\Users\Public\Desktop\Geogebra.lnk" -force}

Das PS Skript untersucht, ob im Programmverzeichnis ein Ordner für die Geogebra-Installation exisitiert und startet, sofern dies nicht der Fall ist, die Installation. Die Ausgabe der Schritte auf dem Host mithilfe des Write-Host Commandlets dient lediglich dazu, dass ich bei den Testläufen etwaige Fehler schneller finde und kann auch weggelassen bzw. auskommentiert werden. Der letzte Befehl löscht den Programmlink im Public-User Folder, der dann später neu erstellt wird. Dies ist nur nötig, falls man eine Active-Directory Umgebung mit Roaming-Profilen betreibt, weil das Programm sonst nach dem Update nicht mehr gestartet werden kann.

Um Geogebra aktuell zu halten, wird folgender PS Code ausgeführt:

# Geogebra Update 

Write-Host "Kontrolliere, ob aktuelle GeoGebra Version installiert ist und mache gegenebenfalls Update." 

If ((Get-WmiObject -Class Win32_OperatingSystem).OSArchitecture -eq '64-Bit') { 

$Geogebra_MSI = (Get-ChildItem -Path "\\Pfad\zum\Installer\von\GeoGebra" -Filter *.msi -Recurse).FullName $GeoGebraVersion_installiert = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4748282E-2448-11E8-81BC-53A8D56EE868}').DisplayVersion.Substring(0,7)
$GeoGebraVersion_aktuell_Pfad = (Get-ChildItem -Path "\\Pfad\zum\Installer\von\GeoGebra" -Filter *.msi -Recurse).Name.Substring(27,7).Replace("-",".") 

# Vergleich der Werte 

if (-not ($GeoGebraVersion_installiert -like $GeoGebraVersion_aktuell_Pfad)) { 

# Installierte GeoGebra Version deinstallieren 

$GeoGebra_Uninstall = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4748282E-2448-11E8-81BC-53A8D56EE868}' -Credential $Cred).ModifyPath.Substring(12,40).Replace("/I","/X") + " /qn" 
Start-Process -FilePath msiexec.exe -NoNewWindow -Wait -ArgumentList "$GeoGebra_Uninstall"; Write-Host GeoGebra $GeoGebraVersion_installiert wurde erfolgreich deinstalliert. 

# Aktuelle Geogebra-Version installieren

Start-Process -FilePath msiexec.exe -NoNewWindow -Wait -ArgumentList "/I $Geogebra_MSI ALLUSERS=2 /qn"; Write-Host GeoGebra $GeoGebraVersion_aktuell_Pfad wurde erfolgreich installiert. 
Remove-Item -Path "$env:SystemDrive\Users\Public\Desktop\Geogebra.lnk" -force

}} 

ELSE { 

$Geogebra_MSI = (Get-ChildItem -Path "\\Pfad\zum\Installer\von\GeoGebra" -Filter *.msi -Recurse).FullName 
$GeoGebraVersion_installiert = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{4748282E-2448-11E8-81BC-53A8D56EE868}').DisplayVersion.Substring(0,7) 
$GeoGebraVersion_aktuell_Pfad = (Get-ChildItem -Path "\\Pfad\zum\Installer\von\GeoGebra" -Filter *.msi -Recurse).Name.Substring(27,7).Replace("-",".")

# Vergleich der Werte 

if (-not ($GeoGebraVersion_installiert -like $GeoGebraVersion_aktuell_Pfad)) { 

# Installierte GeoGebra Version deinstallieren 

$GeoGebra_Uninstall = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4748282E-2448-11E8-81BC-53A8D56EE868}' -Credential $Cred).ModifyPath.Substring(12,40).Replace("/I","/X") + " /qn" 
Start-Process -FilePath msiexec.exe -NoNewWindow -Wait -ArgumentList "$GeoGebra_Uninstall"; Write-Host GeoGebra $GeoGebraVersion_installiert wurde erfolgreich deinstalliert. 

# Aktuelle Geogebra-Version installieren 

Start-Process -FilePath msiexec.exe -NoNewWindow -Wait -ArgumentList "/I $Geogebra_MSI ALLUSERS=2 /qn"; Write-Host GeoGebra $GeoGebraVersion_aktuell_Pfad wurde erfolgreich installiert. 
Remove-Item -Path "$env:SystemDrive\Users\Public\Desktop\Geogebra.lnk" -force

}}

Da ich auch Tablets im Schulnetzwerk betreibe, die nur mit der 32-bit von Windows 10 laufen, habe ich eine Versionsabfrage eingebaut, um das Skript für beide OS-Typen verwenden zu können. Der obenstehende PS-Code vergleicht mithilfe einer Registry-Abfrage die installierte Geogebra Version mit jener, die auf dem Netzwerkshare zur Verfügung steht. Ist die installierte älter, wird sie deinstalliert und Geogebra mit dem Installer auf dem Netzwerkshare neu installiert.

Falls man den Geogebra Ordner nicht im Startmenü haben möchte, reicht es, folgende Zeile in das Skript einzufügen.

if (Test-Path -Path "$env:programdata\Microsoft\Windows\Start Menu\Programs\GeoGebra Classic") {

Remove-Item -Path "$env:programdata\Microsoft\Windows\Start Menu\Programs\Geogebra Classic\" -Recurse -Force}

Um den Programmlink auch in einer AD-Umgebung mit Roaming-Profilen nutzbar zu machen, wird der folgende Code in das PS-Startskript eingefügt. Dabei wird untersucht, ob die Verweise im Programmlink richtig sind bzw. werden falsche oder fehlende Verweise korrigiert.

# Untersuche Geogebra Link im Startmenü

$GeoGebra_Link = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\GeoGebra.lnk" 
$Shell = New-Object -ComObject WScript.Shell 
$GeoGebra_Link_Target = $Shell.CreateShortcut($GeoGebra_Link).TargetPath 

if (-not ($GeoGebra_Link_Target -eq "C:\Program Files (x86)\GeoGebra Classic\GeoGebra.exe")) { 

Remove-Item -Path $GeoGebra_Link -Force 

$TargetFile = "$env:Programfiles (x86)\GeoGebra Classic\GeoGebra.exe" 
$ShortcutFile = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\GeoGebra.lnk" 
$WScriptShell = New-Object -ComObject WScript.Shell 
$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) 
$Shortcut.TargetPath = $TargetFile $Shortcut.Save()} 

# Erstelle GeoGebra Link im Public Desktop und %AllUsersProfile%

if (-Not (Test-Path -Path "$env:SystemDrive\Users\Public\Desktop\Geogebra.lnk")) { 

$TargetFile = "$env:Programfiles (x86)\GeoGebra Classic\GeoGebra.exe" 
$ShortcutFile = "$env:SystemDrive\Users\Public\Desktop\Geogebra.lnk"
$WScriptShell = New-Object -ComObject WScript.Shell 
$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) 
$Shortcut.TargetPath = $TargetFile $Shortcut.Save()} 

if (-Not (Test-Path -Path "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\GeoGebra.lnk")) { 

$TargetFile = "$env:Programfiles (x86)\GeoGebra Classic\GeoGebra.exe" 
$ShortcutFile = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\GeoGebra.lnk" 
$WScriptShell = New-Object -ComObject WScript.Shell 
$Shortcut = $WScriptShell.CreateShortcut($ShortcutFile) 
$Shortcut.TargetPath = $TargetFile $Shortcut.Save()}

Ist das Startskript angepasst, besteht die Arbeit nur mehr darin, die Geogebra Version auf dem Netzwerkshare aktuell zu halten. Dazu kann man natürlich in regelmäßigen Abständen selbst das Geogebra Downloadverzeichnis im Browser öffnen, die Versionen vergleichen und den Installer gegebenenfalls durch die neuere Version ersetzen.

Eine weitere Möglichkeit bietet eine automatische Abfrage mithilfe von Powershell: das untenstehende Skript wird bei mir von der Aufgabenplanung regelmäßig ausgeführt und führt einen Abgleich der neuesten Version im Downloadverzeichnis mit der Version auf dem Netzwerkshare durch. Ist die Version auf dem Netzwerkshare älter, wird sie durch die neuere ersetzt. Das Skript nutzt außerdem Reporting mit Telegram, das ich in einem anderen Posting kurz beschrieben habe. Wenn Sie darauf verzichten wollen, reicht es aus, die entsprechenden Zeilen auszukommentieren. Bei einer neuen Major-Version von Geogebra  müssen die Pfade natürlich entsprechend angepasst werden, aber der Wartungsaufwand ist so jedenfalls deutlich geringer. Das Skript ist noch sehr „roh“ und verfügt über keinerlei Error-Handling, so erkennt es z.B. nicht, ob das Netzlaufwerk erreichbar ist oder überhaupt ein Geogebra Installer vorhanden ist.

<# 

.SYNOPSIS 
Das Skript vergleicht die neueste Geogebra Version im offiziellen Geogebra Repository (http://download.geogebra.org/installers/6.0/) mit der neuesten offline verfügbare Version des Installers. Falls die Geogebra Version online neuer ist, als jene offline, wird die neuere heruntergeladen und die ältere gelöscht. 
.NOTES 
Author: Martin Stolzlechner
Creation Date: 11. November 2018
Purpose/Change: Geogebra Deployment
.COMPONENT Getestet auf Windows Server 2016 &amp; Windows 10 (PS 5.1, November 2018)
.LINK schulnetz.borg3.at 

#> 

## Skriptweite ErrorAction

$ErrorActionPreference = 'SilentlyContinue'

### Telegram Meldungen

$Erfolgsmeldung = "Eine neuere Geogebra-Version wurde erfolgreich heruntergeladen und in das Offline Repository kopiert."
$Misserfolgsmeldung = "Der Updateserver konnte nicht erreicht werden, die Geogebra Updateroutine wurde beendet."
$Standardmeldung = "Geogebra Online-Repository wurde untersucht, aber es ist keine neue Version verfuegbar." 

### Telegram Zugangsdaten laden 

Write-Host "Lade Zugangsdaten zu Telegram Bot für den Versand der Logfiles." -ForegroundColor Green 

$BotKey = "..."
$PS_Gruppe_ChatID = "..." 

### aktuelle Versionen im Offline-Repository mit Online-Version vergleichen 

Write-Host "Überprüfe die Erreichbarkeit des Geogebra Download Servers." -ForegroundColor Green 

$GeoGebra_Update = (Invoke-WebRequest "http://download.geogebra.org/installers/6.0/" -DisableKeepAlive -UseBasicParsing -Method head).StatusDescription 
If ($Geogebra_Update -eq 'OK') { Write-Host "Der Geogebra Download Server ist erreichbar, Skriptausführung wird fortgesetzt." -ForegroundColor Green 

# Geogebra offline 

Write-Host "Untersuche aktuelle Geogebra Version in Offline Repository." -ForegroundColor Green 

$Geogebra_Offline = Get-ChildItem -Path "\\Pfad\zum\Installer\von\GeoGebra" -Filter *.msi -Recurse
$Geogebra_Offline_Version = ($Geogebra_Offline).Name.Substring(27,7).Replace("-",".")
$Geogebra_Offline_Pfad = $Geogebra_Offline.Fullname 

# Geogebra online 

Write-Host "Untersuche aktuelle Geogebra Version auf der Geogebra Download-Seite." -ForegroundColor Green 
$Geogebra_Online = ((Invoke-WebRequest "http://download.geogebra.org/installers/6.0/").Links | where innertext -like "geogebra-windows-installer-6*.msi" | select innerText | Select-Object -Last 1).innertext.Substring(27,7).Replace("-",".") 

Write-Host "Vergleiche GeoGebra Versionen." -ForegroundColor Green 

if ($GeoGebra_Online -gt $Geogebra_Offline_Version) { 

# Geogebra Download 

Write-Host "Lade aktuellen Geogebra Installer herunter." -ForegroundColor Green 

$Geogebra_Dateiname = ((Invoke-WebRequest "http://download.geogebra.org/installers/6.0/").Links | where innertext -like "geogebra-windows-installer-6*.msi" | select innerText | Select-Object -Last 1).innertext 
$DownloadURL = "http://download.geogebra.org/installers/6.0/" + ((Invoke-WebRequest "http://download.geogebra.org/installers/6.0/").Links | where innerHTML -like "geogebra-windows-installer-6*.msi" | select href | Select-Object -Last 1).href 
Invoke-WebRequest $DownloadURL -OutFile ("\\Pfad\zum\Installer\von\GeoGebra\" + "$Geogebra_Dateiname") 

# ältere Version löschen 

Write-Host "Entferne alte Geogebra-Version aus Offline Repository." -ForegroundColor Green Remove-Item 

$Geogebra_Offline_Pfad -Force Invoke-RestMethod -Uri "https://api.telegram.org/bot$BotKey/sendMessage?chat_id=$PS_Gruppe_ChatID&amp;text=$Erfolgsmeldung" } 

Else { 

Write-Host "Es ist keine neue Geogebra-Version verfügbar, die Skriptausführung wird beendet." -ForegroundColor Red 

Invoke-RestMethod -Uri "https://api.telegram.org/bot$BotKey/sendMessage?chat_id=$PS_Gruppe_ChatID&amp;text=$Standardmeldung" }} 

Else {

Write-Host "Der Geogebra Download Server ist nicht erreichbar, Skriptausführung wird beendet." -ForegroundColor Red 

Invoke-RestMethod -Uri "https://api.telegram.org/bot$BotKey/sendMessage?chat_id=$PS_Gruppe_ChatID&amp;text=$Misserfolgsmeldung" 
Exit } 

### Skriptausführung beenden

Exit

Wie immer gilt, der Code darf gerne verwendet, kopiert und nach Belieben verändert werden, aber alles auf eigene Gefahr!

Liebe Grüße,
Martin Stolzlechner

2 Kommentare

  1. Hallo Martin,

    ein cooles Script. Ich habe es auch so ähnlich gelöst. Die eingebaute Möglichkeit mit dem Download finde ich super. Kannst du mir sagen, was in deinem Script die Variable $Cred bewirken sollen.
    Diese Zeile: $Shortcut.TargetPath = $TargetFile $Shortcut.Save() habe ich auch nicht ganz nachvollziehen können.

    LG

    Bernhard

    • Martin.Stolzlechner Martin.Stolzlechner

      Hallo Bernhard,

      Danke, freut mich, dass es dir geholfen hat! $Cred brauchst du beim Startskript eigentlich nicht, weil es mit Systemrechten läuft, bei anderen Benutzern kann es sein, dass die UAC nach Admin-Rechten fragt, daher das $Cred.

      Zum Erzeugen gehst du wie folgt vor:

      # Passwort verschüsselt abspeichern: dieser Schritt ist nur einmal bzw. wenn sich das PW ändert notwendig und kann dann auskommentiert werden.

      Read-Host -Prompt „Admin Passwort eingeben“ -AsSecureString | ConvertFrom-SecureString | Out-File „P:\fad\zum\PW.txt“

      # Credentials erzeugen

      $AdminName = „administrator@domain.at“
      $Pass = Get-Content „P:\fad\zum\PW.txt“ | ConvertTo-SecureString
      $Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $AdminName, $Pass

      Die Funktion $Shortcut.Save() schließt das Erstellen des Programmlinks ab. Das muss ich leider wegen der Roaming Profile bei jedem Update erneuern, lässt sich aber gut automatisieren.

      Liebe Grüße,
      Martin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

fünfzehn − 4 =