如何通过PowerShell / EWS访问Exchange 2013中“所有文档”文件夹中的电子邮件?

时间:2016-03-23 10:35:33

标签: powershell exchange-server exchangewebservices

将邮件收集数据库从Notes迁移到Exchange后,邮件尚未放入正确的文件夹中。 文件夹已存在但为空,邮件仅通过“所有文档”文件夹显示。 现在我想将结构与正确迁移的数据库副本进行比较,并从中恢复文件夹内容... 为此,我需要访问邮箱中的“所有文档”文件夹 - 如何做到这一点,因为它没有包含在“知名文件夹名称”枚举中?

1 个答案:

答案 0 :(得分:0)

Exchange中没有Al lDocuments文件夹(AFAIK中有注释事项),因此这是您使用的迁移应用程序创建的文件夹,或者您使用http://blog.directionstraining.com/microsoft-outlook/creating-documents-view-outlook之类的内容来创建搜索文件夹来模仿那种行为。因此,根据答案,您将使用的方法与Path中的基本Get-Folder不同(其中路径将基于root的位置,例如,如果所有文档都是根文件夹,则使用'\ All Documents'或如果所有文档都是一个文件夹,它是收件箱的子文件夹,您可以使用'\ Inbox \ All Documents'等

####################### 
<# 
.SYNOPSIS 
 Enumerates Items in a Mailbox folder in a Mailbox using the  Exchange Web Services API 

.DESCRIPTION 
  Enumerates Items in a Mailbox folder in a Mailbox using the  Exchange Web Services API 

 Requires the EWS Managed API from https://www.microsoft.com/en-us/download/details.aspx?id=42951
.EXAMPLE
 PS C:\>Get-FolderItems -MailboxName user.name@domain.com  -FolderPath '\Reporttest'

