# GLPI-Agent-Installer — Test

Marker **GLPIINST-V1** (23.08.2026)

## Dateien

| Datei | Zweck |
|---|---|
| `GLPI-Agent-Installer.ps1` | das Werkzeug, Fassung **1.2** (UTF-8 **mit BOM**) |
| `GLPI-Agent-Installer.cmd` | Starter: Verwalter-Nachfrage, Bypass, Fenster bleibt offen |
| `glpi_installer_config.json` | Vorgaben, liegt neben dem Skript |
| `Stream-Tools-Updater.ps1` | Button **WSUS Generator** → **🛰 GLPI-Agent**, Fassung **17.7** |
| `Update-Worker.ps1` | Fassung **17.7** — gleichgezogen, sonst nichts geändert |

Backups: `Stream-Tools-Updater.ps1.bak_glpiinst_20260823_181134`,
`Update-Worker.ps1.bak_glpiinst_20260823_181550`

**Fassung 17.7** steht jetzt im Fenstertitel, in der Fußzeile, im Bericht und
in der GLPI-Rückmeldung (`updater_ver`). Selbst-Update ist in `setup.json`
nicht eingerichtet (alle drei Quellen leer), es gibt also keine `version.txt`
zum Nachziehen.

## Vorgaben, die drinstehen

| Feld | Wert |
|---|---|
| Inventar-Server | **zwei Ziele**, eines je Zeile:<br>`https://mt-terminal.ddns.net/marketplace/glpiinventory/front/communication.php`<br>`https://mt-terminal.ddns.net/front/inventory.php` |
| TAG | leer |
| Vorrat-Ordner | `D:\Stream-Tools-Updater\GPU` |
| P2P-Port | 62354 |
| Dienst / Sofort-Inventar / alle Benutzer / Firewall / P2P / kein Neustart | alle an |

Alles im Fenster änderbar. **Einstellungen sichern** schreibt sie in die JSON —
danach hat der nächste Rechner sie sofort, wenn der Ordner mitkopiert wird.

## Test

1. **`GLPI-Agent-Installer.cmd`** doppelklicken (nicht die `.ps1`).
   Erwartung: UAC-Nachfrage, dann das dunkle Fenster mit goldenen Überschriften.
   Unten im Protokoll steht schon, ob ein Agent gefunden wurde.

2. **Fassung prüfen** → holt von GitHub die letzte Freigabe des
   `glpi-project/glpi-agent` und sucht das MSI für die Bitbreite dieses Rechners.
   Erwartung: drei Zeilen gefüllt — Installiert / Neueste auf GitHub / Im Vorrat.
   *Im Vorrat* ist rot, solange die Datei fehlt.

