Exchange Server 2013 (und auch Exchange 2010) stellt eine Funktion bereit um das Verhalten von Standard CMDlets zu beeinflussen.
In diesem kleinen Beispiel wird der Scripting Agent verwendet, um bei allen neu angelegten Postfächern OWA, OWA für Geräte und ActiveSync zu deaktivieren. In der Standard Einstellung sind diese Postfachfunktionen aktiviert, was vieleicht nicht immer gewollt ist. Um den Scripting Agent zu aktivieren und damit das Verhalten von Standard CMDlets anzupassen, sind allerdings ein paar Schritte notwendig:
Konfiguriert wird der Scripting Agent mittels XML Datei, die auf jedem Exchange Server vorhanden sein muss. Eine Beispiel Datei liegt bereits im Exchange Installationsordner:
C:\Program Files\Microsoft\Exchange Server\V15\Bin\CmdletExtensionAgents
Die Datei „ScriptingAgentConfig.xml.sample“ kann als Vorlage benutzt werden, dazu kann einfach das „.sample“ entfernt werden. Dieser Schritt muss auf jedem Exchange Server erfolgen. Jeder Exchange Server erhält also die gleiche „ScriptingAgentConfig.xml“ Datei:
Für dieses Beispiel hat die Datei „ScriptingAgentConfig.xml“ folgenden Inhalt:
Die Datei gibt es hier auch zum Download:
ScriptingAgentConfig
Wie in der Beispiel Datei zu entnehmen ist, enthält die XML Datei etwas PowerShell Code, welcher in diesem Fall ausgeführt wird, wenn das CMDLet „new-mailbox“ oder „enable-mailbox“ erfolgreich abgeschlossen wurde. Der Teil innerhalb der IF-Anweisung holt sich dann den Alias, des Postfachs welches bearbeitet wurde und deaktiviert die entsprechenden Postfachfeatures.
Sobald die XML-Datei auf den Exchange Servern platziert wurde, muss noch der Scripting Agent aktiviert werden:
Enable-CmdletExtensionAgent "Scripting Agent"
Postfächer die ab jetzt angelegt werden, haben nicht mehr ActiveSync, OWA und OWA für Geräte aktiviert
Durch ein paar Anpassungen an der XML Datei lassen sich auch andere Szenarien umsetzen. UC oder Audit einschalten, Postfach Berechtigungen setzen, Kalender Einstellungen, oder auch eine OWA Signatur, denkbar ist vieles.
Die Sample Datei auf den Exchange Servern ist ebenfalls gut kommentiert, sodass man schnell die entsprechenden Anweisungen findet.
Hi ich bekomme folgende Warnung beim erstellen neuer User nachdem ich das ausprobieren wollte:
Der Cmdlet-Erweiterungs-Agent mit dem Index 5 hat eine Ausnahme in ‚OnComplete()‘ ausgelöst: Microsoft.Exchange.Provisioning.ProvisioningException: ScriptingAgent: Beim Aufrufen des Scriptlets für die OnComplete-API wurde eine Ausnahme ausgelöst: Der Vorgang konnte nicht ausgeführt werden, weil das Objekt ‚Testuser‘ nicht auf ‚AD-ControllerX‘ gefunden wurde.. —> Microsoft.Exchange.Configuration.Tasks.ManagementObjectNotFoundException: Der Vorgang konnte nicht ausgeführt werden, weil das Objekt ‚Testuser‘ nicht auf ‚AD-ControllerX‘ gefunden wurde. bei Microsoft.Exchange.Configuration.Tasks.Task.ThrowError(Exception exception, ErrorCategory errorCategory, Object target, String helpUrl) bei Microsoft.Exchange.Configuration.Tasks.GetObjectWithIdentityTaskBase`2.InternalProcessRecord() bei Microsoft.Exchange.Configuration.Tasks.GetRecipientObjectTask`2.InternalProcessRecord() bei Microsoft.Exchange.Management.RecipientTasks.GetRecipientWithAddressListBase`2.InternalProcessRecord() bei Microsoft.Exchange.Configuration.Tasks.Task.b__91_1() bei Microsoft.Exchange.Configuration.Tasks.Task.InvokeRetryableFunc(String funcName, Action func, Boolean terminatePipelineIfFailed) — Ende der internen Ausnahmestapelüberwachung — bei Microsoft.Exchange.ProvisioningAgent.ScriptingAgentHandler.OnComplete(Boolean succeeded, Exception e) bei Microsoft.Exchange.Provisioning.ProvisioningLayer.OnCompleteImpl(Task task, Boolean succeeded, Exception exception)
Kann das daran liegen das wir unsere Userobjekte in der AD Struktur wegsortieren nach bestimmten OU? Und somit die AD User Objekte nicht im Default Container „Users“ liegen.
Hallo Frank,
der Blogpost ist zwar schon etwas in die Jahre gekommen, ich hätte da aber dennoch eine ggf. wichtige Anmerkung. In dem config File holst Du Dir die zu konfigurierende Mailbox mit dem Benutzerdefinierten Parameter „alias“. Sollte dieser, warum auch immer nicht angegeben worden sein, dann wird automatisch set-casmailbox auf (fast)alle CASMailboxen angewendet. Ich würde noch einen Sicherheitsschalter einbauen, um sicher zu gehen, dass nicht ungewollt Set -Befehle auf alle Mailboxen angewendet werden. z.B. If ($alias){}
PS: Einziger limitierender Faktor ist das von Get-Mailbox vorgegebene ResultSize Limit
Viele Grüße, Matthias.
Hi Frank,
danke für den Artikel. Hab dein Script heruntergeladen und entsprechend abgelegt (EXCH 2016)-Leider bekommen ich die Fehlermeldung
„Fehler bei der Initialisierung der Bereitstellungsebene: ‚“Fehler bei der Initialisierung des Skript-Agents: Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein. Davor sind keine Leerzeichen zulässig. Zeile 2, Position 3.“‚
Hast du eine Idee?
Danke und Gruß
Hallo Frank,
vielen Dank, jedoch (wenn ich 1:1 kopiere) deaktiviert es bei mir bei ALLEN den ActiveSync-Dienst.
(Exch2016)
Hallo Frank,
funktioniert super! Auch unter Exchange 2016 :-)
Vielen Dank für die klasse Anleitung!
Gruß Markus
Hallo,
funktioniert das ganze reibungslos auch auf einem Exchange 2016?
Hallo Frank!
Danke für die tolle Anleitung…
Aber ich bekomme ständig diese Fehlermeldung:
Der Cmdlet-Erweiterungs-Agent mit dem Index 5 hat eine Ausnahme in ‚OnComplete()‘ ausgelöst: Microsoft.Exchange.Provisioning.ProvisioningException: ScriptingAgent: Beim Aufrufen des Scriptlets für die OnComplete-API wurde eine Ausnahme ausgelöst: Cannot convert ‚System.Object[]‘ to the type ‚Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter‘ required by parameter ‚Identity‘. Specified method is not supported.. —> System.Management.Automation.ParameterBindingException: Cannot convert ‚System.Object[]‘ to the type ‚Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter‘ required by parameter ‚Identity‘. Specified method is not supported. —> System.NotSupportedException: Specified method is not supported. at System.Management.Automation.ParameterBinderBase.CoerceTypeAsNeeded(CommandParameterInternal argument, String parameterName, Type toType, ParameterCollectionTypeInformation collectionTypeInfo, Object currentValue) — End of inner exception stack trace — at System.Management.Automation.Internal.PipelineProcessor.SynchronousExecuteEnumerate(Object input, Hashtable errorResults, Boolean enumerate) at System.Management.Automation.PipelineOps.InvokePipeline(Object input, Boolean ignoreInput, CommandParameterInternal[][] pipeElements, CommandBaseAst[] pipeElementAsts, CommandRedirection[][] commandRedirections, FunctionContext funcContext) at System.Management.Automation.Interpreter.ActionCallInstruction`6.Run(InterpretedFrame frame) at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) — End of inner exception stack trace — at Microsoft.Exchange.ProvisioningAgent.ScriptingAgentHandler.OnComplete(Boolean succeeded, Exception e) at Microsoft.Exchange.Provisioning.ProvisioningLayer.OnCompleteImpl(Task task, Boolean succeeded, Exception exception)
Mit Bitte um Hilfe!
Danke!
Hallo Mario,
lade die Datei noch einmal runter, da war ein Fehler in der XML der die Warnung erzeugt hat.
Gruss, Frank