Lyncgroupprovisioning

Das folgende Skript ist eine einfache Lösung, um Benutzer für Lync unter Nutzung einer Standardeinstellung zu aktivieren. Gerade mittlere und größere Firmen setzen bereits Produkte ein, um Benutzer im Active Directory automatische zu provisionieren. Aber viele dieser Produkte wissen nicht mit Lync umzugehen. sicher wäre es ideal, wenn diese Produkte auch gleich per PowerShell die erforderlichen Einstellungen für Lync vornehmen könnten. Meine praktische Erfahrung hierbei ist, aber, dass eben diese Prozesse oft nicht fristgerecht fertig werden und ich daher oft eine Zwischenlösung schaffen muss.

Überlegung

Als Zwischenlösung werden die Mitglieder in einer „Windows universal Security Group“ gepflegt und ausgewertet. Das kann eine vorhandene Provisioning-Lösung in der Regel schon liefern. Dann wird PowerShell-Skript wird regelmäßig auf einem Jobserver ausgeführt, um anhand der Mitglieder der Gruppe diese für Lync mit einem vorgegebenen Policyset zu aktivieren oder zu deaktivieren.

Da dieses Script quasi "unüberwacht" läuft, finden Sie im Code auch Abschnitte zum Versenden von Mails und Schreiben von Eventlogs. Zudem ist das Skript auf den Betrieb in mehreren Domains und mit mehreren DCs ausgelegt.

Programmlogik

Die Logik des PowerShell-Skript ist einfach und überschaubar. Zuerst werden alle aktuell aktiven Lync-Benutzer ausgelesen und deren DN in eine Hashtable übernommen. Dann werden alle Objekte gesucht, die per LDAP-Suche ein "MemberOf" dieser Lync-Gruppe haben. Durch die Suche erspare ich mir umfangreiche Sonderbehandlungen bei mehr als 1000 Mitgliedern zu ersparen.

Jedes gefundene Objekte wird gegen die Hashtabelle geprüft. Ist der Benutzer schon in der Hashtabelle enthalten, dann wird er dort heraus gestrichen. Benutzer, die nicht in der Hashtabelle sind, werden für Lync „aktiviert“.

Nachdem alle Benutzer aktiviert wurden, werden die verbliebenen Lync user in der Hashtabelle deprovisioniert. Sie sind ja nicht mehr in der Gruppen enthalten.

Zugriff auf Lync

Die Verwaltung von Lync per Skript erfolgt über die PowerShell. für die Umsetzung gibt es dazu mehrere Optionen:

  • Skript auf dem Lync Server
    Für sehr große Änderungen ist dies sinnvoll und es sind keine weiteren Voraussetzungen erforderlich. Nachteilig ist natürlich der direkte Zugriff auf den Server mit allen Berechtigungen
  • Job-Computer mit lokal installierter Lync PowerShell Umgebung
    Das PowerShell Skript könnte direkt die Commandlets aufrufen. Allerdings muss das System die Lync Voraussetzungen erfüllen (64bit, Win2008R2 oder höher etc.) und Updates müssten auch auf diesem Server eingespielt werden
  • Job-Computerm mit remote PowerShell
    Über Befehle wie Invoke-Command kann auf einem entfernten Server ein PowerShell-Befehl oder Skript gestartet werden.
  • Job-Computer mit Remote PowerShell auf Lync  Service
    PowerShell kann relativ einfach „remote“ genutzt werden. Damit ist auf dem Job Computer außer PowerShell 2.0/WinRM 2.0 keine weitere Komponente erforderlich.

Die letzte Option ist aus meiner Sicht am flexibelsten. Sie baut auf dem Lync Webservice "/OCSPowerShell auf", der auf jedem Frontend Server bereitgestellt wird.

Hinweis: Wenn eine automatische Anmeldung erfolgen soll, sollte der Lync Pool per Kerberos erreichbar sein. (Dienstkonto erforderlich)

Konfiguration

Die komplette Konfiguration des Skripts erfolgt über Parameter. Folgende selbst erklärende Werte sind vordefiniert und können im Skript selbst geändert oder beim Aufruf alternativ übergeben werden:

param (
   [string]$reportcsv = "C:\Lync Groupprovisioning\Lync Groupprovisioning.csv", # CSV-Datei mit dem Log der Aenderungen
   [string]$reportcsvencoding  = "unicode",                         # Format der CSv Datei
   [string]$GcDC= "dc1.msxfaq,de",                                  # DC für alle Aktionen
   [string]$lyncuri = "https://lyncfe.msxfaq.de/ocsPowerShell",      # URL für Lync Remote PowerShell 
   [string]$lyncgroupdn = "CN=lyncUsers,ou=Provisioning,dc=msxfaq,dc=de", # Konfigurationsgruppe
   [string]$RegistrarPool "lyncfe.msxfaq.de",                       # Lync Pool für die Aktivierung
   [string]$smtpserver = "mail.msxfaq.de",                          # Mailserver fuer Benachrichtigung
   [string]$smtpto = "lync@msxfaq.de",                              # SMTP Absenderadresse
   [string]$smtpfrom = "lync@msxfaq.de",                            # SMTP Zieladresse
   [int]$maxorphaneditems= 10,                                      # max deprovisioning Sicherheitsgurt
   [switch]$enableremove = $false,                                  # true um deprovisioning zu aktivieren
   [switch]$whatif = $false                                         # true fuer simulation only
)

