abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
DE
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
michael_ml
Participant

update verteilung per script

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

9 ANTWORTEN 9
Frank Schlenke
Advocate

Schau dir vielleicht mal "FreeFileSynch" an. Das könnte eventuell genau das sein, was du suchst

WIN11; i9-13900KF; 32GB DDR5-6000; 2TB SSD; RTX 4070ti
torben_wadlinger
Rockstar

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.

Archicad seit v5.0 bis v29 | macOS und Windows | BIMCloud selbst gehostet | BIM-zertifiziert gemäß BAK und BIngK | BIM-Referent AK RLP
michael1701
Contributor

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

torben_wadlinger
Rockstar

Ich gehe mal davon aus, dass Dir diese Seite bekannt ist(?)

https://help.graphisoft.com/AC/27/INT/index.htm?rhcsh=1&rhnewwnd=0&rhmapid=#t=_AC27_Help%2F004_BIMMa...

 

Schreib Dein Skript doch mal hier rein, sonst ist das nur Stochern im Nebel

 

 

Archicad seit v5.0 bis v29 | macOS und Windows | BIMCloud selbst gehostet | BIM-zertifiziert gemäß BAK und BIngK | BIM-Referent AK RLP
michael_ml
Participant

Hallo Torben,

ich habe versucht, das Script direkt in einer Antwort zu posten - die taucht nicht auf.

Gibt es da einen Trick? 

VG,

Michael

michael_ml
Participant

...noch ein Versuch, gezippt, weil .txt mag das Forum scheinbar nicht.

VG,

M.

torben_wadlinger
Rockstar

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
}



Archicad seit v5.0 bis v29 | macOS und Windows | BIMCloud selbst gehostet | BIM-zertifiziert gemäß BAK und BIngK | BIM-Referent AK RLP
torben_wadlinger
Rockstar

Das muss ich in Ruhe durchlesen ...

 

Funktioniert das Skript grundsätzlich, also mit Admin-Rechten, oder müssen wir noch Bug-fixing betreiben?

Archicad seit v5.0 bis v29 | macOS und Windows | BIMCloud selbst gehostet | BIM-zertifiziert gemäß BAK und BIngK | BIM-Referent AK RLP
michael_ml
Participant

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.

Keine Antwort gefunden?

Andere Beiträge
im Board ansehen

Zurück zum Board

Neueste Lösungen durchsuchen

Akzeptierte Lösungen zeigen

Eine neue Diskussion starten!

Neues Thema erstellen