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

Intune Manager – Web Edition

Modernes Web-Frontend fuer den Intune Manager. PowerShell startet einen lokalen HTTP-Server, der das Frontend ausliefert und die Microsoft Graph-Aufrufe ausfuehrt.

Voraussetzungen

  • Windows mit PowerShell 5.1 oder PowerShell 7+
  • Modul Microsoft.Graph.Authentication (wird beim ersten Connect benoetigt):
    Install-Module Microsoft.Graph.Authentication -Scope CurrentUser -Force
    
  • Browser (Edge, Chrome, Firefox)

Start

.\Start.ps1

Optionen:

Parameter Standard Beschreibung
-Port 8077 Port des lokalen HTTP-Servers
-TenantId — Ueberschreibt Tenant-ID aus Settings (nur dieser Start)
-ClientId — Ueberschreibt Client-ID aus Settings (nur dieser Start)
-NoBrowser aus Browser nicht automatisch oeffnen

Beispiele:

.\Start.ps1 -Port 8088
.\Start.ps1 -NoBrowser

Beenden: Ctrl+C im Terminal.


Verbindungsmodus (Read/Write vs. Read-Only)

Der Server probiert beim Verbinden zuerst die Read/Write-App-ID (clientId). Schlaegt diese fehl, wird automatisch auf die Read-Only-App-ID (clientIdRo) zurueckgefallen.

Modus Anmelde-Ergebnis Verhalten im Frontend
Read/Write Normale Verbindung Alle Funktionen verfuegbar
Read-Only Fallback auf clientIdRo Schreib-Buttons/Tabs werden ausgeblendet

Was wird im Read-Only-Modus ausgeblendet?

  • App-Zuweisung (Required / Available hinzufuegen und entfernen)
  • Gruppen erstellen und loeschen
  • Tab „Benutzer hinzufuegen" im Group Management
  • Tab „CSV-Import" im Group Management
  • Session-Ausfuehren-Button
  • Alle Rename-/Delete-Buttons

Konfiguration in den Einstellungen

Settings → Verbindung
  Client-ID (Read/Write):  <Azure App-Registration mit Schreibrechten>
  Client-ID (Read-Only):   <Azure App-Registration nur mit Leserechten>  (optional)
  Scopes RW:               DeviceManagementApps.ReadWrite.All ...
  Scopes RO:               DeviceManagementApps.Read.All ...

Benoetigt Graph-Berechtigungen

Funktion Benoetigt
Apps anzeigen DeviceManagementApps.Read.All
Gruppen anzeigen / Mitglieder GroupMember.Read.All
User suchen User.Read.All
Zuweisungen aendern DeviceManagementApps.ReadWrite.All
Gruppen-Mitglieder aendern GroupMember.ReadWrite.All
App-Installationszaehler (Report) DeviceManagementManagedDevices.Read.All ⚠
Geraete-Exportliste pro App DeviceManagementManagedDevices.Read.All ⚠

⚠ Ohne DeviceManagementManagedDevices.Read.All zeigt der App-Report nur Zaehler = 0 und der Geraete-Export liefert keine Eintraege.


Navigation (Tabs)

Tab Beschreibung
App Management Haupt-Ansicht: Apps laden, Gruppen zuweisen / entfernen
Group Management Mitglieder anzeigen, exportieren, Benutzer hinzufuegen, CSV-Import
App Report Installationszaehler pro App, Geraete-Export als CSV

Group Management

Mitglieder & Export

  • Gruppe links suchen und auswaehlen
  • Mitgliederliste (inkl. verschachtelte Gruppen) wird geladen
  • Filter zum Einschraenken der Anzeige
  • Als CSV exportieren laedt alle Mitglieder als members-<Gruppe>-<Datum>.csv

Benutzer hinzufuegen (nur Read/Write)

  • Benutzer per Name, UPN oder E-Mail suchen
  • Mehrere Benutzer auswaehlen und gemeinsam hinzufuegen

CSV-Import (nur Read/Write)

Massenhaftes Hinzufuegen von Benutzern zu einer Gruppe per CSV-Datei.

Ablauf:

  1. Gruppe links auswaehlen
  2. CSV hochladen oder UPNs/E-Mails direkt einfuegen (eine pro Zeile)
  3. „Benutzer aufloesen" – Graph-Lookup via UPN/Mail → Vorschau mit ✓/✗
  4. „Gefundene importieren" – fuegt alle gefundenen Benutzer zur Gruppe hinzu

CSV-Format:

