EWS Managed API Demo: Impersonation

Hallo zusammen,

Ich habe mich die letzten Tage ein bisschen mit dem Exchange Web Service Managed API beschäftigt. Dabei habe ich mit Visual Basic 2008 Express und Powershell herumgetüftelt. Die grösste Herausforderung war jeweils funktionierenden Code von Visual Basic nach Powershell zu portieren.

Will man auf andere Mailboxen zugreifen benötigt man Impersonation.
Das ist unter folgenden URLs Dokumentiert:

 

Damit Impersonation genutzt werden kann muss die Rolle "ApplicationImpersonation" zugewiesen werden

New-ManagementRoleAssignment –Name:EWServiceImpersonation –Role:ApplicationImpersonation –User:ewservice

Welche Accounts denn für ApplicationIpersonation berechtigt sind, kann man mit folgendem Befehl abfragen

Get-ManagementRoleAssignment -Role ApplicationImpersonation

Aber man kann es auch einfacher per ECP machen

So sieht die Ordnerstruktur des Benutzers "boa" in Outlook aus.

Ich habe nun ein Powershell Script geschrieben, welches sich über einen Account an EWS anmeldet, ein Impersonate auf die Mailbox boa@icewolf.ch macht und dann dort die Folder ausliest.

###############################################################################
# EWS Impersonation
# EWS Managed API DEMO
# Version 1.0 / 15.07.2012
# Andres Bohren / www.icewolf.ch / blog.icewolf.ch / info@icewolf.ch
###############################################################################

 

###############################################################################
# Function WriteLog
###############################################################################
Function WriteLog {
 PARAM (
 [string]$pLogtext
 )
 
    $pDate =  $(get-date -format "dd.MM.yyyy HH:mm:ss")
      
    $sw = new-object system.IO.StreamWriter($LogPath, 1)
    $sw.writeline($pDate + " " + $pLogtext)
    $sw.close()


}

###############################################################################
# Function GetMailboxFolders
###############################################################################

Function GetMailboxFolders
{

 
      Try {
     
            #$pMBXFolders = new-Object system.collections.arraylist
            $pMBXFolders = @()
     
            $View = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1000)
           
            $psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::IdOnly)
            $psPropertySet.Add([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName)
            $psPropertySet.Add([Microsoft.Exchange.WebServices.Data.FolderSchema]::ChildFolderCount)

            $View.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep          
            $View.PropertySet = $psPropertySet                                        
           
            $ExResult = $EWService.FindFolders([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot, $View)
           
            If ($ExResult -ne $Null)           
            {
                Write-Host ("#Get Folders")
                WriteLog ("#Get Folders")

                ForEach ($myFolder In $ExResult.Folders)
                {
                    #Write-Host ("Folder: " + $myFolder.DisplayName)
                    #Write-Host ("Folder: " + $myFolder.Id)                   
                    WriteLog ("Folder: " + $myFolder.DisplayName)
                    Writelog ("Folder: " + $myFolder.Id)
                    $pMBXFolders += $myFolder.DisplayName
                    #$pMBXFolders += $myFolder.ID
                }
            }
   
        return ,$pMBXFolders

      } catch [system.exception] {
            WriteLog ("Error in GetMailboxFolders " + $_.Exception.ToString())
            Write-Host ("Error in GetMailboxFolders " + $_.Exception.ToString())
      }

}

 

###############################################################################
# MainProgramm
###############################################################################

# Global Vars
[string]$EwsApiDll = "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"
[string]$LogPath = "T:\Visual Basic\PowerShell\EWSScript\Impersonate.log"

[string]$Email = "ewservice@icewolf.ch"
[string]$Username = "ewservice"
[string]$Password = "MySecretPassword!"
[string]$Domain = "Corp"
[string]$EWSURL = ""
#[string]$EWSURL = "https://icesrv01/EWS/Exchange.asmx"
#[string]$EWSURL = "https://icesrv01.corp.icewolf.ch/EWS/Exchange.asmx"
[string]$ImpersonationMailbox = "boa@icewolf.ch"


# Main Programm

Try {
        WriteLog "###############################################################################"
        WriteLog "### Starting Script"
        WriteLog "###############################################################################"

        # Import EWS Managed API DLL
        Import-Module -Name $EwsApiDll
        Write-Host ("Imported EWS Module")
        WriteLog ("Imported EWS Module")

        # Connect to EWS
        #$EWService = ConnectEWS ($Email, $Username, $Password, $Domain, $EWSURL)
        # Create a new Exchange Service Object
        $EWService = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
        $EWService.Credentials = new-object Microsoft.Exchange.WebServices.Data.WebCredentials($Username,$Password,$Domain)

        Write-Host ("Connecting to EWS...")
        WriteLog ("Connecting to EWS...")

        If ($EWSURL -eq "")
            {
                $EWService.AutodiscoverUrl($Email)
                Write-Host ("Using Autodiscover")
            } else {
                $EWService.Url = $EWSURL
                Write-Host ("Using EWS URL")
            }

 

            $Mailbox = $ImpersonationMailbox
            Write-Host ("-->Impersonation to Mailbox: " + $Mailbox)
            Writelog ("-->Impersonation to Mailbox: " + $Mailbox)
               
            $EWService.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $Mailbox)
           
            # Get Mailbox Folders
            $Folders = GetMailboxFolders

            Foreach ($Folder in $Folders)
                {
                    Write-Host ("Folder: "  + $Folder)
                    WriteLog ("Folder: "  + $Folder)
                }
            
                 
        # Clean Up
        WriteLog "###############################################################################"
        WriteLog "### Finished"
        WriteLog "###############################################################################"
        Write-Host "Finished"


    } catch [system.exception] {
        WriteLog ("Error in EmptyRecycleBin " + $_.Exception.ToString())
        Write-Host ("Error in EmptyRecycleBin " + $_.Exception.ToString())       
}

