by

Making a Mailbox Folder Development Map with Powershell, EWS and eDiscovery

Making a Mailbox Folder Development Map with Powershell, EWS and eDiscovery I’ve posted earlier than on Trade 2010 about how you should use AQS to provide a mailbox Merchandise Age and Dimension experiences. This similar methodology can be utilized and enhanced on 2013 utilizing eDiscovery to provide a progress report. Eg one thing like this that exhibits the mailbox progress for every folder (that has grown) based mostly on the dimensions of the Gadgets within the folder for that month and an ASCII graph to point out the expansion vs the FolderSize

So to do that the follwing script makes use of eDiscovery on 2013 or Trade On-line to make a question of all of the gadgets within the major mailbox over the interval of 12 months utilizing the next KQL question

acquired:2013-01-01..2014-01-01

Which queries for gadgets that the place acquired between these two dates, within the script I’ve variables to calculate this to present the precise 12 month interval eg

$KQL = “received:” + $StartDate.ToString(“yyyy-MM-dd”) + “..” + $EndDate.ToString(“yyyy-MM-dd”);

The remainder of the script is one other variant of my eDiscovery template script with another code to summaries the expansion for every month and add the foldersizes.

To run this script you simply feed within the title of the Mailbox you need to run it towards eg

 .growthMap12months.ps1 person@area.com

