【问题标题】:How to access emails in All Documents folder in Exchange 2013 via PowerShell/EWS?如何通过 PowerShell/EWS 访问 Exchange 2013 中所有文档文件夹中的电子邮件?
【发布时间】:2016-07-10 14:26:29
【问题描述】:

将邮件接收数据库从 Notes 迁移到 Exchange 后,邮件未放置在正确的文件夹中。 文件夹存在但为空,邮件仅通过“所有文档”文件夹显示。 现在我想将结构与正确迁移的数据库副本进行比较,并从中恢复文件夹 Contents ... 为此,我需要访问邮箱中的“所有文档”文件夹 - 怎么做,因为它不包含在“众所周知的文件夹名称”枚举中?

【问题讨论】:

    标签: powershell exchange-server exchangewebservices


    【解决方案1】:

    Exchange 中没有 All lDocuments 文件夹(AFAIK 是一个注释),所以这要么是您使用的迁移应用程序创建的文件夹,要么是您使用类似 http://blog.directionstraining.com/microsoft-outlook/creating-documents-view-outlook 的东西来创建搜索文件夹以模仿该行为.因此,根据答案,您将使用的方法将与 Path 的真正基本 Get-Folder 不同(其中路径将基于根目录的位置,例如,如果所有文档是根文件夹,则使用 '\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"
            }
        }
    }
    

    干杯 格伦

    【讨论】:

    • 您好 Glen,您是对的 - 该文件夹是由 Dell Migrator 创建的...即便如此,这对我来说仍然是完美的答案。非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多