Aufruf

Damit das Skript sinnvoll laufen kann, muss es immer aufgerufen werden, wenn sich die Gruppe ändert. Das kann regelmäßig per Taskplaner erfolgen. Ich nutze dazu gerne eine CMD-Datei, so dass ich am Taskplaner nichts ändern muss, wenn sich die Datei oder deren Parameter ändern müssten.

Hinweis:
Das Skript möchte Eventlogs mit der Quelle "Lync Groupprovisioning" schreiben, die dazu erst einmal angelegt werden muss. Starten Sie dazu eine PowerShell als Administrator und führen Sie folgenden zwei Zeilen aus

$evt=new-object System.Diagnostics.EventLog("Application")
$evt.Source="Lync Groupprovisioning"

Dann kann das Skript selbst wieder als normaler lokaler user mit den rechten in den Lync CS-Gruppen laufen.

@echo off
REM Starterfile für PowerShell with Taskmanager
REM

PowerShell.exe -noninteractive -file "C:\Lync Groupprovisioning\Lync Groupprovisioning.ps1"

Echo End

Alternativ können Sie natürlich auch die Gruppe auf Veränderungen überwachen (Siehe GET-ADChanges oder Get-USNChanges) und so die Ausführung beschleunigen. Zuletzt könnte natürlich noch ihr Provisioning selbst das Skript aufrufen. Beachten Sie dabei aber, dass dann sowohl ihr Provisioning als auch das Skript die gleichen DCs verwenden sollten, damit nicht aufgrund von Replikationslatenzzeiten das Ergebnis unvollständig ist.

Protokollierung

Um die Aktion des Skripts nachvollziehen zu können, werden alle Aktionen in einer Protokolldatei (Zeitstempel des Aufrufs) hinterlegt.

  • .\Lync Groupprovisioning.csv
    Laufend fortgeschriebene Datei mit allen durchgeführten Änderungen
  • .\Logs\ Lync Groupprovisioning.yyyymmddhhMMSS.txt
    Jeder Aufruf erzeugt ein eigenes Transcript

Fehler werden im Eventlog als auch per Mail gemeldet. Start, Änderungen und Ende werden ebenfalls im Eventlog protokolliert, so dass eine Überwachung per SCOM o.ä. möglich ist.

Log Name:      Application
Source:        Lync Groupprovisioning

Dabei kommen folgende Eventlogs zur Anwendung.

Level ID Bedeutung

Information

0

Lync Groupprovisioning gestartet

Information

1

Lync Groupprovisioning beendet

Information

10

ENABLE Erfolgreich

Error

10

ENABLE Fehlerhaft

Information

20

REMOVE Erfolgreich

Error

20

REMOVE Fehlerhaft

Sie können natürlich auch gerne selbst im Code die Eventlogs einsehen und anpassen

Berechtigungen

Der beim Skript implizit oder explizit übergebene Benutzer wird von Lync gegen die Lync Gruppen geprüft. (RBAC). Der Anwender muss daher in der entsprechenden Lync Admin-Gruppe Mitglied sein. für eine erfolgreiche Provisionierung muss das Dienstkonto in die Gruppe „RTCUniversalUserAdministratoren“ aufgenommen werden. Diese Gruppe ist Mitglied von CSUserAdministrator, so dass auch die entsprechenden Berechtigungen für die Commandlets erteilt werden.

Eine weitere Delegierung der Berechtigungen ist möglich aber aktuell nicht umgesetzt.

Steuerungsgruppe

Die Steuerung, welcher Benutzer überhaupt „Lync“ nutzen dürfen, liegt im Active Directory und ist im Code als Parameter vordefiniert.

[string]$lyncgroupdn  = "CN=lyncUsers,ou=Provisioning,dc=msxfaq,dc=de",

Sie können das Skript ändern oder natürlich die Parameter entsprechend anpassen.

Skript

Hier das entsprechende Skript zum Download und eigenen Anpassen

Achtung
Das Skript ist "unscharf", d.h. alle Lync Benutzer, die nicht in der angegebenen Gruppe sind, werden NICHT in Lync deaktiviert. Sie müssen dazu den Parameter "[switch]$enableremove = $false" auf $true setzen.

Lync Groupprovisioning.1.4.ps1

Jede Umgebung ist anders und auch die Parametrisierung ist anzupassen. Wenn Sie unsicher sind, wie das Skript einzusetzen ist, dann üben die den Einsatz erst in einer TestUmgebung oder führen Sie das Skript im Einzenschrittmodus aus, um die Funktion zu verstehen.

Weitere Links