vor 2 Wochen
Hallo zusammen,
hat jemand von Euch schon erfolgreich die automatisierte Verteilung von ArchiCad-Updates per Script umgesetzt?
Für die Updates brauchen ja die User immer Admin-Rechte oder Admin-Zeit, besser wäre sie automatisch zu verteilen.
Umfeld ist eine Windows-Domain mit Windows11 Rechnern. Was ich mir vorstellen würde wäre folgender Ablauf:
- Script prüft die vorhandene ArchiCad-Version, und ob ein Update erforderlich ist, wenn nicht > exit
- Script kopiert den Installer auf ein temporäres, lokales Verzeichnis
- Script startet den Installer silent
- Script entfernt im Erfolgsfall die lokale Kopie
Am besten würde das Script beim Herunterfahren des Rechners starten, dann hält es niemand von der Arbeit ab 😉
Ich freue mich über alle Hinweise, Anregungen und Ratschläge.
Ein Software-Deployment-Tool oder so etwas haben wir nicht, wir suchen eine Lösung mit Windows Bordmitteln.
Viele Grüße,
Michael
vor 2 Wochen
Schau dir vielleicht mal "FreeFileSynch" an. Das könnte eventuell genau das sein, was du suchst
vor 2 Wochen
Das kann man ganz "traditionell" über Gruppenrichtlinien erreichen. Da ihr eine Domäne habt, habt ihr auch einen Domänen-Controller. Darüber lassen sich Gruppenrichtlinien festlegen. Gruppenrichtlinien laufen mit Systemrechten, womit sich das Update durchführen lassen kann. Du kannst z.B. eine Batch oder ein Powershell-Skript bei jeder Anmeldung/Abmeldung ausführen lassen, das eben das Update im Hintergrund ausführt. Noch cleverer: du startest per wake on lan den Rechner irgendwann nachts und lässt das Update durchführen.
vor 2 Wochen
Hallo Torben,
ja, das ist tatsächlich wo ich hin möchte, am besten als Powershell-Script, das beim Herunterfahren durchläuft.
Jetzt hab' ich noch ein paar Probleme, weil z.B. der Installer schon nach dem Entpacken "fertig" meldet und das Script dann weiterläuft, während aber die eigentliche Installation noch nicht fertig ist, und noch so ein paar Besonderheiten. Drum suche ich jemand, der das schon mal so umgesetzt hat...
VG,
Michael
vor 2 Wochen
Ich gehe mal davon aus, dass Dir diese Seite bekannt ist(?)
Schreib Dein Skript doch mal hier rein, sonst ist das nur Stochern im Nebel
vor 2 Wochen
Hallo Torben,
ich habe versucht, das Script direkt in einer Antwort zu posten - die taucht nicht auf.
Gibt es da einen Trick?
VG,
Michael
vor 2 Wochen
vor einer Woche
Ja, da gibt es einen Trick: Du mußt es als Code einbetten. Ich habe das für Dich mal gemacht. Ich denke, Du hast nix dagegen - sonst nehm ich das wieder raus.
$ErrorActionPreference = 'Stop'
[version]$TargetVersion = '29.2'
# Servername und Freigabepfad wurden anonymisiert
$InstallerSource = '\\YOUR-SERVERNAME\your-deployment-share\software\Archicad 29 Update\Archicad-29.2.0-Update-GER-5003.exe'
$LocalDir = 'C:\AC29Upd'
$LocalInstaller = Join-Path $LocalDir 'Archicad-29.2.0-Update-GER-5003.exe'
# Firmenname im Log-Pfad wurde verallgemeinert
$LogDir = 'C:\ProgramData\CompanyDeployment\ArchicadUpdate\Logs'
$LogFile = Join-Path $LogDir ("Archicad29_2_Update_{0}.log" -f (Get-Date -Format 'yyyyMMdd_HHmmss'))
New-Item -Path $LogDir -ItemType Directory -Force | Out-Null
function Write-Log {
param(
[Parameter(Mandatory)] [string] $Message,
[ValidateSet('INFO','WARN','ERROR')] [string] $Level = 'INFO'
)
$ts = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
Add-Content -Path $LogFile -Value "[$ts] [$Level] $Message"
}
function Get-ArchicadVersion {
$apps = Get-ItemProperty `
-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' `
-ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -like 'Archicad 29*' -and $_.DisplayVersion }
if (-not $apps) { return $null }
$versions = foreach ($app in $apps) {
if ($app.DisplayVersion -match '(\d+(\.\d+){1,3})') {
try { [version]$Matches[1] } catch { $null }
}
}
$versions | Where-Object { $_ } | Sort-Object -Descending | Select-Object -First 1
}
try {
Write-Log "Starte Archicad-Update."
$currentVersion = Get-ArchicadVersion
if (-not $currentVersion) {
Write-Log "Archicad 29 wurde nicht gefunden. Vorgang wird beendet." 'WARN'
exit 0
}
Write-Log "Erkannte Archicad-Version: $currentVersion"
if ($currentVersion -ge $TargetVersion) {
Write-Log "Archicad ist bereits auf Zielstand oder neuer ($TargetVersion). Kein Update nötig."
exit 0
}
if (-not (Test-Path $InstallerSource)) {
throw "Installerquelle nicht gefunden: $InstallerSource"
}
New-Item -Path $LocalDir -ItemType Directory -Force | Out-Null
Write-Log "Kopiere Installer nach $LocalInstaller"
Copy-Item -Path $InstallerSource -Destination $LocalInstaller -Force
if (-not (Test-Path $LocalInstaller)) {
throw "Lokale Installationsdatei fehlt nach dem Kopieren: $LocalInstaller"
}
# Laufende CAD-Prozesse vor dem Update beenden
Get-Process -ErrorAction SilentlyContinue |
Where-Object { $_.ProcessName -in @('Archicad','ARCHICAD','ArchicadStarter','BIMcloud','BIMx') } |
ForEach-Object {
Write-Log "Beende Prozess: $($_.ProcessName) (PID $($_.Id))" 'WARN'
Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 5
$InstallerArgs = @('--mode', 'unattended')
Write-Log "Starte lokalen Installer: $LocalInstaller"
Write-Log "Parameter: $($InstallerArgs -join ' ')"
$proc = Start-Process -FilePath $LocalInstaller -ArgumentList $InstallerArgs -Wait -PassThru -WindowStyle Hidden
Write-Log "Installer beendet mit ExitCode $($proc.ExitCode)"
if ($proc.ExitCode -ne 0 -and $proc.ExitCode -ne 3010) {
throw "Installation fehlgeschlagen. ExitCode: $($proc.ExitCode)"
}
elseif ($proc.ExitCode -eq 3010) {
Write-Log "Archicad-Update erfolgreich, erfordert jedoch einen Systemneustart." 'WARN'
}
else {
Write-Log "Archicad-Update erfolgreich abgeschlossen."
}
if (Test-Path $LocalDir) {
Write-Log "Entferne temporäres Installationsverzeichnis: $LocalDir"
Remove-Item -Path $LocalDir -Recurse -Force -ErrorAction SilentlyContinue
}
exit 0
}
catch {
Write-Log $_.Exception.Message 'ERROR'
Write-Log $_.ScriptStackTrace 'ERROR'
exit 1
}
vor einer Woche - zuletzt bearbeitet vor einer Woche
Das muss ich in Ruhe durchlesen ...
Funktioniert das Skript grundsätzlich, also mit Admin-Rechten, oder müssen wir noch Bug-fixing betreiben?
vor einer Woche - zuletzt bearbeitet am vor einer Woche von runxel
Hallo,
danke für's Einbetten.
Auf einem ersten Testrechner hat es getan, was es soll. Auf der ToDo-Liste habe ich noch ein Flag am Anfang, das den wiederholten Ablauf verhindert und eine Form von gesammeltem Log auf einem Netzwerk-Share. Das Prinzip immerhin scheint zu funktionieren. Wäre ja vielleicht für viele Andere auch interessant.
VG,
M.