Utilizing EWS and AQS to examine variety of Unread in X days with Graph

Utilizing EWS and AQS to examine variety of Unread in X days with Graph It appears which you can by no means have too some ways of studying the variety of Unread messages in a Inbox so right here is one other technique. The next script makes use of two AQS queries to work out first the variety of messages within the Inbox from a prescribed interval eg the final 30 days after which the variety of these which are then unread. It then works out the proportion of unread utilizing of the 2 values after which creates a graph to show within the Console utilizing Alt-ASCII characters which produces a fairly nifty output eg

It additionally produces a CSV output eg

AQS queries will work in Change 2010 and 2013 so this script ought to work okay in these environments in addition to ExchangeOnline.

I’ve created two variations of this script, the primary model simply stories on one person so that you run it with the e-mail of the customers you wish to report on and the variety of days to question again. eg

.AQSUsr.ps1 [email protected] 30

the second model stories on the entire customers in a CSV file and makes use of EWS Impersonation to entry the Mailboxes. To make use of the script it’s worthwhile to have configured EWS Impersonation and feed the script a CSV file of the customers you wish to report on eg the CSV file ought to seem like

smtpaddress
[email protected]
[email protected]

and also you run it like

.AQSAllUsr.ps1 ./customers.csv 30

I’ve put a download of each scripts right here the code seem like

  1. ## Get the Mailbox to Entry from the 1st commandline argument  
  2.   
  3. $csvFileName = $args[0]  
  4. $DaysBack = $args[1]  
  5.   
  6. ## Load Managed API dll    
  7. Add-Kind -Path “C:Program FilesMicrosoftExchangeWeb Services2.0Microsoft.Exchange.WebServices.dll”    
  8.     
  9. ## Set Change Model    
  10. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Change2010_SP2    
  11.     
  12. ## Create Change Service Object    
  13. $service = New-Object Microsoft.Change.WebServices.Knowledge.ExchangeService($ExchangeVersion)    
  14.     
  15. ## Set Credentials to use two choices are availible Option1 to use explict credentials or Possibility 2 use the Default (logged On) credentials    
  16.     
  17. #Credentials Possibility 1 utilizing UPN for the home windows Account    
  18. $psCred = Get-Credential    
  19. $creds = New-Object System.Internet.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  20. $service.Credentials = $creds        
  21.     
  22. #Credentials Possibility 2    
  23. #service.UseDefaultCredentials = $true    
  24.     
  25. ## Select to ignore any SSL Warning points induced by Self Signed Certificates    
  26.     
  27. ## Code From http://poshcode.org/624  
  28. ## Create a compilation atmosphere  
  29. $Supplier=New-Object Microsoft.CSharp.CSharpCodeProvider  
  30. $Compiler=$Supplier.CreateCompiler()  
  31. $Params=New-Object System.CodeDom.Compiler.CompilerParameters  
  32. $Params.GenerateExecutable=$False  
  33. $Params.GenerateInMemory=$True  
  34. $Params.IncludeDebugInformation=$False  
  35. $Params.ReferencedAssemblies.Add(“System.DLL”) | Out-Null  
  36.   
  37. $TASource[email protected] 
  38.   namespace Native.ToolkitExtensions.Internet.CertificatePolicy{ 
  39.     public class TrustAll : System.Internet.ICertificatePolicy { 
  40.       public TrustAll() {  
  41.       } 
  42.       public bool CheckValidationResult(System.Internet.ServicePoint sp, 
  43.         System.Safety.Cryptography.X509Certificates.X509Certificates cert,  
  44.         System.Internet.WebRequest req, int downside) { 
  45.         return true; 
  46.       } 
  47.     } 
  48.   } 
  49. @   
  50. $TAResults=$Supplier.CompileAssemblyFromSource($Params,$TASource)  
  51. $TAAssembly=$TAResults.CompiledAssembly  
  52.   
  53. ## We now create an occasion of the TrustAll and connect it to the ServicePointManager  
  54. $TrustAll=$TAAssembly.CreateInstance(“Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll”)  
  55. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  56.   
  57. ## finish code from http://poshcode.org/624  
  58.     
  59. ## 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    
  60.     
  61. #CAS URL Possibility 1 Autodiscover    
  62. #$service.AutodiscoverUrl($MailboxName,{$true})    
  63. #”Using CAS Server : ” + $Service.url     
  64.      
  65. #CAS URL Possibility 2 Hardcoded    
  66.     
  67. #$uri=[system.URI] “https://casservername/ews/exchange.asmx”    
  68. #$service.Url = $uri      
  69.     
  70. ## Optionally available part for Change Impersonation    
  71.     
  72.   
  73. $Script:rptCollection = @()  
  74. operate Course of-Mailbox{    
  75.     param (    
  76.             $SmtpAddress = “$( throw ‘SMTPAddress is a mandatory Parameter’ )”    
  77.           )    
  78.     course of{    
  79.         Write-Host (“Processing Mailbox : “ + $SmtpAddress)    
  80.   
  81. # Bind to the Inbox Folder  
  82. $folderid= new-object Microsoft.Change.WebServices.Knowledge.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$SmtpAddress)     
  83. $Inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)  
  84. $Vary = [system.DateTime]::Now.AddDays(-$DaysBack).ToString(“MM/dd/yyyy”) + “..” + [system.DateTime]::Now.AddDays(1).ToString(“MM/dd/yyyy”)     
  85. $AQSString1 = “System.Message.DateReceived:” + $Vary     
  86. $AQSString2 = “(“ + $AQSString1 + “) AND (isread:false)”   
  87. $ivItemView =  New-Object Microsoft.Change.WebServices.Knowledge.ItemView(1)    
  88. $allMail = $Inbox.FindItems($AQSString1,$ivItemView)  
  89. $ivItemView =  New-Object Microsoft.Change.WebServices.Knowledge.ItemView(1)   
  90. $unread = $Inbox.FindItems($AQSString2,$ivItemView)  
  91. $rptObj = “” | Choose MailboxName,TotalCount,Unread,PercentUnread,PercentGraph  
  92.   
  93. #Write-Host (“All Mail ” + $allMail.TotalCount)   
  94. #Write-Host (“Unread ” + $unread.TotalCount)   
  95. $rptObj.MailboxName = $SmtpAddress  
  96. $rptObj.TotalCount = $allMail.TotalCount  
  97. $rptObj.Unread = $unread.TotalCount   
  98. $PercentUnread = 0  
  99. if($unread.TotalCount -gt 0){  
  100.     $PercentUnread = [Math]::spherical((($unread.TotalCount/$allMail.TotalCount) * 100))  
  101. }  
  102. $rptObj.PercentUnread = $PercentUnread   
  103. #Write-Host (“Percent Unread ” + $PercentUnread)  
  104. $ureadGraph = “”  
  105. for($intval=0;$intval -lt 100;$intval+=4){  
  106.     if($PercentUnread -gt $intval){  
  107.         $ureadGraph += “▓”  
  108.     }  
  109.     else{         
  110.         $ureadGraph += “░”  
  111.     }  
  112. }  
  113. #Write-Host $ureadGraph  
  114. $rptObj.PercentGraph = $ureadGraph  
  115. $rptObj | fl  
  116. $Script:rptCollection +=$rptObj  
  117.   
  118. }  
  119. }  
  120. Import-Csv -Path $csvFileName | ForEach-Object{    
  121.     if($service.url -eq $null){    
  122.         $service.AutodiscoverUrl($_.SmtpAddress,{$true})     
  123.         “Using CAS Server : “ + $Service.url     
  124.     }    
  125.     Attempt{    
  126.         $service.ImpersonatedUserId = new-object Microsoft.Change.WebServices.Knowledge.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $_.SmtpAddress)   
  127.   
  128.         Course of-Mailbox -SmtpAddress $_.SmtpAddress    
  129.     }    
  130.     catch{    
  131.         Write-host (“Error processing Mailbox : “ + $_.SmtpAddress + $_.Exception.Message.ToString())    
  132.         $Error.Clear()  
  133.     }    
  134. }    
  135. $Script:rptCollection | ft  
  136. $Script:rptCollection | Export-Csv -NoTypeInformation -Path c:tempInboxUnreadReport.csv -Encoding UTF8   

Leave a Reply