EWS Managed API Demo: Searchfilter

Hallo zusammen,

Nachdem ich mich ein bisschen in die Managed API von EWS eingearbeitet habe, wollte ich nach bestimmten Elementen suchen. Das geht am besten über einen SearchFilter.

Das Kernstück ist hier in untenstehendem Code dargestellt.

#Suche nach Elementen welche eine bestimmte MessageClass aufweisen
$MySearchFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::ItemClass, "IPM.Schedule.Meeting.Resp.Pos")
           
#Suche nach Elementen welche den gesuchten String im Subject enthalten
$MySearchFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::Subject, "TechTalk")

                
$View = New-Object Microsoft.Exchange.WebServices.Data.ItemView(100)             
$ExResult = $EWService.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MySearchFilter,$View)

Also mal schnell so ein Script basteln - kann auch heruntergeladen werden.

###############################################################################
# EWS Searchfilter in Inbox
# 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 SearchInbox
# Searches in Inbox by applying a SearchFilter
###############################################################################

Function SearchInbox
{
 
    Try {
                                  
            #Suche nach Elementen welche eine bestimmte MessageClass aufweisen
            $MySearchFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::ItemClass, "IPM.Schedule.Meeting.Resp.Pos")
           
            #Suche nach Elementen welche den gesuchten String im Subject enthalten
            $MySearchFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::Subject, "TechTalk")

                
            $View = New-Object Microsoft.Exchange.WebServices.Data.ItemView(100)             
            $ExResult = $EWService.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MySearchFilter,$View)
                       
           
            If ($ExResult -ne $Null)           
                {
                Foreach ($Item In $ExResult.Items )
                    {
                        Write-Host ("ITEM Found: subject=" + $Item.Subject + " ItemClass=" +$Item.ItemClass + " LastModifiedTime=" + $Item.LastModifiedTime)
                        WriteLog ("ITEM Found: subject=" + $Item.Subject + " ItemClass=" +$Item.ItemClass + " LastModifiedTime=" + $Item.LastModifiedTime)                       
                    }
                }

     
    } catch [system.exception] {
        WriteLog ("Error: " + $_.Exception.ToString())
        Write-Host ("Error: " + $_.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\EWSSearchFilter.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 = "a.bohren@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)
           
            # Search in Inbox
            SearchInbox
                 

        # 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())       
}

Grüsse
Andres Bohren