3. **In Vorrat holen** → lädt die MSI nach `D:\Stream-Tools-Updater\GPU`.
   Liegt sie schon da, wird nichts geladen („nichts zu tun").
   Lädt erst nach `.teil` und benennt danach um — ein Abbruch hinterlässt
   keine halbe MSI, die später als vorhanden gilt.

4. **Feld *Das laeuft gleich*** ansehen. Dort steht die komplette
   `msiexec`-Zeile, bevor irgendetwas passiert. Mit **Kopieren** in die
   Zwischenablage, falls sie von Hand laufen soll.

5. **Agent installieren** → Rückfrage mit Server und TAG, dann still.
   Danach: Firewall-Regel wird zusätzlich per `netsh` gesetzt, der Dienst
   `glpi-agent` wird gestartet, und die installierte Fassung oben aktualisiert
   sich auf den neuen Wert (grün).

6. **Inventar jetzt senden** → ruft `glpi-agent.exe --force`.

7. **Im Stream-Tools-Updater**: der linke Button unten heißt jetzt
   **🛰 GLPI-Agent** und öffnet dieses Werkzeug.

## Was bewusst so ist

- **Der Befehl wird angezeigt, nicht versteckt.** Auf einem fremden Rechner in
  der Halle will man vorher sehen, was läuft.
- **Firewall doppelt** — `ADD_FIREWALL_EXCEPTION=1` gibt es nicht in jeder
  Fassung des MSI. Die `netsh`-Regel läuft zusätzlich.
- **`EXECMODE=2`** = Windows-Dienst, `EXECMODE=1` = Aufgabenplanung.
- **Die WSUS-Einstellung im Setup bleibt.** Sie steuert die Update-Quelle,
  nicht diesen Button. Nur der Button wurde umgehängt.
- **1024×768:** `Set-FensterPassend` aus `Set-GlpiAgentServer.ps1` übernommen —
  Fenster wird ziehbar, bekommt Rollbalken, Mausrad rollt überall.

## Offene Punkte

- **Vorrat-Ordner**: liegt auf `…\GPU`, weil dieser Ordner vorhanden ist. Soll
  der GLPI-Vorrat getrennt liegen (`…\GLPI`), im Fenster ändern und sichern.
- **TAG** ist leer. Wenn die Rechner in GLPI nach Gruppe getrennt werden sollen
  (Stream / Shiai / CAPT / RTMP), TAG je Gruppe setzen, bevor ausgerollt wird.
- **Vertrauens-Adresse** (`HTTPD_TRUST`) ist leer. Nötig, wenn der Server
  Läufe anstoßen soll und der Agent den Aufrufer prüft.
- **Nicht auf Windows getestet** — hier läuft nur der Syntax-Prüfer. Die
  MSI-Eigenschaften stammen aus der Paketdokumentation, die tatsächliche
  Wirkung zeigt erst der erste Lauf. Deshalb steht die Befehlszeile im Fenster.

## Fassung 1.1 (24.08.2026, VARKOLL-V1)

Die Bauhelfer `mk-btn` und `mk-txt` hatten Variablen, die sich nur in der
Groß-/Kleinschreibung unterschieden — und PowerShell unterscheidet die
**nicht**: der Button lag in `$b`, der Breiten-Parameter hieß `[int]$B`; die
TextBox lag in `$t` und verdeckte damit die Theme-Tabelle `$T`. Ergebnis waren
hunderte Folgefehler („kann nicht in System.Int32 konvertiert werden“,
„Eigenschaft Text wurde nicht gefunden“, „NULL kann nicht in Color konvertiert
werden“). Alle Bauhelfer heißen jetzt eindeutig (`$btn`, `$box`, `$lab`,
`$chk`, `$grp`) und die Parameter `$Breite`/`$Hoehe`.

Prüfbar mit `pruefe_variablen.ps1 -Datei <skript>` — der Parser findet diese
Fehlerklasse nie.

## Fassung 1.2 (24.08.2026, ZUSTAND-V1 + ALLERUSER-V1)

Drei Mängel, die Gernot gemeldet hat — alle drei kamen daher, dass ich
**geraten statt ermittelt** habe.

### 1. Es prüfte nicht, ob der Agent überhaupt installiert ist

Statt einer Zahl aus einem Registry-Zweig gibt es jetzt eine echte
Zustandserhebung (`Hole-AgentZustand`), die **jede** Quelle abfragt und
anzeigt, was sie wirklich gefunden hat. Fünf Zeilen im Fenster:

| Zeile | Quellen |
|---|---|
| Installiert | Uninstall-Zweig HKLM 64/32 **und HKCU**, `HKLM\SOFTWARE\GLPI-Agent` |
| Programm | InstallLocation, InstallPath, **ImagePath des Dienstes**, Program Files — gegen `glpi-agent.exe`, `glpi-agent.bat`, auch in `perl\bin` |
| Dienst | Suche nach Name **und Anzeigename** (`*glpi*`), Status, Startart |
| Server-Ziel | `HKLM\SOFTWARE\GLPI-Agent`, auch rekursiv in Unterschlüsseln |
| Neueste auf GitHub | wie bisher |

Was nicht gefunden wird, steht **rot** da — nicht leer und nicht geraten.
Button **Zustand prüfen** jederzeit, und automatisch beim Start.

**Nach der Installation wird nachgesehen**, nicht angenommen: fehlt Fassung,
Programmdatei, Dienst, laufender Dienst oder Server-Ziel, steht das als
„Nachpruefung ergab Luecken: …" im Protokoll, mit Verweis auf das
MSI-Protokoll. Das liegt jetzt in `%ProgramData%\JudoFanpage\glpi-agent-install.log`
statt im TEMP.

### 2. „Inventar jetzt senden" fand die Programmdatei nicht

Der Pfad war fest auf `%ProgramFiles%\GLPI-Agent\glpi-agent.exe` geraten.
Jetzt kommt er aus der Zustandserhebung. Findet sie nichts, sagt die Meldung
**wo** gesucht wurde, statt nur „nicht gefunden".

### 3. Der Dienst wurde nicht überwacht

Neu `Sichere-Dienst` und der Button **Dienst starten** (heißt *Dienst neu
starten*, wenn er läuft). Der Dienstname wird **ermittelt** — er muss nicht
`glpi-agent` heißen. Die Routine setzt die Startart auf Automatisch (sonst ist
er nach dem nächsten Neustart weg), startet bzw. startet neu, und **sieht 1,2
Sekunden später nach, ob er auch drauf geblieben ist** — manche Dienste fallen
sofort wieder um, und dann steht sonst trotzdem „gestartet" da.

### 4. Nicht für alle Benutzer installiert

`ALLUSERS=1` allein reicht nicht: ein Paket, das auch je Benutzer installierbar
ist, landet trotzdem unter HKCU, solange `MSIINSTALLPERUSER` gesetzt bleibt.
Jetzt werden **beide** gesetzt (`ALLUSERS=1 MSIINSTALLPERUSER=0`).

Und die Zustandsanzeige sagt es ausdrücklich: findet sie einen Eintrag unter
HKCU, steht dort **„NUR FUER DIESEN BENUTZER"** in Rot, plus ein Hinweis im
Protokoll. Damit ist der Fall sichtbar, statt still zu passieren.

**Ungeprüft:** ob `MSIINSTALLPERUSER=0` bei diesem Paket den Ausschlag gibt,
kann ich hier nicht feststellen. Die Anzeige zeigt es dir nach dem nächsten
Lauf — wenn dort weiter „NUR FUER DIESEN BENUTZER" steht, liegt es am Paket
und wir gehen den Weg über `msiexec /a` oder eine Vorab-Deinstallation.

## Zwei Empfangspunkte (ZWEIZIEL-V1)

Der Agent kann **mehrere Server** bedienen — intern werden daraus `server0`,
`server1`, …; die MSI-Eigenschaft `SERVER` nimmt sie **kommagetrennt**.

Im Fenster steht deshalb **eine Adresse je Zeile** (das Feld ist jetzt
mehrzeilig). Beim Bau der Befehlszeile werden die Zeilen zusammengefasst:

```
SERVER="https://…/marketplace/glpiinventory/front/communication.php,https://mt-terminal.ddns.net/front/inventory.php"
```

Leerzeilen, angehängte Kommas und Doppelte werden dabei entfernt, die
Reihenfolge bleibt — die erste Zeile wird `server0`.

| Ziel | was es kann |
|---|---|
| `…/marketplace/glpiinventory/front/communication.php` | nimmt Inventare **und** gibt Aufgaben — nur hierüber kommen angestoßene Läufe |
| `https://mt-terminal.ddns.net/front/inventory.php` | nativer Inventarempfang derselben Instanz, **keine** Aufgaben |

Die Zustandszeile heißt jetzt **„Ziele (n): … | …"** und sammelt aus der
Registry **alle** `server*`-Werte ein, auch aus Unterschlüsseln — vorher wurde
nur der erste gelesen und das zweite Ziel fälschlich als fehlend angezeigt.
Grün wird sie nur, wenn ein glpiinventory-Endpunkt dabei ist; sonst gelb, mit
Hinweis im Protokoll.

Die Rückfrage vor der Installation listet alle Ziele einzeln auf, und jede
Zeile wird vorher auf `http://` / `https://` geprüft.

**Beide Adressen von Gernot bestätigt** (24.08.2026). Meine erste Ableitung
aus `url_base_api` (`https://mt-terminal/glpi/front/inventory.php`) war falsch —
es sind nicht zwei Instanzen, sondern zwei Empfangspunkte derselben.

## Button „In GLPI ansehen"

Öffnet GLPI **direkt bei diesem Rechner** — nicht die Startseite, sondern die
Computer-Liste gefiltert auf den eigenen Rechnernamen. Damit sieht man mit
einem Klick, ob das Inventar wirklich angekommen ist:

```
<basis>/front/computer.php?is_deleted=0&criteria[0][field]=1
        &criteria[0][searchtype]=contains&criteria[0][value]=<RECHNERNAME>&search=Suchen
```

Die Basis-Adresse wird aus den Melde-Zielen abgeleitet — `/marketplace/…` und
`/front/inventory.php` werden abgeschnitten. Geprüft an sechs Fällen, auch mit
Unterpfad (`https://host/glpi/…` → `https://host/glpi`).

Liegt die Oberfläche woanders als der Inventarempfang, kann der Wert
**`GlpiWeb`** in `glpi_installer_config.json` das überschreiben (leer =
ableiten). Die aufgerufene Adresse steht vor dem Öffnen im Protokoll.

Geöffnet wird über `explorer.exe`, damit die Seite im **normalen**
Benutzerkontext aufgeht: das Werkzeug selbst läuft erhöht, und ein erhöhter
Browser nimmt die falsche Sitzung und das falsche Profil.