Die erste Zeile wird als optionaler Header erkannt. Spalte mit dem Namen UserPrincipalName, Mail oder Email wird automatisch ausgewaehlt. Ohne Header: erste Spalte mit @ wird verwendet.

DisplayName,UserPrincipalName,Mail
Max Mustermann,max.mustermann@firma.de,max.mustermann@firma.de
Erika Muster,erika.muster@firma.de,

Oder einfach eine UPN pro Zeile:

max.mustermann@firma.de
erika.muster@firma.de

Ergebnis-Anzeige nach Import:

Chip / Status Bedeutung
✔ Gruen Erfolgreich hinzugefuegt
≈ Gelb Bereits Mitglied (kein Fehler)
✗ Rot Fehler (Meldung in der Tabelle)
Grau UPN nicht in Graph gefunden (nicht importiert)

App Report

  • Neu laden: laedt Installationszaehler fuer alle Apps (kann 1–2 Min. dauern)
  • Tabelle sortierbar per Klick auf Spaltenheader
  • Suche filtert nach App-Name, Publisher, Typ
  • Als CSV exportieren: exportiert die gefilterte Tabelle
  • Geraete-Export (pro Zeile): laedt alle Geraete mit Installationsstatus fuer diese App

Architektur

Intune Manager/
├── Start.ps1                  Entry Point, Config, State
├── README.md                  diese Datei
├── src/
│   ├── Models.ps1             Settings-Schema und Defaults
│   ├── Graph.ps1              Microsoft Graph API Helpers
│   ├── Server.ps1             HTTP-Server (HttpListener)
│   ├── Router.ps1             Request-Routing
│   └── Api.ps1                REST-API-Endpoints
└── www/
    ├── index.html             SPA-Shell
    ├── styles.css             Dark Theme, Read-Only-Regeln
    └── app.js                 Frontend-Logik (Vanilla JS)

REST-API (intern)

Methode Pfad Rechte Zweck
GET /api/status — Verbindungsstatus + ReadOnly-Flag
POST /api/connect — Microsoft Graph verbinden
POST /api/disconnect — Trennen
GET /api/groups Read Abteilungs-Gruppen (abt-hm-*)
GET /api/groups/rpa Read 3 vordefinierte RPA-Gruppen
GET /api/groups/search?q= Read Gruppen suchen
POST /api/groups Write Neue Required-Gruppe erstellen
POST /api/groups/check Read Gruppen-Name pruefen
POST /api/groups/resolve-upns Read UPN-Liste → UserId + DisplayName
GET /api/groups/{id}/members Read Mitglieder einer Gruppe
GET /api/groups/{id}/members/export Read Mitglieder als CSV
POST /api/groups/{id}/members Write Benutzer zur Gruppe hinzufuegen
DELETE /api/groups/{id}/members/{uid} Write Benutzer aus Gruppe entfernen
GET /api/users?q= Read Benutzer suchen
GET /api/apps Read Apps laden (cached)
POST /api/apps/refresh Read Apps neu laden
GET /api/apps/report Read+MDM Installationszaehler alle Apps
GET /api/apps/devicestatus?appId= Read+MDM Geraete-Installationsstatus einer App
GET /api/membership?targets=&groupId= Read Mitgliedschafts-Status pruefen
POST /api/membership/bulk Read Mehrere Mitgliedschaften pruefen
POST /api/assignments/apply Write Geplante Zuweisungen ausfuehren

Read+MDM = benoetigt zusaetzlich DeviceManagementManagedDevices.Read.All


Hinweise

  • Single-User-App – der lokale HTTP-Server ist fuer einen Benutzer ausgelegt.
  • Auth lebt im PowerShell-Prozess – Disconnect oder Schliessen des Terminals beendet die Session.
  • Cache – Apps werden im Serverprozess gecacht. Refresh-Knopf laedt neu.
  • Port-Konflikt – laeuft bereits eine Instanz, beendet Start.ps1 sie automatisch (per CommandLine-Matching). Bei PID-4-Konflikt (http.sys) anderen Port waehlen: .\Start.ps1 -Port 8088.
S
Description
Intune Manager – Web Edition. PowerShell HTTP-Server + Vanilla JS Frontend für Microsoft Intune App- und Gruppen-Verwaltung via Microsoft Graph.
Readme
2.3 MiB
2026-09-16 12:02:36 +02:00
Languages
PowerShell 39.5%
JavaScript 33.8%
CSS 15.8%
HTML 10.3%
Shell 0.3%
Other 0.3%