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)
- Using Remote PowerShell to
connect to Lync
http://blogs.technet.com/b/ilvancri/archive/2010/11/25/using-remote-PowerShell-to-connect-to-lync.aspx - Remote PowerShell and Lync
http://gotspeechguy.com/2012/01/05/remote-PowerShell-and-lync/ - Connect To Lync Server using
Remote PowerShell
http://www.howexchangeworks.com/2012/01/connect-to-lync-server-using-remote-PowerShell.html - Kerberos für Webservices
http://technet.microsoft.com/en-us/library/gg398976.aspx http://blogs.technet.com/b/jenstr/archive/2010/09/23/kerberos-and-microsoft-lync-server-2010-web-services.aspx http://www.technotesblog.com/2011/05/20/enabling-kerberos-authentication-for-lync-server-2010-web-services/
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.
- Planning für Role-Based
Access Control
http://technet.microsoft.com/en-us/library/gg425917.aspx
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
- Lync Provisioning
- Lync PowerShell
- XDSPublishItems
- Enable Users für Lync, via
AD Group Membership
http://trogjels.wordpress.com/2012/09/20/enable-Users-for-lync-via-ad-group-membership/