Commit Graph
56 Commits
Author SHA1 Message Date
marcoandClaude Opus 4.8 0e66e268f6 Policies: ADMX-Presentation-Matching robuster (Typ normalisieren + Fallbacks)
- @odata.type-Vergleich normalisiert (fuehrendes '#' egal) -> Text-Presentations
  wurden sonst wegen Formatunterschied nicht zugeordnet.
- Zusaetzlicher Fallback: hat die Ziel-Definition genau eine Presentation, wird
  sie genutzt (deckt Ein-Feld-Settings wie Textboxen ab).
- Definitions-Auflösung: classType zuerst (User/Device nicht verwechseln), dann
  categoryPath bevorzugen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-23 12:56:15 +02:00
marcoandClaude Opus 4.8 c1751bec4d Policies: ADMX-Import überspringt Einstellung sauber bei Presentation-Mismatch
Bei ingesteten ADMX mit abweichender Ziel-Version ließ sich eine Presentation
teils nicht zuordnen; bisher wurde die Einstellung dennoch (unvollständig)
gepostet -> 400 BadRequest. Jetzt wird die ganze Einstellung mit klarer Meldung
übersprungen, statt einen kaputten Body zu senden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-23 12:37:55 +02:00
marcoandClaude Opus 4.8 300c72eb4f Policies: Import ingesteter (custom) ADMX-Vorlagen tenantübergreifend
Custom-ADMX-Definitionen (policyType 'admxIngested') haben tenant-spezifische
IDs -> Binding per Export-Id scheiterte im Ziel-Tenant mit 404. Import löst
solche Definitionen jetzt im Ziel über displayName/classType/categoryPath neu
auf und bindet an die dortige Id; Presentations werden per label/@odata.type
(Fallback: Reihenfolge je Typ) zugeordnet. Eingebaute Vorlagen (admxBacked)
unverändert per stabiler Id. categoryPath wird dafür mitexportiert.