Und so sieht dann das Resultat aus.

Ausserdem wird gleich noch ein Logfile geschrieben. Das sieht dann so aus:

15.07.2012 13:04:43 ###############################################################################
15.07.2012 13:04:43 ### Starting Script
15.07.2012 13:04:43 ###############################################################################
15.07.2012 13:04:43 Imported EWS Module
15.07.2012 13:04:43 Connecting to EWS...
15.07.2012 13:04:46 -->Impersonation to Mailbox: boa@icewolf.ch
15.07.2012 13:04:47 #Get Folders
15.07.2012 13:04:47 Folder: _PST
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAjDIRsWb/VU+BJt9qgqUltwB4Q4TyBwAAAA==
15.07.2012 13:04:47 Folder: Aufgaben
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUEAAAAA==
15.07.2012 13:04:47 Folder: Conversation Action Settings
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUQwAAAA==
15.07.2012 13:04:47 Folder: Conversation History
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAjDIRsWb/VU+BJt9qgqUltwBANX9yBQAAAA==
15.07.2012 13:04:47 Folder: Entwürfe
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUDQAAAA==
15.07.2012 13:04:47 Folder: Gelöschte Elemente
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUBQAAAA==
15.07.2012 13:04:47 Folder: Gesendete Elemente
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUBAAAAA==
15.07.2012 13:04:47 Folder: Journal
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUDgAAAA==
15.07.2012 13:04:47 Folder: Junk-E-Mail
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUPgAAAA==
15.07.2012 13:04:47 Folder: Kalender
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUCwAAAA==
15.07.2012 13:04:47 Folder: Kontakte
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUDAAAAA==
15.07.2012 13:04:47 Folder: News Feed
15.07.2012 13:04:47 Folder: AAMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAAAAABIq58V06LORaUfvgNEQGdQAQCwyub+CRSHTK7nGgLlXlbrAAAncbGHAAA=
15.07.2012 13:04:47 Folder: Notizen
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUDwAAAA==
15.07.2012 13:04:47 Folder: Postausgang
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUAwAAAA==
15.07.2012 13:04:47 Folder: Posteingang
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQrUAgAAAA==
15.07.2012 13:04:47 Folder: Inbox1
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAjDIRsWb/VU+BJt9qgqUltwB4Q4TyBQAAAA==
15.07.2012 13:04:47 Folder: Inbox2
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAjDIRsWb/VU+BJt9qgqUltwB4Q4TyBgAAAA==
15.07.2012 13:04:47 Folder: Quick Step Settings
15.07.2012 13:04:47 Folder: AAMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAAAAABIq58V06LORaUfvgNEQGdQAQCwyub+CRSHTK7nGgLlXlbrAAAncXRJAAA=
15.07.2012 13:04:47 Folder: RSS-Feeds
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAjDIRsWb/VU+BJt9qgqUltwA/qpJyAQAAAA==
15.07.2012 13:04:47 Folder: Suggested Contacts
15.07.2012 13:04:47 Folder: AAMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAAAAABIq58V06LORaUfvgNEQGdQAQCwyub+CRSHTK7nGgLlXlbrAAAncXRYAAA=
15.07.2012 13:04:47 Folder: Sync Issues
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQsu6AAAAA==
15.07.2012 13:04:47 Folder: Conflicts
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQsu7AAAAA==
15.07.2012 13:04:47 Folder: Local Failures
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQsu8AAAAA==
15.07.2012 13:04:47 Folder: Server Failures
15.07.2012 13:04:47 Folder: AQMkAGM4YTkwYTlkLTcxMzctNDk4YS1hNWZhLWE3ZjEyMWViZmRjZAAuAAADSKufFdOizkWlH74DREBnUAEAsMrm/gkUh0yu5xoC5V5W6wAAAQsu9AAAAA==
15.07.2012 13:04:47 Folder: _PST
15.07.2012 13:04:47 Folder: Aufgaben
15.07.2012 13:04:47 Folder: Conversation Action Settings
15.07.2012 13:04:47 Folder: Conversation History
15.07.2012 13:04:47 Folder: Entwürfe
15.07.2012 13:04:47 Folder: Gelöschte Elemente
15.07.2012 13:04:47 Folder: Gesendete Elemente
15.07.2012 13:04:47 Folder: Journal
15.07.2012 13:04:47 Folder: Junk-E-Mail
15.07.2012 13:04:47 Folder: Kalender
15.07.2012 13:04:47 Folder: Kontakte
15.07.2012 13:04:47 Folder: News Feed
15.07.2012 13:04:47 Folder: Notizen
15.07.2012 13:04:47 Folder: Postausgang
15.07.2012 13:04:47 Folder: Posteingang
15.07.2012 13:04:47 Folder: Inbox1
15.07.2012 13:04:47 Folder: Inbox2
15.07.2012 13:04:47 Folder: Quick Step Settings
15.07.2012 13:04:47 Folder: RSS-Feeds
15.07.2012 13:04:47 Folder: Suggested Contacts
15.07.2012 13:04:47 Folder: Sync Issues
15.07.2012 13:04:47 Folder: Conflicts
15.07.2012 13:04:47 Folder: Local Failures
15.07.2012 13:04:47 Folder: Server Failures
15.07.2012 13:04:47 ###############################################################################
15.07.2012 13:04:47 ### Finished
15.07.2012 13:04:47 ###############################################################################

Damit ihr das nicht abtippen müsst oder sich Fehler beim kopieren einschleichen könnt ihr das Script auch gleich herunterladen.

Grüsse
Andres Bohren