Thursday, September 09, 2010

Getting the Folder Size of a folder using EWS

One of the things missing from the standard folder properties when you use EWS to access a mailbox or public folder is the size of the folder. Those that have used other API's to do mailbox and public folder size reporting should already know about the extended mapi property PR_Extended_Message_Size this is what you also need to use in EWS to get the folder size to define this in C# you can use

ExtendedPropertyDefinition PR_Extended_Message_Size = new ExtendedPropertyDefinition(3592, MapiPropertyType.Long);
PropertySet psPropertySet = new PropertySet(BasePropertySet.FirstClassProperties) { PR_Extended_Message_Size };
Folder Inbox = Folder.Bind(service, WellKnownFolderName.Inbox, psPropertySet);
Object FolderSize = null;
if (Inbox.TryGetProperty(PR_Extended_Message_Size, out FolderSize)) {
Console.WriteLine(FolderSize);
}


You can also make use of this in a script if you want an alternative to Get-MailboxFolderStatistics eg if you wanted to show the size of ever folder in a mailbox you can use the following script I've put a download of this here

$MailboxName = "user@domain.com"

$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.0\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)

$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)

$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$sidbind = "LDAP://"
$aceuser = [ADSI]$sidbind

$service.AutodiscoverUrl($aceuser.mail.ToString())

$rfRootFolderID = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName)
$rfRootFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$rfRootFolderID)
$fvFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(10000);
$PR_MESSAGE_SIZE_EXTENDED = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(3592, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Integer)
$Propset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$Propset.add($PR_MESSAGE_SIZE_EXTENDED)
$fvFolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$fvFolderView.PropertySet = $Propset
$ffResponse = $rfRootFolder.FindFolders($fvFolderView);

foreach ($ffFolder in $ffResponse.Folders){
$fldObject = "" | select FolderName,FolderSize
$folderSize = $null
$ptProptest2 = $ffFolder.TryGetProperty($PR_MESSAGE_SIZE_EXTENDED, [ref]$folderSize)
$fldObject.FolderName = $ffFolder.DisplayName
$fldObject.FolderSize = [INT]$folderSize
$ReportingCollection += $fldObject
}
$ReportingCollection

6 comments:

KMSigma said...

Thanks man - this was timely! Only thing I need to add is item count and a way to filter based on the last modified date. Looks like I'll be jumping into the associated EWS API documents!

Regardless - thanks for the great first steps!

James said...

Glenn, awesome as usual. Question though - any quick advice on how I would tack on pulling public folder item count to this code?

James said...

Hey, so to answer my own question, if you bind to a public folder directly you can retrieve the TotalCount property. The property is not returned using FindFolders.

Nick said...

You can get the item count with PR_CONTENT_COUNT 0x3602 13826

Gagan Bhatnagar said...

Hi Glen,

Can we get Folder creation and modification date in a similar manner

Thanks
Gagan

Glen Scales said...

Sure just use the Mapi properties for Created and Modified time and add them to the Property set you load.