Voraussetzung: dieselbe ADMX ist im Ziel-Tenant importiert; fehlt sie, wird die
betroffene Einstellung mit klarer Meldung übersprungen (Rest wird angelegt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-23 09:21:53 +02:00
marcoandClaude Opus 4.8 ead650d326 Policies: Admin-Vorlagen-Export ohne verschachtelten $expand (MaxExpansionDepth=1)
Graph lehnt definitionValues?$expand=...,presentationValues($expand=presentation)
mit 400 ab ("$expand path too deep, max 1"). Jetzt definitionValues nur mit
'definition' expandieren (Tiefe 1) und presentationValues je definitionValue
separat mit 'presentation' nachladen (jeweils Tiefe 1). Liefert dieselben Daten
für den Re-Import (definition.id, presentation.id, value/values).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-23 09:05:34 +02:00
marcoandClaude Opus 4.8 b58aa1fde3 Policies: Admin-Vorlagen-Export gehärtet (resiliente Liste + sichtbare Fehler)
- Get-GraphPolicyList: $expand=assignments pro Typ absichern. groupPolicyConfigurations
  (Administrative Vorlagen) lehnt den Expand teils mit 400 ab -> dann scheiterte das
  Laden und der Export ließ die Policies still weg. Jetzt Fallback auf Laden ohne
  Zuweisungen, damit der Typ erscheint und exportierbar bleibt.
- Export-PoliciesEndpoint: Detail-Fehler nicht mehr verschlucken, sondern pro Policy
  in 'errors' zurückgeben (+ Log).
- Frontend: Export-Fehler werden im Toast gemeldet (kein stiller Teil-Export mehr).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-23 08:58:55 +02:00
marcoandClaude Opus 4.8 52dcfe6d84 Docker: docker-compose.yml bereinigt (verirrtes 'ls' + ungenutzter volumes-Block)
Gültiges YAML, generischer Default (Port 8080, Named Volume im-data), BRIDGE_PORT
entfernt (nginx lauscht fest auf 8080).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-21 14:38:56 +02:00
marcoandClaude Opus 4.8 f40be6e4bd Docker: interner nginx statt socat (Host-Header -> localhost)
Ursache des 404 bei Zugriff über IP/Proxy: .NET-HttpListener bedient den Prefix
http://localhost:8077/ nur bei Host: localhost. socat (L4) reicht den originalen
Host-Header durch -> 404. Jetzt sitzt ein winziger nginx im Container davor, der
den Host-Header auf localhost umschreibt (Upstream [::1]:8077, IPv4 als Fallback).
App-Code bleibt unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-21 14:35:24 +02:00
marcoandClaude Opus 4.8 c217f5f8f3 Docker: socat-Bridge auf richtige Loopback-Familie (IPv4/IPv6) ausrichten
.NET-HttpListener bindet den Prefix "localhost" im Container auf IPv6 ::1, socat
verband aber auf 127.0.0.1 -> "Connection refused". Entrypoint startet die App
jetzt zuerst, erkennt ob IPv4 oder IPv6 antwortet und richtet socat darauf aus.
Kein Eingriff in den App-Code.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-21 13:54:56 +02:00
marcoandClaude Opus 4.8 9adf4da0d1 Docker: Test-Setup für self-hosted Betrieb (ohne Änderung des App-Teils)
Neuer Ordner docker/ (Dockerfile, docker-entrypoint.sh, docker-compose.yml, README).
Der bestehende App-/Client-Teil (Start.ps1, src/, www/) bleibt unverändert und wird
nur ins Image kopiert. Container-Spezifika laufen ohne Codeeingriff:
- socat-Bridge 0.0.0.0:8080 -> 127.0.0.1:8077 (App bindet weiter nur loopback)
- Datenpfad via XDG_CONFIG_HOME=/data (Volume) - Get-AppDataDir nutzt das auf Linux
- Login über den vorhandenen Device-Code-Flow (WAM/Loopback geht im Container nicht)
Kein Caddy: der vorhandene Reverse-Proxy zieht Port 8080 an.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-21 13:28:43 +02:00
marcoandClaude Opus 4.8 fd9fe761bf CI: Mac-/Dev-Dateien nicht ins MSI packen
Staging schließt jetzt start-macos.command, tests/ und .gitattributes aus, damit
sie nicht im Windows-MSI landen. WiX-Harvest ist ohnehin dynamisch — der Build
funktioniert unverändert, das Paket wird nur sauberer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 16:18:01 +02:00
marcoandClaude Opus 4.8 2c20f25837 Start-Script für macOS (start-macos.command)
Bequemer Launcher für den Mac: prüft pwsh, installiert bei Bedarf einmalig
Microsoft.Graph.Authentication, gibt einen belegten Port frei (auf macOS kein
Auto-Kill) und startet Start.ps1; Argumente (-Port/-NoBrowser) werden
durchgereicht. .gitattributes erzwingt LF für *.sh/*.command, damit der Shebang
auf macOS nicht durch CRLF zerschossen wird.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 16:04:38 +02:00
marcoandClaude Opus 4.8 51c2f56dec Auth: http://localhost als Redirect-URI (Login auf macOS/Linux)
Auf macOS/Linux nutzt Connect-MgGraph den interaktiven Loopback-Browser-Flow
(http://localhost:<zufälliger Port>). Ohne registrierte Loopback-URI scheitert
der Login mit AADSTS50011. Setup-AppRegistration.ps1 legt jetzt zusätzlich
http://localhost an (portagnostisch); App-Registration.md dokumentiert es.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 15:56:39 +02:00
marcoandClaude Opus 4.8 e652891c41 Cross-Platform: Spike für Betrieb unter PowerShell 7 auf macOS/Linux
Windows-Verhalten bleibt identisch (Pfade/Temp verifiziert). Portable Anpassungen:
- Get-AppDataDir/Test-IsWindows (Models.ps1): App-Daten unter macOS in
  ~/Library/Application Support, Linux in $XDG_CONFIG_HOME/~/.config;
  auf Windows unveraendert %APPDATA%. Settings- und Policy-Export-Pfad nutzen ihn.
- ReportDir ueber [IO.Path]::GetTempPath() statt $env:TEMP (auf macOS/Linux leer).
- Start.ps1: Browser plattformneutral oeffnen (open/xdg-open/Start-Process);
  WMI-Stale-Instanz-Erkennung nur noch auf Windows.
- Datei-/Ordner-Dialog: macOS-nativer osascript-Chooser statt System.Windows.Forms;
  auf nicht unterstuetzten Plattformen klare Fehlermeldung.

Auth (Device-Code-Flow) und HttpListener sind bereits plattformneutral. Test auf
echtem macOS steht aus; Packaging (.app/.dmg) folgt separat.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 15:46:56 +02:00
marcoandClaude Opus 4.8 9fb42b4d7e Policies: Zuweisungen sichtbar, Ergebnis-Report, Post-Import-Parität (#1 #4 #5)
- #1 Spalte "Zuweisungen" in der Policy-Liste (Anzahl); Klick öffnet eine
  Detailansicht mit den konkreten Include-/Exclude-Gruppen und Alle Geräte/
  Benutzer. Get-GraphPolicyList lädt jetzt $expand=assignments und löst
  Gruppennamen in einem Bulk-Lookup (Resolve-GroupNamesBulk) auf.
- #4 Bulk-Zuweisung zeigt statt nur eines Toasts einen Ergebnis-Report pro
  Policy (zugewiesen / übersprungen / Fehler) und lädt die Liste neu.
- #5 Post-Import-Zuweisung erhält Alle Geräte/Alle Benutzer (Parität zur
  Bulk-Zuweisung) und nutzt dieselbe Ergebnisansicht.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 12:23:10 +02:00
marcoandClaude Opus 4.8 a7c8e88793 Doku: In-App-Hilfe um Geräte, Policies und Offboarding erweitert (#3)
help.md dokumentierte bisher nur App-Management. Neue Abschnitte für den
Geräte-Tab (inkl. Verwaltungsart, Autopilot-Status), Policies (inkl.
Bulk-Gruppenzuweisung mit Add/Replace) und Offboarding (inkl.
Autopilot-Suche); Tab-Übersicht ergänzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 12:23:09 +02:00
marcoandClaude Opus 4.8 98aea3c303 Tests: Pester-Tests für PolicyIO-Payload-Transformationen (#2)
Deckt die Array-Normalisierung (Repair-SettingsCatalogArrays) inkl.
choiceSettingCollectionValue sowie Remove-PolicyNullProps ab — genau die
Bug-Klasse (PS-5.1-JSON-Roundtrip skalarisiert Ein-Element-Arrays), die uns
mehrfach getroffen hat. 9 Tests, klassische Pester-3/4-Syntax.
Ausführen: Invoke-Pester .\tests

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 12:23:09 +02:00
marcoandClaude Opus 4.8 32e1506be9 v0.1.36 — Bulk-Gruppenzuweisung für Policies und Autopilot im Offboarding
Build & Release MSI / build-msi (push) Canceled after 0s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 12:01:45 +02:00
marcoandClaude Opus 4.8 87fd496ca0 Setup-Skript: DeviceManagementServiceConfig.Read.All bei -IncludeDeviceActions
Der Autopilot-Status im Geräte-Detail (Profil-Zuweisung / letzter Kontakt)
braucht DeviceManagementServiceConfig.Read.All. Das Flag -IncludeDeviceActions
fügt den Scope jetzt hinzu (Read/Write und Read-Only). Ist ohnehin Offboarding
aktiv, wird die ReadWrite-Variante bevorzugt und die Read-Variante entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 11:41:10 +02:00
marcoandClaude Opus 4.8 c10d0b3830 Doku: vollständige Graph-Berechtigungen für den vollen Funktionsumfang
README: Berechtigungstabelle nach Bereich gruppiert (Kern, Geräte-Tab,
Offboarding, Read-Only) inkl. der neuen Abhängigkeiten
DeviceManagementServiceConfig.* (Autopilot-Status im Geräte-Detail,
Autopilot-Suche im Offboarding). App-Registration.md entsprechend ergänzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 11:21:25 +02:00
marcoandClaude Opus 4.8 a78c29744e Offboarding: Autopilot-Geräte mitdurchsuchen
Die Offboarding-Suche fand bisher nur managedDevices (Intune). Reine
Autopilot-Geräte (registriert, aber nicht/nicht mehr in Intune enrolled)
tauchten nie auf. Jetzt wird zusätzlich windowsAutopilotDeviceIdentities
durchsucht (Serial: contains(serialNumber), Name: startswith(displayName),
Fehler still ignoriert) und die Treffer werden — dedupliziert per Serial/
Autopilot-Id — gemergt. Für Autopilot-only-Treffer wird das Entra-Objekt per
azureAdDeviceId nachgeladen. offKey nutzt jetzt eine Fallback-Kette, da
Autopilot-only-Geräte keine intuneDeviceId haben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 11:21:24 +02:00
marcoandClaude Opus 4.8 0f8fc7b159 Doku: Bulk-Gruppenzuweisung und Geräte-Features in README
- Policies-Tab: neuer Abschnitt "Gruppen zuweisen (Bulk)" (Add/Replace,
  Alle Geräte/Benutzer), Tabs-Übersicht und REST-API-Tabelle ergänzt.
- Geräte-Tab: Verwaltungs-Spalte (Intune/Co-Managed) und Autopilot-Status
  im Detail-Panel dokumentiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 09:31:20 +02:00
marcoandClaude Opus 4.8 7bfcfc18ad Policies: Bulk-Zuweisung von Gruppen inkl. Alle Geräte/Alle Benutzer
- Neuer Toolbar-Button "Gruppen zuweisen" im Policy-Tab: mehreren
  ausgewählten Policies (typübergreifend) in einem Schritt dieselben
  Include-/Exclude-Gruppen zuweisen.
- Zwei Modi: "Hinzufügen" (bestehende Zuweisungen werden gelesen und
  gemergt, da Graph /assign Full-Replace ist) und "Ersetzen".
- Integrierte Include-Ziele "Alle Geräte" (allDevicesAssignmentTarget)
  und "Alle Benutzer" (allLicensedUsersAssignmentTarget), dedupliziert
  und mit Exclude-Gruppen kombinierbar.
- Invoke-PolicyAssignEndpoint um mode/allDevices/allUsers erweitert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 09:18:55 +02:00
marcoandClaude Opus 4.8 af301925e9 v0.1.35 — Settings-Catalog-Import-Fix und Update-Check hinter Proxy
Build & Release MSI / build-msi (push) Canceled after 0s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-15 17:50:27 +02:00
marcoandClaude Opus 4.8 0ae20211c7 Settings-Catalog-Import: choiceSettingCollectionValue als Array erzwingen
choiceSettingCollectionValue fehlte in der Array-Key-Liste von
Repair-SettingsCatalogArrays. Beim PS-5.1-JSON-Roundtrip wurde ein
Ein-Element-choiceSettingCollectionValue zum Einzelobjekt entpackt, worauf
Graph den Import mit 400 "Property choiceSettingCollectionValue in payload has
a value that does not match schema" ablehnte (z. B. Default Defender Antivirus
Policy). Jetzt analog zu group-/simpleSettingCollectionValue behandelt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-15 17:49:30 +02:00
marcoandClaude Opus 4.8 de32f6201c Update-Check: Proxy-Authentifizierung unterstützen
Hinter authentifizierten Unternehmens-Proxys (NTLM/Kerberos) scheiterte der
Update-Check mit HTTP 407, weil Invoke-RestMethod keine Anmeldeinformationen
an den Proxy sendet. Jetzt werden die angemeldeten Windows-Credentials an den
System-Proxy durchgereicht; optionaler expliziter Proxy via settings.json ->
update.proxy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-14 10:59:02 +02:00
marcoandClaude Opus 4.8 e110763e6a v0.1.34 — Verwaltungsart-Spalte und Autopilot-Zeitstempel
Build & Release MSI / build-msi (push) Canceled after 0s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-14 09:49:43 +02:00
marcoandClaude Opus 4.8 dfc1128f31 Geräte-Tab: Verwaltungsart-Spalte und Autopilot-Zeitstempel
- Neue Spalte "Verwaltung" (Intune vs. Co-Managed) in der Geräteliste,
  abgeleitet aus managementAgent; farbige Badges, sortierbar, im CSV-Export
  und im Detail-Panel.
- Detail-Panel zeigt Autopilot-Daten (Registriert, Profil zugewiesen am,
  letzter Kontakt) per Lookup über die Seriennummer. Ein echtes Importdatum
  liefert Graph nicht; verfügbar sind nur diese Zeitstempel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-14 07:49:14 +02:00
marcoandClaude Opus 4.8 e4efb0ac32 v0.1.33 — Offboarding-Report und Update-Hinweis
Build & Release MSI / build-msi (push) Canceled after 0s
- Offboarding: HTML-Report pro Geraet (New-OffboardHtmlReport) + reportUrl;
  Dialog-Ergebnis pro Geraet gruppiert + Report-Link
- Update-Check: GET /api/update/check (Gitea releases/latest, Compare-SemVer);
  Kopfzeilen-Badge bei neuer Version, Link zur Release-Seite; optionaler read-only Token

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-13 15:59:30 +02:00
marcoandClaude Opus 4.8 968f47b94f v0.1.32 — Bulk-Offboarding aus dem Geraete-Tab, Geraete-Ladefehler behoben
Build & Release MSI / build-msi (push) Canceled after 0s
- Bulk-Offboarding aus dem Geraete-Tab (Checkboxen + Alle, POST /api/offboard/resolve)
- Fix "Geraete konnten nicht geladen werden" (400): managementState raus dem $select,
  $orderby entfernt, Namensfilter-Fallback auf deviceName, beta-Endpoint
- Bessere Graph-Fehler-Diagnose (Graph-Body an die Meldung anhaengen)
- Offboard: Grund fuer nicht gefundene Autopilot-Zuordnung sichtbar (autopilotNote)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-11 22:08:46 +02:00
marcoandClaude Opus 4.8 bd73a9c3b2 v0.1.31 — Policy-Konsolidierung, Geraete-Export nach Gruppe, Gruppen-in-Gruppen
Build & Release MSI / build-msi (push) Canceled after 0s
- Policies zusammenfuehren (Settings Catalog -> eine neue Policy, Konfliktaufloesung)
- Geraete-Tab: Gruppen-Filter (Live-Suche) + CSV-Export der angezeigten Liste
- Group Management: bestehende Gruppen als Mitglied hinzufuegen (verschachtelt)
- Fix: Geraete "Invalid Date" (ISO-Normalisierung) + Datums-/Spalten-Sortierung
- Doku (README/CHANGELOG) + Version-Bump 0.1.31

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-11 09:01:02 +02:00
marcoandClaude Opus 4.8 446c53f409 v0.1.30 — Policy-Bulk-Import gehaertet, macOS-Apps, Gruppen-Suche & Direkt-Zuweisung
Build & Release MSI / build-msi (push) Canceled after 0s
- Bulk-Import von Policies (Batches + Fortschritt, Fehler-Isolierung)
- Export/Import-Treue via Raw-JSON (-OutputType Json), null-Collections-Strip,
  Settings-Catalog-Reparatur + Korruptions-Erkennung, Git-Resolver
- macOS-Apps in Liste/Suche + Plattform-Filter
- "Gruppe"-Tab durchsucht alle Gruppen (Live-Suche) statt nur Praefix-Gruppen
- Bestehende Gruppe(n) direkt an Apps zuweisen inkl. Mehrfachauswahl
- Fix: Add-GraphAppAssignment merged bestehende Zuweisungen (/assign ersetzt sonst
  die komplette Liste) -> kein Ueberschreiben mehr, ein Request fuer alle Ziele

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-03 09:03:22 +02:00
marcoandClaude Opus 4.8 5c60eacc12 v0.1.29 — Geraete-Offboarding (v1)
Build & Release MSI / build-msi (push) Canceled after 0s
Neu:
- Geraete-Offboarding: Geraete ueber Intune, Autopilot und Entra ID
  entfernen. Suche + ID-Aufloesung (via $batch), Recovery-Keys
  (BitLocker/FileVault/LAPS) vor dem Loeschen, Bestaetigungs-Dialog mit
  Dienst-Auswahl + 403/Multi-Admin-Approval-Handling, im Read-Only gesperrt.
  Neues Modul src/Offboard.ps1, Endpoints /api/offboard/{search,keys,execute}.
  Portiert aus Device Offboarding Manager (Ugur Koc, MIT).
- Offboarding-Berechtigungen dokumentiert; Setup-Skript -IncludeOffboarding.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 12:37:41 +02:00
marcoandClaude Opus 4.8 830dddd15a v0.1.28 — Umbenennen beim Import, UI-Fixes, Geraete-Export repariert
Build & Release MSI / build-msi (push) Canceled after 0s
Neu:
- Umbenennen beim Import: Policy-Name vor dem Anlegen anpassbar
  (Dialog "Policies importieren"), richtiges Namensfeld je Typ

Behoben:
- Geraete-Export im App Report: entfernter sync-Endpoint
  getDeviceInstallStatusReport (400) -> async Export-Job
  DeviceInstallStatusByApp; ZIP/CSV-Logik in Get-IntuneReportRows
- Darkmode-Kontrast im Zuweisungs-Dialog (Theme-Variablen statt fester Farben)
- Dialog-Breite: lange Policy-Namen brechen um statt H-Scroll

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 09:23:59 +02:00
marcoandClaude Opus 4.8 c1fc6f8b94 v0.1.27 — App-Registrierungs-Doku + Setup-Skript, Version-Bump
Build & Release MSI / build-msi (push) Canceled after 0s
- docs/App-Registration.md: alle benoetigten Graph-Berechtigungen
  (Kern, Geraete-Tab, Read-Only) + Auth-Konfiguration
- docs/Setup-AppRegistration.ps1: legt die App-Registrierung automatisch an
  (Rechte, Public-Client-Flow, Redirect-URIs, optional Admin-Consent);
  Berechtigungs-IDs werden live aufgeloest
- README/CHANGELOG verlinkt, ToolVersion + build-local auf 0.1.27

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:36:42 +02:00
marcoandClaude Opus 4.8 4efc71376b Policy-Import haerten, Admin-Vorlagen, Zuweisung nach Import, Git-Snapshot
Neu:
- Administrative Vorlagen (ADMX / groupPolicyConfigurations) als vierter
  Policy-Typ fuer Export/Import (GET /api/policies/administrativetemplate)
- Zuweisung direkt nach Import: pro Policy Include-/Exclude-Gruppen
  (POST /api/policies/assign, typ-spezifische /assign-Action)
- Git-Snapshot: versioniertes Policy-Backup in lokalen Git-Ordner
  (Settings-Sektion policyBackup)
- Import akzeptiert Git-Snapshot-Dateien (policyType neben exportType)

Behoben:
- Settings-Catalog-Import schema-konform: Collection-Properties immer als
  Array (repariert PS-5.1-Roundtrip), null -> [], Wrapper-@odata.type,
  read-only id entfernt
- Import-Phantom-Fehler (@($null)-Geisterdurchlauf im Archiv-Pfad)
- Frontend-Cache-Reset beim Tenant-Wechsel (resetClientState)
- WAM-Anmeldefenster zuverlaessig im Vordergrund (AttachThreadInput)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 11:25:19 +02:00
marcoandClaude Opus 4.8 450428e7f7 CI: Token-Laengen-Diagnose im Gitea-Upload-Schritt entfernt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 00:49:46 +02:00
marcoandClaude Opus 4.8 9a61cad54b CI: Gitea-Upload-Schritt loggt Token-Laenge zur Diagnose
Build & Release MSI / build-msi (push) Canceled after 0s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 00:37:54 +02:00
marcoandClaude Opus 4.8 18e6a597cc v0.1.26 — Multi-Tenant, Pro-Tenant-Vorgaben, RPA entfernt
Build & Release MSI / build-msi (push) Canceled after 0s
Version-Bump (Start.ps1, build-local.ps1) + CHANGELOG-Eintrag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 00:29:16 +02:00
marcoandClaude Opus 4.8 30d605703b CI: gebaute MSI zusaetzlich als Gitea-Release-Asset spiegeln
Neuer Schritt in release.yml lädt die MSI nach dem GitHub-Release per Gitea-API
(Release per Tag holen/anlegen, gleichnamiges Asset ersetzen, hochladen).
Benoetigt GitHub-Secret GITEA_TOKEN; ohne Token ueberspringt sich der Schritt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 00:27:47 +02:00
marcoandClaude Opus 4.8 37ae32bb94 Multi-Tenant-Umschaltung + Pro-Tenant-Vorgaben, RPA deaktiviert
- Multi-Tenant: Settings-Schalter Single/Multi, Profile mit je eigener
  App-Registrierung, Topbar-Umschalter mit Sofort-Reconnect; verlustfreie
  Migration (Get-ActiveConnection/-TenantProfile, /api/tenants[/switch]).
- Pro-Tenant-Overrides mit globalem Fallback: Abteilungs-Praefixe sowie
  Required-/Available-Gruppen-Naming (Get-DepartmentPrefixes/Get-GroupNaming
  tenant-bewusst; New-GroupEndpoint nutzt Resolver).
- RPA komplett deaktiviert: Mode-Tab, globaler Settings-Abschnitt und
  Test-Anzeige entfernt.
- Setup-Zwang gelockert: nur Tenant ID + Client ID Pflicht; Abteilungs-
  Praefixe optional (kein harter Setup-Blocker mehr).
- api(): "Failed to fetch" -> klare Meldung "Server nicht erreichbar…".
- Hilfe-Footer: "Entwickelt von WendeIT – Marco Wende".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 19:16:34 +02:00
marcoandClaude Opus 4.8 f36e9c5ba0 Policy-Export: mehrere Policies als Einzeldateien statt Bundle
Bei mehreren ausgewaehlten Policies wird jede als eigene JSON-Datei
heruntergeladen (statt einer gebuendelten Datei). 150ms Pause zwischen den
Downloads gegen verschluckte Browser-Downloads; Dateinamen bei gleichem
Anzeigenamen automatisch eindeutig. Import liest alte Bundles weiterhin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 14:33:24 +02:00
marcoandClaude Opus 4.8 ea51bac772 Policies-Tab: Export/Import (Settings Catalog, Compliance, Config)
Build & Release MSI / build-msi (push) Canceled after 0s
Neuer Tab "Policies" zum Sichern und Wiederherstellen von Intune-Policies.

- Backend src/PolicyIO.ps1: typ-getrieben fuer configurationPolicies
  (Settings Catalog), deviceCompliancePolicies und deviceConfigurations
- Export als JSON-Download (einzeln/Bundle) + Server-Archiv unter %APPDATA%
- Import per Datei-Upload, immer Neuanlage (nie ueberschreiben), robust fuer
  Hashtable (PS7) und PSCustomObject (PS5.1); im Read-Only-Modus ausgeblendet
- Routen in src/Api.ps1; Config-Scope DeviceManagementConfiguration.* auch
  nach Settings-Save sichergestellt
- Frontend: Tab + View, Suche/Typ-Filter/Sortierung, Auswahl, Download/Upload
- Version 0.1.25 (Start.ps1, CHANGELOG, README)
- build-local.ps1: x64-.NET-Runtime fuer wix auf ARM64-Windows + echter
  Desktop-Pfad

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 14:25:29 +02:00
marcoandClaude Sonnet 4.6 e63ae28cb1 Geräte-Tab: serverseitige Suche via Graph API
Suche ruft bei jeder Eingabe die API auf statt lokal zu filtern.
Seriennummer wird per exaktem eq-Filter parallel gesucht und mit
Namens-Treffern zusammengeführt (Graph unterstützt kein startswith
auf serialNumber).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:52:42 +02:00
marcoandClaude Sonnet 4.6 c5bba697b4 Geräte-Tab: Toolbar mit Inline-Styles für zuverlässige Darstellung
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:40:41 +02:00
marcoandClaude Sonnet 4.6 07b462dc3d Geräte-Tab: eigene Suchfeld-Klassen statt globale search-wrap
dev-search-wrap und dev-search-input unabhängig von globalen Styles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:38:30 +02:00
marcoandClaude Sonnet 4.6 1583b91a60 Geräte-Tab: Suchfeld-Darstellung korrigiert
margin/padding-right überschrieben damit das Eingabefeld korrekt
dargestellt wird und Texteingabe sichtbar ist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:36:44 +02:00
marcoandClaude Sonnet 4.6 337709b685 Geräte-Tab: Wipe-Aktion mit Benutzerdaten-Option, Suchfeld vergrößert
Wipe-Button mit eigenem Modal: Checkbox ob Benutzerdaten behalten werden
(keepUserData). Suchfeld auf max-width 600px vergrößert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:34:38 +02:00
marcoandClaude Sonnet 4.6 f94141dbe0 Geräte-Tab: Autopilot Reset Aktion
Windows Autopilot Reset via wipe mit keepEnrollmentData:true.
Button nur bei Windows-Geräten sichtbar, separate Warnmeldung.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:31:59 +02:00
marcoandClaude Sonnet 4.6 78dc8d5c01 Geräte-Tab: Suche, Detail-Panel und Aktionen
Neuer Haupttab "Geräte" mit Geräteliste (filterbar nach OS/Compliance),
Detail-Panel mit vollständigen Gerätedaten und Aktions-Buttons:
Sync, Neustart, Sperren, Diagnose, BitLocker-Rotation, Retire.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:26:46 +02:00
marcoandClaude Sonnet 4.6 ec130031cb Group Management: Benutzer-Tab mit Gruppen-Mitgliedschaften
Neuer Tab "Benutzer" im Group Management: Benutzer suchen und alle
Gruppen anzeigen, in denen dieser Mitglied ist (transitiveMemberOf).
Gruppen filterbar, mit Typ-Badge (Sicherheitsgruppe/M365/Verteiler).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 10:03:49 +02:00
marcoandClaude Sonnet 4.6 2f0af6e577 App Report via Export Jobs, Umlaut-Suche, Geräte-Export, Mitglieder entfernen
- App Report: Zahlen per AppInstallStatusAggregate Export Job (ZIP/CSV)
- Geräte-Export: getDeviceInstallStatusReport statt deviceStatuses
- Benutzersuche: ConsistencyLevel+$count für Umlaut-Kompatibilität
- Gruppen: Mitglieder entfernen in modalMembers und Group Explorer (gex)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 07:23:04 +02:00
marcoandClaude Sonnet 4.6 0174ca1036 MSI: application.ico als Shortcut-Icon
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 07:50:46 +02:00
marcoandClaude Sonnet 4.6 f175b20e9c MSI-Build: WiX 4.0.6 mit PowerShell-Fragment-Generator
- WiX auf Version 4.0.6 festgenagelt (keine OSMF-EULA-Pflicht wie bei v7)
- harvest-Subcommand entfernt (nicht in 4.0.6 verfügbar)
- Fragment-Generierung (AppFiles.wxs) direkt via PowerShell XML-API
- Extension auf WixToolset.UI.wixext/4.0.6 fixiert
- build-local.ps1 für lokale Tests in der Windows-VM
- Lokaler Build erfolgreich getestet: 1.5 MB MSI, Installer-Wizard OK

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 07:46:28 +02:00
marcoandClaude Sonnet 4.6 bf373a0981 GitHub Action: MSI-Release per WiX v4 auf Windows-Runner
- .github/workflows/release.yml: baut bei v*-Tags ein MSI und veröffentlicht es als GitHub Release
- installer/Intune-Manager.wxs: WiX v4 Package-Definition (Program Files, Startmenü-Shortcut)
- installer/License.rtf: Lizenztext für den Installer-Dialog

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 07:19:09 +02:00
marcoandClaude Sonnet 4.6 189e0b23bd Abteilungs-Präfixe und RPA-Gruppen optional
Beide Felder sind nicht mehr pflichtmäßig in der Validierung.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 07:15:09 +02:00
marcoandClaude Sonnet 4.6 34811ff583 v0.1.24 — App Report, CSV Import, Read-Only Mode, Group Management
- App Report: Installationszähler pro App via Graph $batch (deviceStatuses)
- Geräte-Export: CSV mit Maschinennamen pro App (GET /api/apps/devicestatus)
- CSV-Import: Massenimport von Benutzern in Gruppen mit Header-Erkennung
- Read-Only-Modus: Schreib-Tabs/Buttons automatisch ausblenden
- Ergebnis-Banner nach CSV-Import (hinzugefügt/bereits Mitglied/Fehler/nicht gefunden)
- Dokumentation aktualisiert (README, help.md, CHANGELOG)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 07:12:49 +02:00