by

Getting Folder Sizes and different Stats through EWS with Powershell

Getting Folder Sizes and different Stats through EWS with Powershell Anyone requested a query the opposite week about getting all of the Folder Sizes through EWS which you are able to do simply utilizing the PR_MESSAGE_SIZE_EXTENDED property and FindFolders operation (it’s also possible to get the folder measurement’s utilizing the Change Administration Shell through Get-MailboxFolderStatistics cmdlet). However there’s another fascinating stuff you may get through EWS which you could’t from the EMS cmdlet such because the Default FolderClass (eg the PR_CONTAINER_CLASS_W http://msdn.microsoft.com/en-us/library/workplace/cc839839(v=workplace.15).aspx) which can inform you what gadgets are being saved in that exact Folder (though as documented it isn’t a compulsory property though its absence previously has induced downside in OWA and many others). One other property that appears fascinating however would not appear to be properly documented is the PR_ATTACH_ON_NORMAL_MSG_COUNT which seems to the be the overall variety of attachments on messages in that folder together with seemly inline attachment (Observe I can not affirm this because it would not seem like documented and may solely give anecdotal take a look at outcomes so do your individual testing in case your on this).

So with all these fascinating properties you’ll be able to put collectively a unique kind of Mailbox statistics script that may seize Folder stats by FolderClass and present the next information a few mailbox

I’ve put a download of this script right here to run this script enter the EmailAddress of the mailbox you need to run it in opposition to and It will will output a CSV to the c:temp listing the code itself appears to be like like

  1. ## Get the Mailbox to Entry from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4.   
  5. ## Load Managed API dll    
  6. Add-Kind -Path “C:Program FilesMicrosoftExchangeWeb Services2.1Microsoft.Exchange.WebServices.dll”    
  7.     
  8. ## Set Change Model    
  9. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Change2013_SP1    
  10.     
  11. ## Create Change Service Object    
  12. $service = New-Object Microsoft.Change.WebServices.Information.ExchangeService($ExchangeVersion)    
  13.     
  14. ## Set Credentials to use two choices are availible Option1 to use explict credentials or Choice 2 use the Default (logged On) credentials    
  15.     
  16. #Credentials Choice 1 utilizing UPN for the home windows Account    
  17. $psCred = Get-Credential    
  18. $creds = New-Object System.Internet.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  19. $service.Credentials = $creds        
  20.     
  21. #Credentials Choice 2    
  22. #service.UseDefaultCredentials = $true    
  23.     
  24. ## Select to ignore any SSL Warning points induced by Self Signed Certificates    
  25.     
  26. ## Code From http://poshcode.org/624  
  27. ## Create a compilation atmosphere  
  28. $Supplier=New-Object Microsoft.CSharp.CSharpCodeProvider  
  29. $Compiler=$Supplier.CreateCompiler()  
  30. $Params=New-Object System.CodeDom.Compiler.CompilerParameters  
  31. $Params.GenerateExecutable=$False  
  32. $Params.GenerateInMemory=$True  
  33. $Params.IncludeDebugInformation=$False  
  34. $Params.ReferencedAssemblies.Add(“System.DLL”) | Out-Null  
  35.   
  36. $TASource=@ 
  37.   namespace Native.ToolkitExtensions.Internet.CertificatePolicy{ 
  38.     public class TrustAll : System.Internet.ICertificatePolicy { 
  39.       public TrustAll() {  
  40.       } 
  41.       public bool CheckValidationResult(System.Internet.ServicePoint sp, 
  42.         System.Safety.Cryptography.X509Certificates.X509Certificates cert,  
  43.         System.Internet.WebRequest req, int downside) { 
  44.         return true; 
  45.       } 
  46.     } 
  47.   } 
  48. @   
  49. $TAResults=$Supplier.CompileAssemblyFromSource($Params,$TASource)  
  50. $TAAssembly=$TAResults.CompiledAssembly  
  51.   
  52. ## We now create an occasion of the TrustAll and connect it to the ServicePointManager  
  53. $TrustAll=$TAAssembly.CreateInstance(“Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll”)  
  54. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  55.   
  56. ## finish code from http://poshcode.org/624  
  57.     
  58. ## Set the URL of the CAS (Shopper Entry Server) to use two choices are availbe to use Autodiscover to discover the CAS URL or Hardcode the CAS to use    
  59.     
  60. #CAS URL Choice 1 Autodiscover    
  61. $service.AutodiscoverUrl($MailboxName,{$true})    
  62. “Using CAS Server : “ + $Service.url     
  63.      
  64. #CAS URL Choice 2 Hardcoded    
  65.     
  66. #$uri=[system.URI] “https://casservername/ews/exchange.asmx”    
  67. #$service.Url = $uri      
  68.     
  69. ## Non-compulsory part for Change Impersonation    
  70.     
  71. #$service.ImpersonatedUserId = new-object Microsoft.Change.WebServices.Information.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  72. perform ConvertToString($ipInputString){    
  73.     $Val1Text = “”    
  74.     for ($clInt=0;$clInt -lt $ipInputString.size;$clInt++){    
  75.             $Val1Text = $Val1Text + [Convert]::ToString([Convert]::ToChar([Convert]::ToInt32($ipInputString.Substring($clInt,2),16)))    
  76.             $clInt++    
  77.     }    
  78.     return $Val1Text    
  79. }   
  80.   
  81. $FolderClassrpt = @{}  
  82. perform GetFolderSizes{  
  83.     param (  
  84.             $rootFolderId = “$( throw ‘rootFolderId is a mandatory Parameter’ )”  
  85.           )  
  86.     course of{  
  87.     #Outline Prolonged properties    
  88.     $PR_FOLDER_TYPE = new-object Microsoft.Change.WebServices.Information.ExtendedPropertyDefinition(13825,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Integer);    
  89.     $PR_MESSAGE_SIZE_EXTENDED = new-object Microsoft.Change.WebServices.Information.ExtendedPropertyDefinition(3592, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Lengthy);  
  90.     $folderidcnt = $rootFolderId  
  91.     #Outline the FolderView used for Export ought to not be any bigger then 1000 folders due to throttling    
  92.     $fvFolderView =  New-Object Microsoft.Change.WebServices.Information.FolderView(1000)    
  93.     #Deep Transval will guarantee all folders in the search path are returned    
  94.     $fvFolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep;    
  95.     $psPropertySet = new-object Microsoft.Change.WebServices.Information.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)    
  96.     $PR_Folder_Path = new-object Microsoft.Change.WebServices.Information.ExtendedPropertyDefinition(26293, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String);    
  97.     $PR_ATTACH_ON_NORMAL_MSG_COUNT = new-object Microsoft.Change.WebServices.Information.ExtendedPropertyDefinition(0x66B1, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Lengthy);  
  98.     #Add Properties to the  Property Set    
  99.     $psPropertySet.Add($PR_Folder_Path);    
  100.     $psPropertySet.Add($PR_MESSAGE_SIZE_EXTENDED)  
  101.     $psPropertySet.Add($PR_ATTACH_ON_NORMAL_MSG_COUNT)  
  102.     $fvFolderView.PropertySet = $psPropertySet;    
  103.     #The Search filter will exclude any Search Folders    
  104.     $sfSearchFilter = new-object Microsoft.Change.WebServices.Information.SearchFilter+IsEqualTo($PR_FOLDER_TYPE,“1”)    
  105.     $fiResult = $null    
  106.     #The Do loop will deal with any paging that is required if there are extra the 1000 folders in a mailbox    
  107.     do {    
  108.         $fiResult = $Service.FindFolders($folderidcnt,$sfSearchFilter,$fvFolderView)    
  109.         foreach($ffFolder in $fiResult.Folders){  
  110.             $foldpathval = $null    
  111.             #Attempt to get the FolderPath Worth and then covert it to a usable String     
  112.             if ($ffFolder.TryGetProperty($PR_Folder_Path,[ref] $foldpathval))    
  113.             {    
  114.                 $binarry = [Text.Encoding]::UTF8.GetBytes($foldpathval)    
  115.                 $hexArr = $binarry | ForEach-Object { $_.ToString(“X2”) }    
  116.                 $hexString = $hexArr -join     
  117.                 $hexString = $hexString.Substitute(“FEFF”“5C00”)    
  118.                 $fpath = ConvertToString($hexString)    
  119.             }   
  120.             $folderSize = $null  
  121.             [Void]$ffFolder.TryGetProperty($PR_MESSAGE_SIZE_EXTENDED,[ref] $folderSize)  
  122.             [Int64]$attachcnt = 0  
  123.             [Void]$ffFolder.TryGetProperty($PR_ATTACH_ON_NORMAL_MSG_COUNT,[ref] $attachcnt)  
  124.             if($attachcnt -eq $null){  
  125.                 $attachcnt = 0  
  126.             }  
  127.             “FolderPath : “ + $fpath + ” : “ + $folderSize  
  128.             $fldClass = $ffFolder.FolderClass  
  129.             if($fldClass -eq $null){$fldClass = “IPF.Note”}  
  130.             if($FolderClassrpt.ContainsKey($fldClass)){  
  131.                 $FolderClassrpt[$fldClass].NumberOfFolders += 1  
  132.                 $FolderClassrpt[$fldClass].AttachOnMsgCount += $attachcnt  
  133.                 $FolderClassrpt[$fldClass].ItemSize += [Int64]$folderSize  
  134.                 $FolderClassrpt[$fldClass].ItemCount += [Int64]$ffFolder.TotalCount  
  135.             }  
  136.             else choose FolderClass,NumberOfFolders,AttachOnMsgCount,ItemSize,ItemCount  
  137.                 $rptObj.FolderClass = $fldClass  
  138.                 $FolderClassrpt[$fldClass].NumberOfFolders  
  139.                 $rptObj.ItemSize = [Int64]$folderSize  
  140.                 $rptObj.ItemCount = [Int64]$ffFolder.TotalCount  
  141.                 $rptObj.AttachOnMsgCount += $attachcnt  
  142.                 $rptObj.NumberOfFolders = 1  
  143.                 $FolderClassrpt.Add($fldClass,$rptObj)  
  144.               
  145.         }   
  146.         $fvFolderView.Offset += $fiResult.Folders.Rely  
  147.     }whereas($fiResult.MoreAvailable -eq $true)    
  148.     }  
  149. }  
  150. GetFolderSizes -rootFolderId (new-object Microsoft.Change.WebServices.Information.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName))     
  151.   
  152. $FolderClassrpt.Values | choose FolderClass,NumberOfFolders,AttachOnMsgCount,ItemCount,@{label=“TotalSize(MB)”;expression={[math]::Spherical($_.ItemSize/1MB,2)}}  | export-csv c:temp$MailboxName-fldsizebyclass.csv -NoTypeInformation