#> 
function Get-FolderItems
{ 
    [CmdletBinding()] 
    param( 
        [Parameter(Position=0, Mandatory=$true)] [string]$MailboxName,
        [Parameter(Position=1, Mandatory=$true)] [PSCredential]$Credentials,
        [Parameter(Position=2, Mandatory=$true)] [string]$FolderPath
    )  
    Begin
         {
        ## Load Managed API dll  
        ###CHECK FOR EWS MANAGED API, IF PRESENT IMPORT THE HIGHEST VERSION EWS DLL, ELSE EXIT
        $EWSDLL = (($(Get-ItemProperty -ErrorAction SilentlyContinue -Path Registry::$(Get-ChildItem -ErrorAction SilentlyContinue -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange\Web Services'|Sort-Object Name -Descending| Select-Object -First 1 -ExpandProperty Name)).'Install Directory') + "Microsoft.Exchange.WebServices.dll")
        if (Test-Path $EWSDLL)
            {
            Import-Module $EWSDLL
            }
        else
            {
            "$(get-date -format yyyyMMddHHmmss):"
            "This script requires the EWS Managed API 1.2 or later."
            "Please download and install the current version of the EWS Managed API from"
            "http://go.microsoft.com/fwlink/?LinkId=255472"
            ""
            "Exiting Script."
            exit
            } 

        ## Set Exchange Version  
        $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2  

        ## Create Exchange Service Object  
        $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)  

        ## Set Credentials to use two options are availible Option1 to use explict credentials or Option 2 use the Default (logged On) credentials  

        #Credentials Option 1 using UPN for the windows Account  
        #$psCred = Get-Credential  
        $creds = New-Object System.Net.NetworkCredential($Credentials.UserName.ToString(),$Credentials.GetNetworkCredential().password.ToString())  
        $service.Credentials = $creds      
        #Credentials Option 2  
        #service.UseDefaultCredentials = $true  
         #$service.TraceEnabled = $true
        ## Choose to ignore any SSL Warning issues caused by Self Signed Certificates  

        ## Code From http://poshcode.org/624
        ## Create a compilation environment
        $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider
        $Compiler=$Provider.CreateCompiler()
        $Params=New-Object System.CodeDom.Compiler.CompilerParameters
        $Params.GenerateExecutable=$False
        $Params.GenerateInMemory=$True
        $Params.IncludeDebugInformation=$False
        $Params.ReferencedAssemblies.Add("System.DLL") | Out-Null

$TASource=@'
  namespace Local.ToolkitExtensions.Net.CertificatePolicy{
    public class TrustAll : System.Net.ICertificatePolicy {
      public TrustAll() { 
      }
      public bool CheckValidationResult(System.Net.ServicePoint sp,
        System.Security.Cryptography.X509Certificates.X509Certificate cert, 
        System.Net.WebRequest req, int problem) {
        return true;
      }
    }
  }
'@ 
        $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
        $TAAssembly=$TAResults.CompiledAssembly

        ## We now create an instance of the TrustAll and attach it to the ServicePointManager
        $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
        [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll

        ## end code from http://poshcode.org/624

        ## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use  

        #CAS URL Option 1 Autodiscover  
        $service.AutodiscoverUrl($MailboxName,{$true})  
        "Using CAS Server : " + $Service.url   

        #CAS URL Option 2 Hardcoded  

        #$uri=[system.URI] "https://casservername/ews/exchange.asmx"  
        #$service.Url = $uri    

        ## Optional section for Exchange Impersonation  

        #$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName) 

        $fldId = FolderIdFromPath -FolderPath $FolderPath  -SmtpAddress $MailboxName
        $SubFolderId =  new-object Microsoft.Exchange.WebServices.Data.FolderId($fldId)


        #Define ItemView to retrive just 1000 Items    
        $ivItemView =  New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000) 
        $PR_RETENTION_DATE = New-Object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x301C,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::SystemTime); 
        $ItemPropset= new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
        $ItemPropset.Add($PR_RETENTION_DATE);
        $ivItemView.PropertySet = $ItemPropset
        $rptCollection = @{}
        $fiItems = $null    
        do{    
            $fiItems = $service.FindItems($SubFolderId,$ivItemView)    
            #[Void]$service.LoadPropertiesForItems($fiItems,$psPropset)  
            foreach($Item in $fiItems.Items){      
                #Process Item
                Write-Host $Item.Subject
            }    
            $ivItemView.Offset += $fiItems.Items.Count    
        }while($fiItems.MoreAvailable -eq $true)    
        }
}
function FolderIdFromPath{
    param (
            $FolderPath = "$( throw 'Folder Path is a mandatory Parameter' )",
            $SmtpAddress = "$( throw 'Folder Path is a mandatory Parameter' )"
          )
    process{
        ## Find and Bind to Folder based on Path  
        #Define the path to search should be seperated with \  
        #Bind to the MSGFolder Root  
        $folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$SmtpAddress)   
        $tfTargetFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)  
        #Split the Search path into an array  
        $fldArray = $FolderPath.Split("\") 
         #Loop through the Split Array and do a Search for each level of folder 
        for ($lint = 1; $lint -lt $fldArray.Length; $lint++) { 
            #Perform search based on the displayname of each folder level 
            $fvFolderView = new-object Microsoft.Exchange.WebServices.Data.FolderView(1) 
            $SfSearchFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$fldArray[$lint]) 
            $findFolderResults = $service.FindFolders($tfTargetFolder.Id,$SfSearchFilter,$fvFolderView) 
            if ($findFolderResults.TotalCount -gt 0){ 
                foreach($folder in $findFolderResults.Folders){ 
                    $tfTargetFolder = $folder                
                } 
            } 
            else{ 
                "Error Folder Not Found"  
                $tfTargetFolder = $null  
                break  
            }     
        }  
        if($tfTargetFolder -ne $null){
            return $tfTargetFolder.Id.UniqueId.ToString()
        }
        else{
            throw "Folder not found"
        }
    }
}

干杯 格伦