2016-03-23 2 views
0

メールインデータベースをNotesからExchangeに移行した後、メールは正しいフォルダに配置されませんでした。 フォルダは存在しますが空ですが、メールは「すべての文書」フォルダからのみ表示されます。 構造を正しくマイグレーションされたdbコピーと比較し、フォルダの内容を復元したいのですが... メールボックスの "All Documents"フォルダにアクセスする必要があります。 「Wellknown Folder names」列挙型には含まれていませんか?PowerShell/EWS経由でExchange 2013のすべてのドキュメントフォルダにある電子メールにアクセスする方法は?

答えて

0

これは、使用した移行アプリケーションが作成したフォルダまたはhttp://blog.directionstraining.com/microsoft-outlook/creating-documents-view-outlookのようなものを使用して、その動作を模倣する検索フォルダを作成するために、Exchange(AFAIKは注意事項)にAl lDocumentsフォルダはありません。それで、答えに応じて、あなたが使う方法は本当に基本的なGet-Folder from Path(パスはルートからの場所に基づいています。例えばAll Documentsがルートフォルダだった場合は '\ 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 [email protected] -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 

[email protected]' 
    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" 
     } 
    } 
} 

乾杯 グレン

+0

こんにちはグレン、あなたは正しい使用する受信トレイのサブフォルダたフォルダましたDell Migrator ...それでも、これは私にとって完璧な答えです。 – AOhlendorf

関連する問題