Commit Graph
48 Commits
Author SHA1 Message Date
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