IMAP pst file import problems – folders containing IMAP items (IPF.Imap) type are not displayed in Exchange 2010 / 2013 OWA

Problem description

I have been solving problem in my friends Exchange 2013 environment. After migration (from IMAP profile) some folders were not visible in his OWA while those were visible in Outlook.
After research I have found, that every folder is “Different in properties” as seen in result Picture below.

wrong properties

Hmm, what now? I dont wanna use MFCMapi, since my friend has many folders. EWS? OK, but how?

Solution

Theory

  • As far as I understand Exchange, there are several kind of permissions and properties and mailbox folder properties belong to MAPI and those can be edited via MFC Mapi (ExFolders) (http://mfcmapi.codeplex.com/) or via EWS Managed API (http://www.microsoft.com/en-us/download/details.aspx?id=30141)
  • Yes. Exchange Web Services Managed API allows you to write custom applications, but I am not a programmer. I have downloaded a script from (http://gsexdev.blogspot.cz/2012/02/ews-managed-api-and-powershell-how-to.html), which I want to say thanks for and made additions to it.
  • Behind the scenes I have found nice technet discussion about how to change folder class so, that it will be visible in OWA, because OWA doesnt show folders with IMAP items. The goal is to change IPF.Imap class to IPF.Note. After changing via EWS you will see the diference as in picture below and after refresh OWA will work as needed.

Correct properties

  • As administrator I am not keen in C# so I will use my domain. Powershell (3.0) as I do the script on Exchange 2013 server

Prerequisites

  • Before you even start to play with EWS, you need to install EWS Managed API fom the link: http://www.microsoft.com/en-us/download/details.aspx?id=30141 or newer version (Link is from Fall 2012)
  • After downloading install it to directory, from which you run the script. Note, that you will need to make reference for “Microsoft.Exchange.WebServices.dll” which is key component of EWS managed API. Example from my script is below:

$dllpath =“d:ExchangeScriptsEWSmanagedAPIMicrosoft.Exchange.WebServices.dll”  

  • Next step is to add your user name full access to mailbox, which will be checked and impersonate role, which will allow impersonation of mailbox under your user as you were owner of the mailbox. Commands are as follows:

New-ManagementRoleAssignment -Name Impersonation -User administrator -Role ApplicationImpersonation

Script

Script can be downloaded from Skydrive

 
$dllpath = "d:ExchangeScriptsEWSmanagedAPIMicrosoft.Exchange.WebServices.dll" #Define DLL Path

[void][Reflection.Assembly]::LoadFile($dllpath) #Load DLL

$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2) #Define EWS Service and version

$service.Url = New-Object System.Uri("https://email.domain.cz/EWS/Exchange.asmx") #Define uri for EWS VDir

$MBXID = "mailbox.identity" #Define mailboxID

foreach ($MailboxIdentity in $MBXID) {

Write-Host "Searching for $MailboxIdentity"

$MailboxName = (Get-Mailbox -Identity $MailboxIdentity).PrimarySmtpAddress.ToString()

$MailboxDName = (Get-Mailbox -Identity $MailboxIdentity).DisplayName

$ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId -ArgumentList ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress),$MailboxName #Define impersonation

$service.ImpersonatedUserId = $ImpersonatedUserId #Impersonate service under userID

$folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName) #MsgFolderRoot selection and creation of new root folder object

$f1 = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service, $MailboxName) #Binding folder under mailbox identity

$fold = get-mailboxfolderstatistics $MailboxIdentity #Getting complete list of selected mailbox

foreach ($mbxfolder in $fold){

#Define Folder View Really only want to return one object

$fvFolderView = new-object Microsoft.Exchange.WebServices.Data.FolderView(100) #page size for displayed folders

$fvFolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep; #Search traversal selection Deep = recursively

#Define a Search folder that is going to do a search based on the DisplayName of the folder

$SfSearchFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::Displayname,$MBXFolder.name) #for each folder in mailbox define search

$findFolderResults = $service.FindFolders($folderid,$SfSearchFilter,$fvFolderView) #for each folder in mailbox define folder view (this is online task for store.exe) and perform search

if ($findFolderResults.TotalCount -eq 0){ "Folder Doesn't Exist" } #Info if folder still exist

else {"Folder Exist"

ForEach ($Folder in $findFolderResults.Folders) { #for each folder in folder results perform check of folder class

$folder.folderclass #Info about folder class

if ($Folder.folderclass -eq "IPF.Imap"){ #If folder class is target type, do change and update

$Folder.folderclass = "IPF.Note" #Folder class change in variable

Write-Host "Updating folder $folder.name to correct type IPF.Note. Folder will start to be visible in OWA"

$Folder.update() #Folder class update in mailbox via EWS

}

}

}

}

}

The script will generate some output to host:

converting via script

Reference

Advertisements

How to connect to shared / additional mailbox via IMAP (Exchange 2010/2013)

I was solving the issue for one of our customers. They have application, which needs to log on to mailbox via IMAP, but administrator user doesn´t have mailbox. Here is the solution:

  • Administrator user “Anatolij.Stokurev” doesn´t have a mailbox
  • Anatolij.Stokurev needs to access mailbox “Shared.mailbox1”
  • Syntax to log on to additional / shared mailbox via IMAP is to use: DOMAIN\USERNAME\MAILBOXALIAS in username field and password in your application,
  • NOTE: get-credential command doesn´t accept syntax from point above (double in username) so you shoud enter credentials directly

Example:

  • I have created shared mailbox in Exchange 2013 and user in AD

shared creation1

I granted full access to user, who doesnt have mailbox Anatolij.Stokurev by command

Add-MailboxPermission Shared.Mailbox1 -user Anatolij.Stokurev -AccessRights FullAccess

permissions1

Note: You cannot add permissions for user without mailbox in EAC / ECP. Powershell is the only option here.

Test via Telnet:

  • Prerequisite here is to have Plain text login set on Exchange servers (IMAP). Use the following commands to set plaintext login. IMAP services must be restarted before change takes effect.
Set-IMAPSettings -Server <SERVERNAME> -LoginType PlaintextLogin
Get-Service *ima* | Restart-Service
  • type the following command into the command line. I use Windows Server 2008 R2 and there is no Telnet client feature installed by default, so if you dont have it, please install it via Server manager MMC.
telnet <name of your imap server> imap (where imap is key word of protocol used by telnet client)
  • You will get OK answer from your setver if everything is OK
a1 LOGIN SALONOVI\Anatolij.Stokurev\Shared.Mailbox1 Minus30*  (According to IMAP protocol you have to insert valid username / password combination to logon to mailbox)
a2 LIST "" "*" (list folders from the mailbox)
a5 LOGOUT (End session)
  • Result is in the following Picture

result

Test via Outlook

  • Add IMAP connection to your existing profile or create new profile (File -> Account Settings -> New -> Manual Configuration -> POP/IMAP)
  • Open Settings
  • Change settings according the Picture:

outlook settings

  • Our admin user doesnt have e-mail address. Fill in e-mail address of the shared account instead
  • Into the username use the same syntax as before “DOMAIN\USER\MAILBOXALIAS”
  • In More settings TAB use working configuration of your SMTP server
  • Hit NEXT and you will get the test window. After test is OK you are ready touse new profile with IMAP connected to shared mailbox