I’ve put a download of this script right here the code seems to be like

  1. ## Get the Mailbox to Entry from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4. $SearchableMailboxString = $MailboxName;  
  5. $StartDate = (Get-Date).AddMonths(-11)  
  6. $EndDate = (Get-Date)  
  7.   
  8. $KQL = “received:” + $StartDate.ToString(“yyyy-MM-dd”) + “..” + $EndDate.ToString(“yyyy-MM-dd”);           
  9.  
  10.  
  11. ## Load Managed API dll    
  12. Add-Sort -Path “C:Program FilesMicrosoftExchangeWeb Services2.1Microsoft.Exchange.WebServices.dll”    
  13.    
  14. ## Set Trade Model    
  15. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Trade2013_SP1    
  16.    
  17. ## Create Trade Service Object    
  18. $service = New-Object Microsoft.Trade.WebServices.Information.ExchangeService($ExchangeVersion)    
  19.    
  20. ## Set Credentials to use two choices are availible Option1 to use explict credentials or Choice 2 use the Default (logged On) credentials    
  21.    
  22. #Credentials Choice 1 utilizing UPN for the home windows Account    
  23. $psCred = Get-Credential    
  24. $creds = New-Object System.Web.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  25. $service.Credentials = $creds        
  26.    
  27. #Credentials Choice 2    
  28. #service.UseDefaultCredentials = $true    
  29.    
  30. ## Select to ignore any SSL Warning points precipitated by Self Signed Certificates    
  31.    
  32. ## Code From http://poshcode.org/624  
  33. ## Create a compilation setting  
  34. $Supplier=New-Object Microsoft.CSharp.CSharpCodeProvider  
  35. $Compiler=$Supplier.CreateCompiler()  
  36. $Params=New-Object System.CodeDom.Compiler.CompilerParameters  
  37. $Params.GenerateExecutable=$False  
  38. $Params.GenerateInMemory=$True  
  39. $Params.IncludeDebugInformation=$False  
  40. $Params.ReferencedAssemblies.Add(“System.DLL”) | Out-Null  
  41.   
  42. $TASource=@ 
  43.   namespace Native.ToolkitExtensions.Web.CertificatePolicy{ 
  44.     public class TrustAll : System.Web.ICertificatePolicy { 
  45.       public TrustAll() {  
  46.       } 
  47.       public bool CheckValidationResult(System.Web.ServicePoint sp, 
  48.         System.Safety.Cryptography.X509Certificates.X509Certificates cert,  
  49.         System.Web.WebRequest req, int drawback) { 
  50.         return true; 
  51.       } 
  52.     } 
  53.   } 
  54. @   
  55. $TAResults=$Supplier.CompileAssemblyFromSource($Params,$TASource)  
  56. $TAAssembly=$TAResults.CompiledAssembly  
  57.  
  58. ## We now create an occasion of the TrustAll and connect it to the ServicePointManager  
  59. $TrustAll=$TAAssembly.CreateInstance(“Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll”)  
  60. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  61.  
  62. ## finish code from http://poshcode.org/624  
  63.    
  64. ## Set the URL of the CAS (Consumer Entry Server) to use two choices are availbe to use Autodiscover to discover the CAS URL or Hardcode the CAS to use    
  65.    
  66. #CAS URL Choice 1 Autodiscover    
  67. $service.AutodiscoverUrl($MailboxName,{$true})    
  68. “Using CAS Server : “ + $Service.url     
  69.     
  70. #CAS URL Choice 2 Hardcoded    
  71.    
  72. #$uri=[system.URI] “https://casservername/ews/exchange.asmx”    
  73. #$service.Url = $uri      
  74.    
  75. ## Optionally available part for Trade Impersonation    
  76.    
  77. #$service.ImpersonatedUserId = new-object Microsoft.Trade.WebServices.Information.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  78. operate ConvertToString($ipInputString){    
  79.     $Val1Text = “”    
  80.     for ($clInt=0;$clInt -lt $ipInputString.size;$clInt++){    
  81.             $Val1Text = $Val1Text + [Convert]::ToString([Convert]::ToChar([Convert]::ToInt32($ipInputString.Substring($clInt,2),16)))    
  82.             $clInt++    
  83.     }    
  84.     return $Val1Text    
  85. }   
  86.   
  87.   
  88. operate GetFolderPaths{  
  89.     param (  
  90.             $rootFolderId = “$( throw ‘rootFolderId is a mandatory Parameter’ )”,  
  91.             $Archive = “$( throw ‘Archive is a mandatory Parameter’ )”  
  92.           )  
  93.     course of{  
  94.     #Outline Prolonged properties    
  95.     $PR_FOLDER_TYPE = new-object Microsoft.Trade.WebServices.Information.ExtendedPropertyDefinition(13825,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Integer);    
  96.     $PR_MESSAGE_SIZE_EXTENDED = new-object Microsoft.Trade.WebServices.Information.ExtendedPropertyDefinition(3592, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Lengthy);  
  97.     $folderidcnt = $rootFolderId  
  98.     #Outline the FolderView used for Export ought to not be any bigger then 1000 folders due to throttling    
  99.     $fvFolderView =  New-Object Microsoft.Trade.WebServices.Information.FolderView(1000)    
  100.     #Deep Transval will guarantee all folders in the search path are returned    
  101.     $fvFolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep;    
  102.     $psPropertySet = new-object Microsoft.Trade.WebServices.Information.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)    
  103.     $PR_Folder_Path = new-object Microsoft.Trade.WebServices.Information.ExtendedPropertyDefinition(26293, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String);    
  104.     #Add Properties to the  Property Set    
  105.     $psPropertySet.Add($PR_Folder_Path);    
  106.     $psPropertySet.Add($PR_MESSAGE_SIZE_EXTENDED)  
  107.     $fvFolderView.PropertySet = $psPropertySet;    
  108.     #The Search filter will exclude any Search Folders    
  109.     $sfSearchFilter = new-object Microsoft.Trade.WebServices.Information.SearchFilter+IsEqualTo($PR_FOLDER_TYPE,“1”)    
  110.     $fiResult = $null    
  111.     #The Do loop will deal with any paging that is required if there are extra the 1000 folders in a mailbox    
  112.     do {    
  113.         $fiResult = $Service.FindFolders($folderidcnt,$sfSearchFilter,$fvFolderView)    
  114.         foreach($ffFolder in $fiResult.Folders){  
  115.             $rptFld = “” | Choose FolderPath,TotalItemCount,TotalFolderSize,PeriodGrowthSize  
  116.             $valDate = $StartDate  
  117.             do{  
  118.                 $MonthVal = $valDate.ToString(“MMMM”) + $valDate.ToString(“yyyy”)  
  119.                 Add-Member -InputObject $rptFld -MemberType NoteProperty -Identify $MonthVal -Worth 0   
  120.                 $valDate = $valDate.AddMonths(1)  
  121.             }whereas($valDate -le $EndDate)  
  122.             Add-Member -InputObject $rptFld -MemberType NoteProperty -Identify “GrowthGraph” -Worth “”  
  123.             $foldpathval = $null    
  124.             #Strive to get the FolderPath Worth and then covert it to a usable String     
  125.             if ($ffFolder.TryGetProperty($PR_Folder_Path,[ref] $foldpathval))    
  126.             {    
  127.                 $binarry = [Text.Encoding]::UTF8.GetBytes($foldpathval)    
  128.                 $hexArr = $binarry | ForEach-Object { $_.ToString(“X2”) }    
  129.                 $hexString = $hexArr -join     
  130.                 $hexString = $hexString.Change(“FEFF”“5C00”)    
  131.                 $fpath = ConvertToString($hexString)    
  132.             }   
  133.             $folderSize = $null  
  134.             if ($ffFolder.TryGetProperty($PR_MESSAGE_SIZE_EXTENDED,[ref] $folderSize))    
  135.             {     
  136.                 if ($folderSize -gt 0){  
  137.                     $rptFld.TotalFolderSize = $folderSize  
  138.                 }  
  139.                 else{  
  140.                     $rptFld.TotalFolderSize = $folderSize  
  141.                 }  
  142.             }  
  143.             “FolderPath : “ + $fpath  
  144.             if($Archive){  
  145.                 $fpath = “Archive-Mailbox” + $fpath; 
  146.             } 
  147.             $rptFld.FolderPath = $fpath 
  148.             $rptFld.TotalItemCount = $ffFolder.TotalCount 
  149.             $Script:FolderCache.Add($ffFolder.Id.UniqueId,$rptFld); 
  150.         }  
  151.         $fvFolderView.Offset += $fiResult.Folders.Rely 
  152.     }whereas($fiResult.MoreAvailable -eq $true)   
  153.     } 
  154. } 
  155.  
  156. $Script:FolderCache = New-Object system.collections.hashtable 
  157. GetFolderPaths -rootFolderId (new-object Microsoft.Trade.WebServices.Information.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName)) -Archive $false   
  158. GetFolderPaths -rootFolderId (new-object Microsoft.Trade.WebServices.Information.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::RecoverableItemsRoot,$MailboxName)) -Archive $false   
  159.  
  160. $gsMBResponse = $service.GetSearchableMailboxes($SearchableMailboxString, $false); 
  161. $gsMBResponse 
  162. $msbScope = New-Object  Microsoft.Trade.WebServices.Information.MailboxSearchScope[] $gsMBResponse.SearchableMailboxes.Size 
  163. $mbCount = 0; 
  164. foreach ($sbMailbox in $gsMBResponse.SearchableMailboxes) 
  165. { 
  166.     $msbScope[$mbCount] = New-Object Microsoft.Trade.WebServices.Information.MailboxSearchScope($sbMailbox.ReferenceId, [Microsoft.Exchange.WebServices.Data.MailboxSearchLocation]::PrimaryOnly); 
  167.     $mbCount++; 
  168. } 
  169. $smSearchMailbox = New-Object Microsoft.Trade.WebServices.Information.SearchMailboxesParameters 
  170. $mbq =  New-Object Microsoft.Trade.WebServices.Information.MailboxQuery($KQL, $msbScope); 
  171. $mbqa = New-Object Microsoft.Trade.WebServices.Information.MailboxQuery[] 1 
  172. $mbqa[0] = $mbq 
  173. $smSearchMailbox.SearchQueries = $mbqa; 
  174. $smSearchMailbox.PageSize = 100; 
  175. $smSearchMailbox.PageDirection = [Microsoft.Exchange.WebServices.Data.SearchPageDirection]::Subsequent; 
  176. $smSearchMailbox.PerformDeduplication = $false;            
  177. $smSearchMailbox.ResultType = [Microsoft.Exchange.WebServices.Data.SearchResultType]::PreviewOnly; 
  178. $srCol = $service.SearchMailboxes($smSearchMailbox); 
  179. $rptCollection = @{} 
  180.  
  181. if ($srCol[0].Outcome -eq [Microsoft.Exchange.WebServices.Data.ServiceResult]::Success) 
  182. { 
  183.     Write-Host (“Gadgets Discovered ” + $srCol[0].SearchResult.ItemCount) 
  184.     if ($srCol[0].SearchResult.ItemCount -gt 0) 
  185.     {                   
  186.         do 
  187.         { 
  188.             $smSearchMailbox.PageItemReference = $srCol[0].SearchResult.PreviewItems[$srCol[0].SearchResult.PreviewItems.Size – 1].SortValue; 
  189.             foreach ($PvItem in $srCol[0].SearchResult.PreviewItems) { 
  190.                 $rptObj = “” | choose FolderPath,DateTimeReceived,Topic,Dimension 
  191.                 if($Script:FolderCache.ContainsKey($PvItem.ParentId.UniqueId)){ 
  192.                     if($rptCollection.ContainsKey($PvItem.ParentId.UniqueId) -eq $false){ 
  193.                         $rptCollection.Add($PvItem.ParentId.UniqueId,$Script:FolderCache[$PvItem.ParentId.UniqueId]) 
  194.                     } 
  195.                     $MonthVal = $PvItem.ReceivedTime.ToString(“MMMM“) + $PvItem.ReceivedTime.ToString(“yyyy“) 
  196.                     $rptCollection[$PvItem.ParentId.UniqueId].”$MonthVal” += $PvItem.Dimension 
  197.                 } 
  198.                          
  199.             }                         
  200.             $srCol = $service.SearchMailboxes($smSearchMailbox); 
  201.             Write-Host(“Gadgets Remaining : ” + $srCol[0].SearchResult.ItemCount); 
  202.         } whereas ($srCol[0].SearchResult.ItemCount-gt 0 ); 
  203.          
  204.     } 
  205.      
  206. } 
  207. $rptOutput = @() 
  208. $rptCollection.GetEnumerator() |  ForEach-Object{ 
  209.     $valDate = $StartDate 
  210.         do{ 
  211.             $MonthVal = $valDate.ToString(“MMMM“) + $valDate.ToString(“yyyy“) 
  212.             $_.Worth.PeriodGrowthSize += $_.Worth.”$MonthVal 
  213.             $_.Worth.”$MonthVal” = [math]::spherical($_.Worth.”$MonthVal“/1Mb,2) 
  214.             $valDate = $valDate.AddMonths(1) 
  215.         }whereas($valDate -le $EndDate) 
  216.         $GrowthPercent = [Math]::spherical((($_.Worth.PeriodGrowthSize/$_.Worth.TotalFolderSize) * 100)) 
  217.         $_.Worth.PeriodGrowthSize = [math]::spherical($_.Worth.PeriodGrowthSize/1Mb,2) 
  218.         $_.Worth.TotalFolderSize = [math]::spherical($_.Worth.TotalFolderSize /1Mb, 2) 
  219.         
  220.     $GrowthPercent 
  221.     $PercentGraph = “”   
  222.     for($intval=0;$intval -lt 100;$intval+=4){   
  223.         if($GrowthPercent -gt $intval){   
  224.             $PercentGraph += “”   
  225.         }   
  226.         else{          
  227.             $PercentGraph += “░”    
  228.         }    
  229.     }    
  230.     $_.Worth.GrowthGraph = $PercentGraph      
  231.     $rptOutput += $_.Worth  
  232. }  
  233. $rptOutput | Export-Csv -NoTypeInformation -Path c:temp$MailboxName-mbgrowMap.csv -Encoding UTF8  
  234. $rptOutput | Choose FolderPath,GrowthGraph