Teams-Policies, aber das Meeting endet wirklich
Letztes Quartal saßen wir mit sieben Leuten 90 Minuten in einem Raum, um Microsoft-Teams-Policies zu reviewen. Die meiste Zeit ging nicht in Entscheidungen. Sie ging in:
- Den aktuellen Wert einer Einstellung suchen, deren genauen Namen niemand mehr wusste.
- Diskutieren, ob der Default, den wir hatten, wirklich ein Default ist oder etwas, das ein früherer Admin vor Jahren mal angepasst hat.
- Hin und her überlegen, was Microsoft heute empfiehlt und was unsere alte Baseline war.
- Schätzen, wie viele Nutzerinnen und Nutzer eine Änderung tatsächlich betrifft.
Als wir dann endlich beim Entscheiden waren, ging das in zwanzig Minuten. Die anderen siebzig waren Datensucherei im Besprechungsraum. Anschließend hat ein Junior-Admin zwei Tage damit verbracht, die Entscheidungen in PowerShell-Befehle und Zuweisungen zu übersetzen. Die Hälfte landete auf der falschen Policy, weil die Meeting-Notizen nicht zu den Cmdlet-Namen passten.
Dieses Muster wiederholt sich jeden Audit-Zyklus. Also habe ich ein Tool geschrieben, das daraus etwas anderes macht.
Was es macht
Ein PowerShell-Script, drei Modi:
1. Export
Verbindet sich mit dem Tenant, findet jedes Get-CsTeams*-Policy- und Configuration-Cmdlet (typisch 70 bis 80 Stück), zieht jedes davon nach JSON und in ein flaches CSV, und schreibt ein einzelnes Excel-Workbook, das die Einstellungen nach Kategorie gruppiert. Jede Zeile enthält den aktuellen Wert, den empfohlenen Wert, einen Marker wenn beide abweichen, die Anzahl betroffener Nutzer und eine leere DECISION-Spalte fürs Meeting.
2. Meeting
Du öffnest das Workbook mit den Stakeholdern. Sie füllen die DECISION-Spalte. Niemand muss einen Cmdlet-Namen aus dem Kopf wissen oder ein zweites Fenster aufmachen. Die Empfehlung steht daneben. Die Zahl der betroffenen Nutzer auch.
3. Apply
Script nochmal starten, mit -ApplyDecisions path/to/edited.xlsx. Standardmäßig erzeugt es eine eigenständige .ps1, die alle Änderungen vor dem Ausführen lesbar enthält. Mit -DryRun siehst du, was sich ändern würde, ohne den Tenant anzufassen. Ohne diese Flags werden die Änderungen direkt angewendet.
Das ist der ganze Loop. Export, entscheiden, anwenden. Aus dem 90-Minuten-Meeting werden 20 Minuten echte Entscheidungen, und aus den zwei Tagen Nachbereitung wird Null.
Was mir wichtig war
Es funktioniert headless. -AuthMethod DeviceCode gibt dir einen Code, den du auf microsoft.com/devicelogin eingibst. Kein Browser nötig auf der Maschine, von der du es startest. Praktisch, wenn du auf einen Jumphost ssh’st und das Ding in eine Pipeline einbauen willst.
Review-Script als Default. Der Apply-Schritt geht nicht einfach los und ändert Dinge. Standardmäßig schreibt er ein Script, das du Zeile für Zeile lesen kannst. Audit-Teams mögen das. Junior-Admins, die gerade etwas auf Produktion ändern, mögen es noch mehr.
User-Impact ist echt, nicht generisch. Das Script zählt, wie viele Nutzer tatsächlich einer Non-Global-Policy zugewiesen sind, und zeigt das im Workbook. Wenn jemand im Meeting also sagt „lass uns das Feature deaktivieren", siehst du sofort, ob das 12 Leute betrifft oder 4.200.
Die Empfehlungen sind konservativ. Sie folgen der Microsoft-Baseline, nicht dem, was letzten Monat auf einem Security-Blog trendete. Wenn du anderer Meinung bist, übersteuere in der DECISION-Spalte. Das Tool besteht nicht darauf, dass du seine Empfehlung übernimmst.
Was es nicht macht
Ich will über die Kanten ehrlich sein:
- Es ersetzt keinen echten CAB-Prozess. Es komprimiert nur den Datensammlungs-Teil. Das Entscheiden bleibt bei dir.
- Es braucht Teams-Administrator-Rechte in deinem Tenant. Read-only reicht für Export, Write brauchst du für Apply.
- Es ist PowerShell. Wenn euer Shop auf Bash und Python läuft und „Cmdlet" euch Ausschlag verursacht, werdet ihr damit nicht warm. PowerShell 5.1 auf Windows oder 7.2+ cross-platform laufen beide.
- Es fasst Intune, Entra oder Call-Quality-Dashboards nicht an. Nur Teams-Policies, mit Absicht. Tools, die alles versuchen, machen meist eine Sache schlecht.
Warum es Open Source ist
Ich habe das für meine eigene Situation gebaut, und da ist nichts drin, was Wettbewerbsgeheimnis sein müsste. Die Teile, die tenant-spezifisch sind (eure Einstellungen, eure Entscheidungen, eure User-Zahlen) verlassen die Maschine nie. Das Script liest aus eurem Tenant und schreibt Dateien lokal.
Apache 2.0. Lesen, forken, PR schicken, oder die Idee nehmen und eine bessere Version schreiben. So oder so wird das nächste Teams-Policy-Meeting in einer anderen Firma kürzer.
Wenn du auf was Komisches stößt, mach ein Issue auf oder schreib mir auf LinkedIn. Ich fixe das wahrscheinlich am selben Abend, weil es vermutlich heißt, dass ich gleich in Produktion drüber stolpere.