PowerShell API-Wrapper Tutorial: Unterschied zwischen den Versionen

[unmarkierte Version][unmarkierte Version]
Zeile 4: Zeile 4:
 
Dieses Tutorial erläutert anhand einfacher Beispiele den Umgang mit der [[MailStore Server Administration API]] mittels Windows PowerShell Skripten. Grundlegende MailStore Server, Windows und PowerShell Kenntnisse werden dabei vorausgesetzt.
 
Dieses Tutorial erläutert anhand einfacher Beispiele den Umgang mit der [[MailStore Server Administration API]] mittels Windows PowerShell Skripten. Grundlegende MailStore Server, Windows und PowerShell Kenntnisse werden dabei vorausgesetzt.
  
<p class=msnote>'''Hinweis:''' Es wird empfohlen, für dieses Tutorial und grundsätzlich für die Skriptentwicklung eine eigene, nicht produktive Instanz von MailStore Server in einer Testumgebung zu verwenden, um Probleme und Datenverluste in der Produktivumgebung zu vermeiden. Hierfür eignet sich z.B. die voll funktionsfähige, 30-Tage-Testversion von MailStore Server.</p>
+
<p class=msnote>'''Hinweis:''' Es wird empfohlen, für dieses Tutorial und grundsätzlich für die Skriptentwicklung eine eigene, nicht produktive Installation von MailStore Server in einer Testumgebung zu verwenden, um Probleme und Datenverluste in der Produktivumgebung zu vermeiden. Hierfür eignet sich z.B. die voll funktionsfähige, 30-Tage-Testversion von MailStore Server.</p>
  
 
= Installation der benötigten Komponenten =
 
= Installation der benötigten Komponenten =
Zeile 10: Zeile 10:
 
Die gezeigten Beispiele nutzen den MailStore PowerShell API Wrapper und sind wie dieser auf Windows PowerShell ab Version 3.0 lauffähig. Abhängig von der verwendeten Windows Version muss eine kompatible PowerShell Version zunächst heruntergeladen und installiert werden. Die für das Tutorial benötigten Komponenten finden Sie hier:
 
Die gezeigten Beispiele nutzen den MailStore PowerShell API Wrapper und sind wie dieser auf Windows PowerShell ab Version 3.0 lauffähig. Abhängig von der verwendeten Windows Version muss eine kompatible PowerShell Version zunächst heruntergeladen und installiert werden. Die für das Tutorial benötigten Komponenten finden Sie hier:
  
