Exchange 2013: Postfach Features deaktivieren (Scripting Agent)

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

image

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:

image

Für dieses Beispiel hat die Datei „ScriptingAgentConfig.xml“ folgenden Inhalt:

Scripting Agent

Die Datei gibt es hier auch zum Download:

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"

image

Postfächer die ab jetzt angelegt werden, haben nicht mehr ActiveSync, OWA und OWA für Geräte aktiviert

image

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.

9 Gedanken zu „Exchange 2013: Postfach Features deaktivieren (Scripting Agent)“

  1. 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.

    Antworten
  2. 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.

    Antworten
  3. 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ß

    Antworten
  4. 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!

    Antworten

Schreibe einen Kommentar