[[Media:MailStorePSAPIWrapper.zip?|MailStore PowerShell API Wrapper]]<br/>
+
* [[Media:MailStorePSAPIWrapper.zip?|MailStore PowerShell API Wrapper]]
[[Media:MailStorePSTutorialScripts.zip?|MailStore PowerShell Tutorial Beispielskripte]]<br/>
+
* [[Media:MailStorePSTutorialScripts.zip?|MailStore PowerShell Tutorial Beispielskripte]]
[https://my.mailstore.com/TrialLicense/RequestForm?lang=de 30-Tage-Testversion von MailStore Server]<br/>
+
* [http://www.microsoft.com/en-us/download/details.aspx?id=34595 Windows Management Framework 3.0] (enthält die PowerShell 3.0)
[http://www.microsoft.com/en-us/download/details.aspx?id=34595 Windows Management Framework 3.0] (enthält die PowerShell 3.0)<br/>
+
* [http://www.microsoft.com/de-de/download/details.aspx?id=40855 Windows Management Framework 4.0] (alternativ, enthält die PowerShell 4.0)
[http://www.microsoft.com/de-de/download/details.aspx?id=40855 Windows Management Framework 4.0] (alternativ, enthält die PowerShell 4.0)
 
  
 
Bitte beachten Sie auch die Systemvoraussetzungen und Hinweise zur jeweiligen Version des Windows Management Frameworks.
 
Bitte beachten Sie auch die Systemvoraussetzungen und Hinweise zur jeweiligen Version des Windows Management Frameworks.
  
<p class=msnote><span style="color:red">'''Wichtiger Hinweis:'''</span> Die Installation eines Windows Management Frameworks wird auf Systemen, welche eine bestimmte PowerShell Version voraussetzen und erweitern, wie beispielsweise Microsoft Exchange Server, nicht unterstützt und kann die Funktion dieser Systeme massiv beeinträchtigen oder zum Erliegen bringen.</p>
+
<p class=mswarning>'''Wichtiger Hinweis:''' Die Installation eines Windows Management Frameworks wird auf Systemen, welche eine bestimmte PowerShell Version voraussetzen und erweitern, wie beispielsweise Microsoft Exchange Server, nicht unterstützt und kann die Funktion dieser Systeme massiv beeinträchtigen oder zum Erliegen bringen.</p>
  
 
Nach dem Herunterladen und ggf. der Installation der PowerShell entpacken Sie bitte den MailStore PowerShell API Wrapper und die Beispielskripte (standardmäßig nach ''C:\MailStore Scripting Tutorial\PowerShell\'').
 
Nach dem Herunterladen und ggf. der Installation der PowerShell entpacken Sie bitte den MailStore PowerShell API Wrapper und die Beispielskripte (standardmäßig nach ''C:\MailStore Scripting Tutorial\PowerShell\'').
 +
 +
'''Hinweis:''' Der MailStore PowerShell API Wrapper und die Beispielskripte sind nicht digital signiert. Daher muss zunächst die Ausführung solcher Skripte in einer administrativen PowerShell Session mittels
 +
 +
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
 +
  Set-ExecutionPolicy -ExecutionPolicy Unrestricted
 +
</source>
 +
 +
zugelassen werden.
  
 
= Einbinden des MailStore PowerShell API Wrappers =
 
= Einbinden des MailStore PowerShell API Wrappers =
Zeile 27: Zeile 34:
  
 
Öffnen Sie eine PowerShell Session und binden Sie das API Wrapper Modul mit folgenden Befehl ein:
 
Öffnen Sie eine PowerShell Session und binden Sie das API Wrapper Modul mit folgenden Befehl ein:
<pre>Import-Module "C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1"</pre>
 
  
<div style="border:1px solid gray; padding:6px 10px 6px 10px; margin:0px 0px 12px 0px">'''Hinweis:''' Der MailStore PowerShell API Wrapper und die Beispielskripte sind nicht digital signiert. Daher muss zunächst die Ausführung solcher Skripte in einer administrativen PowerShell Session mittels
+
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
<pre>Set-ExecutionPolicy -ExecutionPolicy Unrestricted</pre>
+
  Import-Module "C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1"
zugelassen werden.</div>
+
</source>
  
 
== Informationen zum MailStore PowerShell API Wrapper abrufen ==
 
== Informationen zum MailStore PowerShell API Wrapper abrufen ==
  
 
Der MailStore PowerShell API Wrapper stellt einige Funktionen und Variablen zur Verfügung, um gemäß PowerShell Konventionen auf die MailStore Server Administration API zugreifen zu können. Geben Sie folgenden Befehl ein, um Informationen hierüber abzurufen:
 
Der MailStore PowerShell API Wrapper stellt einige Funktionen und Variablen zur Verfügung, um gemäß PowerShell Konventionen auf die MailStore Server Administration API zugreifen zu können. Geben Sie folgenden Befehl ein, um Informationen hierüber abzurufen:
<pre>Get-Module MSS.PS.Lib|fl</pre>
+
 
 +
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
 +
  Get-Module MSS.PS.Lib | fl
 +
</source>
 +
 
 
Mittels der Eigenschaften des Moduls kann man noch detailliertere Informationen abrufen. Beispielsweise gibt
 
Mittels der Eigenschaften des Moduls kann man noch detailliertere Informationen abrufen. Beispielsweise gibt
<pre>(Get-Module MSS.PS.Lib).ExportedVariables</pre>
+
 
 +
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
 +
  (Get-Module MSS.PS.Lib).ExportedVariables
 +
</source>
 +
 
 
die zur Verfügung gestellten Variablen des Moduls zurück.<br/>
 
die zur Verfügung gestellten Variablen des Moduls zurück.<br/>
 
Mittels  
 
Mittels  
<pre>Get-Help</pre>  
+
 
 +
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
 +
  Get-Help
 +
</source>
 +
 
 
stellt der MailStore PowerShell API Wrapper für seine Funktionen Inline-Hilfen (nur auf Englisch verfügbar) bereit.
 
stellt der MailStore PowerShell API Wrapper für seine Funktionen Inline-Hilfen (nur auf Englisch verfügbar) bereit.
  
Zeile 47: Zeile 65:
  
 
Anhand des folgenden Beispielskripts soll die grundlegende Verwendung der MailStore PowerShell API Wrapper Funktionen veranschaulicht werden. Dieses Skript finden Sie im Beispielskriptpaket als ''Example1.ps1''.
 
Anhand des folgenden Beispielskripts soll die grundlegende Verwendung der MailStore PowerShell API Wrapper Funktionen veranschaulicht werden. Dieses Skript finden Sie im Beispielskriptpaket als ''Example1.ps1''.
<pre>Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
+
 
$mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
+
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
$return = Invoke-MSSApiCall $mssapiclient "GetServerInfo"
+
  Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
$return|fl</pre>
+
  $mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
Die Funktion ''New-MSSApiClient'' erstellt ein neues API-Client-Objekt, welches dann für API Calls mittels ''Invoke-MSSApiCall'' verwendet werden. Die im Skript angegebenen Werte für die Parameter ''-Username, -Password, -MailStoreServer, -Port'' und ''-Code'' sind die Standardwerte der Funktion, nur der Schalter ''-IgnoreInvalidSSLCerts'' muss bei Verwendung von nicht-vertrauten Zertifikaten explizit angegeben werden, ansonsten kommt es zu einer Fehlermeldung.<br/>
+
  $return = Invoke-MSSApiCall $mssapiclient "GetServerInfo"
 +
  $return | fl
 +
</source>
 +
 
 +
Die Funktion ''New-MSSApiClient'' erstellt ein neues API-Client-Objekt, welches dann für API Calls mittels ''Invoke-MSSApiCall'' verwendet werden. Die im Skript angegebenen Werte für die Parameter ''-Username, -Password, -MailStoreServer, -Port'' und ''-Code'' sind die Standardwerte der Funktion, nur der Schalter ''-IgnoreInvalidSSLCerts'' muss bei Verwendung von nicht-vertrauten Zertifikaten explizit angegeben werden, ansonsten kommt es zu einer Fehlermeldung.
 +
 
 
''Invoke-MSSApiCall'' benötigt neben dem API-Client-Objekt einen [[MailStore_Server_Administration_API_Commands|API Befehl]] und ggf. dessen Parameter. Der Befehl ''[[MailStore_Server_Administration_API_Commands#GetServerInfo|GetServerInfo]]'' im Skript benötigt keine weiteren Parameter und liefert ein Objekt in folgender Form zurück:
 
''Invoke-MSSApiCall'' benötigt neben dem API-Client-Objekt einen [[MailStore_Server_Administration_API_Commands|API Befehl]] und ggf. dessen Parameter. Der Befehl ''[[MailStore_Server_Administration_API_Commands#GetServerInfo|GetServerInfo]]'' im Skript benötigt keine weiteren Parameter und liefert ein Objekt in folgender Form zurück:
  
<pre>Type  : JSON
+
  Type  : JSON
Token :  
+
  Token :  
Data  : @{version=8.1.2.9268; machineName=DEMO}</pre>
+
  Data  : @{version=8.1.2.9268; machineName=DEMO}
 +
 
 +
Die ''Type'' Eigenschaft des Objekts entspricht dabei entweder dem ''-Code'' Parameter des API-Client-Objekt ("JSON" oder "XML"), oder enthält für asynchron ausgeführte API-Befehle den Wert "JOB" (s.u.) und charakterisiert den Typ des in der ''Data'' Eigenschaft enthaltenen Objekts. Die ''Token'' Eigenschaft ist ebenfalls nur für asynchron ausgeführte API-Befehle relevant.
  
Die ''Type'' Eigenschaft des Objekts entspricht dabei entweder dem ''-Code'' Parameter des API-Client-Objekt ("JSON" oder "XML"), oder enthält für asynchron ausgeführte API-Befehle den Wert "JOB" (s.u.) und charakterisiert den Typ des in der ''Data'' Eigenschaft enthaltenen Objekts. Die ''Token'' Eigenschaft ist ebenfalls nur für asynchron ausgeführte API-Befehle relevant.<br/>
 
 
In der ''Data'' Eigenschaft befindet sich das vom MailStore Server zurückgelieferte Ergebnis, hier als JSON Objekt:
 
In der ''Data'' Eigenschaft befindet sich das vom MailStore Server zurückgelieferte Ergebnis, hier als JSON Objekt:
  
<pre>PS C:\MailStore Scripting Tutorial\PowerShell\Scripts>$return.Data|fl
+
  PS C:\MailStore Scripting Tutorial\PowerShell\Scripts>$return.Data|fl
version    : 8.1.2.9268
+
  version    : 8.1.2.9268
machineName : DEMO</pre>
+
  machineName : DEMO
  
 
== API Wrapper Funktionen mit Parametern aufrufen ==
 
== API Wrapper Funktionen mit Parametern aufrufen ==
  
 
Viele MailStore Server Administration API Befehle erfordern die Angabe von Parametern. Selbstverständlich ist der MailStore PowerShell API Wrapper in der Lage, diese mittels ''Invoke-MSSApiCall'' zu übermitteln. Zur Erläuterung soll das folgende Skript dienen, das im Beispielskriptpaket als ''Example2.ps1'' enthalten ist.
 
Viele MailStore Server Administration API Befehle erfordern die Angabe von Parametern. Selbstverständlich ist der MailStore PowerShell API Wrapper in der Lage, diese mittels ''Invoke-MSSApiCall'' zu übermitteln. Zur Erläuterung soll das folgende Skript dienen, das im Beispielskriptpaket als ''Example2.ps1'' enthalten ist.
<pre>Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
+
 
$mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
+
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
$users = (Invoke-MSSApiCall $mssapiclient "GetUserList").Data
+
  Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
foreach ($user in $users) {(Invoke-MSSApiCall $mssapiclient "GetUserInfo" @{userName = $user.userName}).Data|fl}</pre>
+
  $mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
Das Skript liefert Details über die in MailStore Server angelegten Benutzer zurück und gibt sie als Liste aus. Es macht sich dabei zunutze, dass der MailStore PowerShell API Wrapper die Antworten der MailStore Server Management API direkt in Objekte konvertiert, deren Eigenschaften dann direkt weiterverwendet werden können.<br/>
+
  $users = (Invoke-MSSApiCall $mssapiclient "GetUserList").Data
Der im Skript aufgerufene API Befehl ''[[MailStore_Server_Administration_API_Commands#GetUserInfo|GetUserInfo]]'' erfordert einen Parameter ''userName''. Die Funktion ''Invoke-MSSApiCall'' erwartet Parameter als Hashtable, also z.B. in der Form ''@{Parametername1 = Wert1; Parametername2 = Wert2;...}''. Die Parameternamen sind dabei case sensitive.<br/>
+
  foreach ($user in $users) {(Invoke-MSSApiCall $mssapiclient "GetUserInfo" @{userName = $user.userName}).Data | fl}
 +
</source>
 +
 
 +
Das Skript liefert Details über die in MailStore Server angelegten Benutzer zurück und gibt sie als Liste aus. Es macht sich dabei zunutze, dass der MailStore PowerShell API Wrapper die Antworten der MailStore Server Management API direkt in Objekte konvertiert, deren Eigenschaften dann direkt weiterverwendet werden können.
 +
 
 +
Der im Skript aufgerufene API Befehl ''[[MailStore_Server_Administration_API_Commands#GetUserInfo|GetUserInfo]]'' erfordert einen Parameter ''userName''. Die Funktion ''Invoke-MSSApiCall'' erwartet Parameter als Hashtable, also z.B. in der Form ''@{Parametername1 = Wert1; Parametername2 = Wert2;...}''. Die Parameternamen sind dabei case sensitive.
 +
 
 
Zunächst wird die Liste der MailStore Server Benutzer mittels des API Befehls ''[[MailStore_Server_Administration_API_Commands#GetUserList|GetUserList]]'' abgerufen. Dieser liefert ein Array mit Einträgen folgenden Aufbaus zurück:
 
Zunächst wird die Liste der MailStore Server Benutzer mittels des API Befehls ''[[MailStore_Server_Administration_API_Commands#GetUserList|GetUserList]]'' abgerufen. Dieser liefert ein Array mit Einträgen folgenden Aufbaus zurück:
<pre>userName          : abby.hernandez
+
 
fullName          : Abby Hernandez
+
  userName          : abby.hernandez
distinguishedName : CN=Abby Hernandez,OU=tutorial,DC=example,DC=com</pre>
+
  fullName          : Abby Hernandez
 +
  distinguishedName : CN=Abby Hernandez,OU=tutorial,DC=example,DC=com
 +
 
 
Über diese Einträge wird nun iteriert und dabei die ''userName'' Eigenschaft jedes Eintrags als Parameter des API Befehls ''[[MailStore_Server_Administration_API_Commands#GetUserInfo|GetUserInfo]]'' verwendet. Das Ergebnis für den o.g. Eintrag sieht wie folgt aus:
 
Über diese Einträge wird nun iteriert und dabei die ''userName'' Eigenschaft jedes Eintrags als Parameter des API Befehls ''[[MailStore_Server_Administration_API_Commands#GetUserInfo|GetUserInfo]]'' verwendet. Das Ergebnis für den o.g. Eintrag sieht wie folgt aus:
<pre>userName            : abby.hernandez
+
 
fullName            : Abby Hernandez
+
  userName            : abby.hernandez
distinguishedName  : CN=Abby Hernandez,OU=tutorial,DC=example,DC=com
+
  fullName            : Abby Hernandez
authentication      : directoryServices
+
  distinguishedName  : CN=Abby Hernandez,OU=tutorial,DC=example,DC=com
emailAddresses      : {[email protected]}
+
  authentication      : directoryServices
pop3UserNames      : {}
+
  emailAddresses      : {[email protected]}
privileges          : {login}
+
  pop3UserNames      : {}
privilegesOnFolders : {@{folder=abby.hernandez; privileges=System.Object[]}}</pre>
+
  privileges          : {login}
 +
  privilegesOnFolders : {@{folder=abby.hernandez; privileges=System.Object[]}}
 +
 
 
An der ''privilegesOnFolders'' Eigenschaft ist gut erkennbar, dass die zurückgegebenen Objekte durchaus tiefer verschachtelt sein und ihrerseits weitere Objekte enthalten können.
 
An der ''privilegesOnFolders'' Eigenschaft ist gut erkennbar, dass die zurückgegebenen Objekte durchaus tiefer verschachtelt sein und ihrerseits weitere Objekte enthalten können.
  
Zeile 92: Zeile 126:
  
 
MailStore Server Administration API-Befehle, deren Ausführung typischerweise länger dauert, werden vom Server asynchron ausgeführt. Der MailStore PowerShell API Wrapper erkennt den Aufruf dieser [[MailStore_Server_Administration_API#Asynchron_ausgef.C3.BChrte_Befehle|asynchron ausgeführten API Befehle]] und führt diese als [http://technet.microsoft.com/en-us/library/hh847783%28v=wps.620%29.aspx PowerShell Job] im Hintergrund aus. Das Skript ''Example3.ps1'' aus dem Beispielskriptpaket verdeutlicht diese Funktionalität:
 
MailStore Server Administration API-Befehle, deren Ausführung typischerweise länger dauert, werden vom Server asynchron ausgeführt. Der MailStore PowerShell API Wrapper erkennt den Aufruf dieser [[MailStore_Server_Administration_API#Asynchron_ausgef.C3.BChrte_Befehle|asynchron ausgeführten API Befehle]] und führt diese als [http://technet.microsoft.com/en-us/library/hh847783%28v=wps.620%29.aspx PowerShell Job] im Hintergrund aus. Das Skript ''Example3.ps1'' aus dem Beispielskriptpaket verdeutlicht diese Funktionalität:
<pre>Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
+
 
$mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
+
<source lang="powershell" smart-tabs="true" toolbar="false" gutter="false">
$return = invoke-MSSApiCall $mssapiclient "VerifyStore" @{id = "1"}
+
  Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
if ($return.Type -eq "JOB") {
+
  $mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
    Wait-Job $return.Data
+
  $return = invoke-MSSApiCall $mssapiclient "VerifyStore" @{id = "1"}
    Receive-Job $return.Data
+
  if ($return.Type -eq "JOB") {
} else {
+
      Wait-Job $return.Data
    $return.Data
+
      Receive-Job $return.Data
}</pre>
+
  } else {
 +
      $return.Data
 +
  }
 +
</source>
 +
 
 
Der im Skript aufgerufene API Befehl ''[[MailStore_Server_Administration_API_Commands#VerifyStore|VerifyStore]]'' liefert ein Objekt mit der ''Type'' Eigenschaft "JOB" zurück.
 
Der im Skript aufgerufene API Befehl ''[[MailStore_Server_Administration_API_Commands#VerifyStore|VerifyStore]]'' liefert ein Objekt mit der ''Type'' Eigenschaft "JOB" zurück.
<pre>Type  : JOB
+
 
Token : sa9e8d780329f1e0c59503a2e041f7c72b
+
  Type  : JOB
Data  : System.Management.Automation.PSRemotingJob</pre>
+
  Token : sa9e8d780329f1e0c59503a2e041f7c72b
Im Unterschied zu den Rückgabeobjekten bei synchron ausgeführten API Befehlen ist hier die ''Token'' Eigenschaft gesetzt, sie enthält eine vom Server zurückgegebene, eindeutige ID des Serverprozesses. Die ''Data'' Eigenschaft enthält den PowerShell Job, der im Hintergrund die vom Server zurückgelieferten Statusobjekte verarbeitet. Dieser
+
  Data  : System.Management.Automation.PSRemotingJob
 +
 
 +
Im Unterschied zu den Rückgabeobjekten bei synchron ausgeführten API Befehlen ist hier die ''Token'' Eigenschaft gesetzt, sie enthält eine vom Server zurückgegebene, eindeutige ID des Serverprozesses. Die ''Data'' Eigenschaft enthält den PowerShell Job, der im Hintergrund die vom Server zurückgelieferten Statusobjekte verarbeitet.
  
 
== API Wrapper PowerShell Jobs ==
 
== API Wrapper PowerShell Jobs ==
  
 
Der in der ''Data'' Eigenschaft enthaltene PowerShell Job fragt den Status des zugehörigen Serverprozesses in regelmäßigen Intervallen ab (standardmäßig alle 500 ms) und wird beendet, wenn dieser abgeschlossen ist. Mittels des PowerShell cmdlets [http://technet.microsoft.com/en-us/library/hh849735.aspx Wait-Job] kann ein Skript auf die Fertigstellung des Jobs warten, anschließend kann das Ergebnis des Jobs mittels [http://technet.microsoft.com/en-us/library/hh849718.aspx Receive-Job] abgerufen werden:
 
Der in der ''Data'' Eigenschaft enthaltene PowerShell Job fragt den Status des zugehörigen Serverprozesses in regelmäßigen Intervallen ab (standardmäßig alle 500 ms) und wird beendet, wenn dieser abgeschlossen ist. Mittels des PowerShell cmdlets [http://technet.microsoft.com/en-us/library/hh849735.aspx Wait-Job] kann ein Skript auf die Fertigstellung des Jobs warten, anschließend kann das Ergebnis des Jobs mittels [http://technet.microsoft.com/en-us/library/hh849718.aspx Receive-Job] abgerufen werden:
<pre>Type      : JSON
+
 
Token      :  
+
  Type      : JSON
Data      : @{status=succeeded; progressPercentage=100; messages=System.Collections.ArrayList}
+
  Token      :  
RunspaceId : 2eca1237-4504-4b63-a153-d326adf8c744</pre>
+
  Data      : @{status=succeeded; progressPercentage=100; messages=System.Collections.ArrayList}
 +
  RunspaceId : 2eca1237-4504-4b63-a153-d326adf8c744</pre>
 +
 
 
<p class=msnote>'''Hinweis:''' Die ''RunspaceId'' wird von der PowerShell automatisch erzeugt und kann hier ignoriert werden.</p>
 
<p class=msnote>'''Hinweis:''' Die ''RunspaceId'' wird von der PowerShell automatisch erzeugt und kann hier ignoriert werden.</p>

Version vom 31. Januar 2014, 15:18 Uhr

++ Under construction ++

Dieses Tutorial erläutert anhand einfacher Beispiele den Umgang mit der MailStore Server Administration API mittels Windows PowerShell Skripten. Grundlegende MailStore Server, Windows und PowerShell Kenntnisse werden dabei vorausgesetzt.

Hinweis: Es wird empfohlen, für dieses Tutorial und grundsätzlich für die Skriptentwicklung eine eigene, nicht produktive Installation von MailStore Server in einer Testumgebung zu verwenden, um Probleme und Datenverluste in der Produktivumgebung zu vermeiden. Hierfür eignet sich z.B. die voll funktionsfähige, 30-Tage-Testversion von MailStore Server.

Installation der benötigten Komponenten

Die gezeigten Beispiele nutzen den MailStore PowerShell API Wrapper und sind wie dieser auf Windows PowerShell ab Version 3.0 lauffähig. Abhängig von der verwendeten Windows Version muss eine kompatible PowerShell Version zunächst heruntergeladen und installiert werden. Die für das Tutorial benötigten Komponenten finden Sie hier:

Bitte beachten Sie auch die Systemvoraussetzungen und Hinweise zur jeweiligen Version des Windows Management Frameworks.

Wichtiger Hinweis: Die Installation eines Windows Management Frameworks wird auf Systemen, welche eine bestimmte PowerShell Version voraussetzen und erweitern, wie beispielsweise Microsoft Exchange Server, nicht unterstützt und kann die Funktion dieser Systeme massiv beeinträchtigen oder zum Erliegen bringen.

Nach dem Herunterladen und ggf. der Installation der PowerShell entpacken Sie bitte den MailStore PowerShell API Wrapper und die Beispielskripte (standardmäßig nach C:\MailStore Scripting Tutorial\PowerShell\).

Hinweis: Der MailStore PowerShell API Wrapper und die Beispielskripte sind nicht digital signiert. Daher muss zunächst die Ausführung solcher Skripte in einer administrativen PowerShell Session mittels

  Set-ExecutionPolicy -ExecutionPolicy Unrestricted

zugelassen werden.

Einbinden des MailStore PowerShell API Wrappers

Der MailStore PowerShell API Wrapper ist als PowerShell Script Module (MSS.PS.Lib.psm1) implementiert und wird daher über sein Manifest (MSS.PS.Lib.psd1) per Import-Module in eine PowerShell Session eingebunden.

Öffnen Sie eine PowerShell Session und binden Sie das API Wrapper Modul mit folgenden Befehl ein:

  Import-Module "C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1"

Informationen zum MailStore PowerShell API Wrapper abrufen

Der MailStore PowerShell API Wrapper stellt einige Funktionen und Variablen zur Verfügung, um gemäß PowerShell Konventionen auf die MailStore Server Administration API zugreifen zu können. Geben Sie folgenden Befehl ein, um Informationen hierüber abzurufen:

  Get-Module MSS.PS.Lib | fl

Mittels der Eigenschaften des Moduls kann man noch detailliertere Informationen abrufen. Beispielsweise gibt

  (Get-Module MSS.PS.Lib).ExportedVariables

die zur Verfügung gestellten Variablen des Moduls zurück.
Mittels

  Get-Help

stellt der MailStore PowerShell API Wrapper für seine Funktionen Inline-Hilfen (nur auf Englisch verfügbar) bereit.

Verwendung der API Wrapper Funktionen

Anhand des folgenden Beispielskripts soll die grundlegende Verwendung der MailStore PowerShell API Wrapper Funktionen veranschaulicht werden. Dieses Skript finden Sie im Beispielskriptpaket als Example1.ps1.

  Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
  $mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
  $return = Invoke-MSSApiCall $mssapiclient "GetServerInfo"
  $return | fl

Die Funktion New-MSSApiClient erstellt ein neues API-Client-Objekt, welches dann für API Calls mittels Invoke-MSSApiCall verwendet werden. Die im Skript angegebenen Werte für die Parameter -Username, -Password, -MailStoreServer, -Port und -Code sind die Standardwerte der Funktion, nur der Schalter -IgnoreInvalidSSLCerts muss bei Verwendung von nicht-vertrauten Zertifikaten explizit angegeben werden, ansonsten kommt es zu einer Fehlermeldung.

Invoke-MSSApiCall benötigt neben dem API-Client-Objekt einen API Befehl und ggf. dessen Parameter. Der Befehl GetServerInfo im Skript benötigt keine weiteren Parameter und liefert ein Objekt in folgender Form zurück:

 Type  : JSON
 Token : 
 Data  : @{version=8.1.2.9268; machineName=DEMO}

Die Type Eigenschaft des Objekts entspricht dabei entweder dem -Code Parameter des API-Client-Objekt ("JSON" oder "XML"), oder enthält für asynchron ausgeführte API-Befehle den Wert "JOB" (s.u.) und charakterisiert den Typ des in der Data Eigenschaft enthaltenen Objekts. Die Token Eigenschaft ist ebenfalls nur für asynchron ausgeführte API-Befehle relevant.

In der Data Eigenschaft befindet sich das vom MailStore Server zurückgelieferte Ergebnis, hier als JSON Objekt:

 PS C:\MailStore Scripting Tutorial\PowerShell\Scripts>$return.Data|fl
 version     : 8.1.2.9268
 machineName : DEMO

API Wrapper Funktionen mit Parametern aufrufen

Viele MailStore Server Administration API Befehle erfordern die Angabe von Parametern. Selbstverständlich ist der MailStore PowerShell API Wrapper in der Lage, diese mittels Invoke-MSSApiCall zu übermitteln. Zur Erläuterung soll das folgende Skript dienen, das im Beispielskriptpaket als Example2.ps1 enthalten ist.

  Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
  $mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
  $users = (Invoke-MSSApiCall $mssapiclient "GetUserList").Data
  foreach ($user in $users) {(Invoke-MSSApiCall $mssapiclient "GetUserInfo" @{userName = $user.userName}).Data | fl}

Das Skript liefert Details über die in MailStore Server angelegten Benutzer zurück und gibt sie als Liste aus. Es macht sich dabei zunutze, dass der MailStore PowerShell API Wrapper die Antworten der MailStore Server Management API direkt in Objekte konvertiert, deren Eigenschaften dann direkt weiterverwendet werden können.

Der im Skript aufgerufene API Befehl GetUserInfo erfordert einen Parameter userName. Die Funktion Invoke-MSSApiCall erwartet Parameter als Hashtable, also z.B. in der Form @{Parametername1 = Wert1; Parametername2 = Wert2;...}. Die Parameternamen sind dabei case sensitive.

Zunächst wird die Liste der MailStore Server Benutzer mittels des API Befehls GetUserList abgerufen. Dieser liefert ein Array mit Einträgen folgenden Aufbaus zurück:

 userName          : abby.hernandez
 fullName          : Abby Hernandez
 distinguishedName : CN=Abby Hernandez,OU=tutorial,DC=example,DC=com

Über diese Einträge wird nun iteriert und dabei die userName Eigenschaft jedes Eintrags als Parameter des API Befehls GetUserInfo verwendet. Das Ergebnis für den o.g. Eintrag sieht wie folgt aus:

 userName            : abby.hernandez
 fullName            : Abby Hernandez
 distinguishedName   : CN=Abby Hernandez,OU=tutorial,DC=example,DC=com
 authentication      : directoryServices
 emailAddresses      : {[email protected]}
 pop3UserNames       : {}
 privileges          : {login}
 privilegesOnFolders : {@{folder=abby.hernandez; privileges=System.Object[]}}

An der privilegesOnFolders Eigenschaft ist gut erkennbar, dass die zurückgegebenen Objekte durchaus tiefer verschachtelt sein und ihrerseits weitere Objekte enthalten können.

API Wrapper Funktionen für asynchron ausgeführte API Befehle aufrufen

MailStore Server Administration API-Befehle, deren Ausführung typischerweise länger dauert, werden vom Server asynchron ausgeführt. Der MailStore PowerShell API Wrapper erkennt den Aufruf dieser asynchron ausgeführten API Befehle und führt diese als PowerShell Job im Hintergrund aus. Das Skript Example3.ps1 aus dem Beispielskriptpaket verdeutlicht diese Funktionalität:

  Import-Module 'C:\MailStore Scripting Tutorial\PowerShell\API-Wrapper\MSS.PS.Lib.psd1'
  $mssapiclient = New-MSSApiClient -Username admin -Password admin -MailStoreServer localhost -Port 8463 -Code JSON -IgnoreInvalidSSLCerts
  $return = invoke-MSSApiCall $mssapiclient "VerifyStore" @{id = "1"}
  if ($return.Type -eq "JOB") {
      Wait-Job $return.Data
      Receive-Job $return.Data
  } else {
      $return.Data
  }

Der im Skript aufgerufene API Befehl VerifyStore liefert ein Objekt mit der Type Eigenschaft "JOB" zurück.

 Type  : JOB
 Token : sa9e8d780329f1e0c59503a2e041f7c72b
 Data  : System.Management.Automation.PSRemotingJob

Im Unterschied zu den Rückgabeobjekten bei synchron ausgeführten API Befehlen ist hier die Token Eigenschaft gesetzt, sie enthält eine vom Server zurückgegebene, eindeutige ID des Serverprozesses. Die Data Eigenschaft enthält den PowerShell Job, der im Hintergrund die vom Server zurückgelieferten Statusobjekte verarbeitet.

API Wrapper PowerShell Jobs

Der in der Data Eigenschaft enthaltene PowerShell Job fragt den Status des zugehörigen Serverprozesses in regelmäßigen Intervallen ab (standardmäßig alle 500 ms) und wird beendet, wenn dieser abgeschlossen ist. Mittels des PowerShell cmdlets Wait-Job kann ein Skript auf die Fertigstellung des Jobs warten, anschließend kann das Ergebnis des Jobs mittels Receive-Job abgerufen werden:

 Type       : JSON
 Token      : 
 Data       : @{status=succeeded; progressPercentage=100; messages=System.Collections.ArrayList}

RunspaceId : 2eca1237-4504-4b63-a153-d326adf8c744

Hinweis: Die RunspaceId wird von der PowerShell automatisch erzeugt und kann hier ignoriert werden.