Tuesday, January 22, 2013

Using the PidTagAdditionalRenEntryIdsEx property in EWS to access localized folders such as the RSS Feeds folder in EWS and Powershell

As I've covered before in this post when you want to access the WellKnowFolders in EWS in a language independent way (eg not having to worry about localization) you can use the WellKnowFoldersName Enumeration in EWS http://msdn.microsoft.com/en-us/library/exchange/microsoft.exchange.webservices.data.wellknownfoldername%28v=exchg.80%29.aspx. Although most of the folderID's are now included in the enumeration one that is missing is the RSS Feeds folder Id.. The Extended property that holds the PR_EntryID for the RSS Feeds Folder is the PidTagAdditionalRenEntryIdsEx extended property on the Non_IPM_Subtree of a mailbox. This Id is held within a PersistData Block which is a structured Binary property that if you want to read in EWS you need to decode (which is fun).

So how do you decode this property the first thing you want to do is convert it to Hex String while you could deal with it in the Binary array I find it easier to deal with as a Hex String.

$hexVal = [System.BitConverter]::ToString($binVal).Replace("-","");

The next thing you need to do is now start parsing the HexString because its a structure Blob you know what to expect so its just a matter of following the Map. So the first thing you need to do is read the first words (2 Bytes). Which tells you what type of Entry your dealing with from this PersistBlockType Values list this is in little-endian format so it needs to be swapped around to make sense.

After that you need to read the next word which contains the length of the Id property (or the payload).  Once you have the length you can then parse the HexEntryId for the folder. As this property stores multiple ID's you need to do this for as many Ids as you can parse out. To then use this HexEntryID in EWS you need to use the ConvertID EWS operation which give you the EWSid of the folder from the HexEntryID which you can then Bind To the folder in EWS.

A full sample of doing this looks like

  1. ## Get the Mailbox to Access from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4.   
  5. ## Load Managed API dll    
  6. Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"    
  7.     
  8. ## Set Exchange Version    
  9. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2    
  10.     
  11. ## Create Exchange Service Object    
  12. $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)    
  13.     
  14. ## Set Credentials to use two options are availible Option1 to use explict credentials or Option 2 use the Default (logged On) credentials    
  15.     
  16. #Credentials Option 1 using UPN for the windows Account    
  17. $psCred = Get-Credential    
  18. $creds = New-Object System.Net.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  19. $service.Credentials = $creds        
  20.     
  21. #Credentials Option 2    
  22. #service.UseDefaultCredentials = $true    
  23.     
  24. ## Choose to ignore any SSL Warning issues caused by Self Signed Certificates    
  25.     
  26. ## Code From http://poshcode.org/624  
  27. ## Create a compilation environment  
  28. $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider  
  29. $Compiler=$Provider.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 Local.ToolkitExtensions.Net.CertificatePolicy{ 
  38.     public class TrustAll : System.Net.ICertificatePolicy { 
  39.       public TrustAll() {  
  40.       } 
  41.       public bool CheckValidationResult(System.Net.ServicePoint sp, 
  42.         System.Security.Cryptography.X509Certificates.X509Certificate cert,  
  43.         System.Net.WebRequest req, int problem) { 
  44.         return true; 
  45.       } 
  46.     } 
  47.   } 
  48. '@   
  49. $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)  
  50. $TAAssembly=$TAResults.CompiledAssembly  
  51.   
  52. ## We now create an instance of the TrustAll and attach it to the ServicePointManager  
  53. $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")  
  54. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  55.   
  56. ## end code from http://poshcode.org/624  
  57.     
  58. ## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use    
  59.     
  60. #CAS URL Option 1 Autodiscover    
  61. $service.AutodiscoverUrl($MailboxName,{$true})    
  62. "Using CAS Server : " + $Service.url     
  63.      
  64. #CAS URL Option 2 Hardcoded    
  65.     
  66. #$uri=[system.URI] "https://casservername/ews/exchange.asmx"    
  67. #$service.Url = $uri      
  68.     
  69. ## Optional section for Exchange Impersonation    
  70.     
  71. #$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  72. $PidTagAdditionalRenEntryIdsEx = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(0x36D9, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Binary)  
  73. $psPropset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)  
  74. $psPropset.Add($PidTagAdditionalRenEntryIdsEx)  
  75.   
  76. # Bind to the NON_IPM_ROOT Root folder    
  77. $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName)     
  78. $NON_IPM_ROOT = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid,$psPropset)  
  79. $binVal = $null;  
  80. $AdditionalRenEntryIdsExCol = @{}  
  81. if($NON_IPM_ROOT.TryGetProperty($PidTagAdditionalRenEntryIdsEx,[ref]$binVal)){  
  82.     $hexVal = [System.BitConverter]::ToString($binVal).Replace("-","");  
  83.     ##Parse Binary Value first word is Value type Second word is the Length of the Entry  
  84.     $Sval = 0;  
  85.     while(($Sval+8) -lt $hexVal.Length){  
  86.         $PtypeVal = $hexVal.SubString($Sval,4)  
  87.         $PtypeVal = $PtypeVal.SubString(2,2) + $PtypeVal.SubString(0,2)  
  88.         $Sval +=12;  
  89.         $PropLengthVal = $hexVal.SubString($Sval,4)  
  90.         $PropLengthVal = $PropLengthVal.SubString(2,2) + $PropLengthVal.SubString(0,2)  
  91.         $PropLength = [Convert]::ToInt64($PropLengthVal, 16)  
  92.         $Sval +=4;  
  93.         $ProdIdEntry = $hexVal.SubString($Sval,($PropLength*2))  
  94.         $Sval += ($PropLength*2)  
  95.         $PtypeVal + " : " + $ProdIdEntry  
  96.         $AdditionalRenEntryIdsExCol.Add($PtypeVal,$ProdIdEntry)   
  97.     }     
  98. }  
  99.   
  100. function ConvertFolderid($hexId){  
  101.     $aiItem = New-Object Microsoft.Exchange.WebServices.Data.AlternateId    
  102.     $aiItem.Mailbox = $MailboxName    
  103.     $aiItem.UniqueId = $hexId  
  104.     $aiItem.Format = [Microsoft.Exchange.WebServices.Data.IdFormat]::HexEntryId;    
  105.     return $service.ConvertId($aiItem, [Microsoft.Exchange.WebServices.Data.IdFormat]::EWSId)   
  106. }  
  107.   
  108. if($AdditionalRenEntryIdsExCol.ContainsKey("8001")){  
  109.     $siId = ConvertFolderid($AdditionalRenEntryIdsExCol["8001"])  
  110.     $RSSFolderID = new-object Microsoft.Exchange.WebServices.Data.FolderId($siId.UniqueId.ToString())  
  111.     $RSSFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$RSSFolderID)  
  112.     $RSSFolder  
  113. }  

Friday, January 18, 2013

Creating a new Calendar,Contacts,Tasks or Notes Sub Folder in EWS with Powershell

I've had a few questions about this in the past week so I thought I would put together a quick sample to show how you can create a new Folder is EWS and set the FolderClass so it appears as a Calendar, Contacts, Tasks, Notes or whatever other folder you want. This is a function so you can just cut and paste it into your own script to use. The full script looks like the following which has samples of using the function at the bottom.

  1. ## Get the Mailbox to Access from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4.   
  5. ## Load Managed API dll    
  6. Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"    
  7.     
  8. ## Set Exchange Version    
  9. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2    
  10.     
  11. ## Create Exchange Service Object    
  12. $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)    
  13.     
  14. ## Set Credentials to use two options are availible Option1 to use explict credentials or Option 2 use the Default (logged On) credentials    
  15.     
  16. #Credentials Option 1 using UPN for the windows Account    
  17. $psCred = Get-Credhttp://www.blogger.com/blogger.g?blogID=7123450#editor/target=post;postID=2287688273890342518ential    
  18. $creds = New-Object System.Net.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  19. $service.Credentials = $creds        
  20.     
  21. #Credentials Option 2    
  22. #service.UseDefaultCredentials = $true    
  23.     
  24. ## Choose to ignore any SSL Warning issues caused by Self Signed Certificates    
  25.     
  26. ## Code From http://poshcode.org/624  
  27. ## Create a compilation environment  
  28. $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider  
  29. $Compiler=$Provider.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 Local.ToolkitExtensions.Net.CertificatePolicy{ 
  38.     public class TrustAll : System.Net.ICertificatePolicy { 
  39.       public TrustAll() {  
  40.       } 
  41.       public bool CheckValidationResult(System.Net.ServicePoint sp, 
  42.         System.Security.Cryptography.X509Certificates.X509Certificate cert,  
  43.         System.Net.WebRequest req, int problem) { 
  44.         return true; 
  45.       } 
  46.     } 
  47.   } 
  48. '@   
  49. $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)  
  50. $TAAssembly=$TAResults.CompiledAssembly  
  51.   
  52. ## We now create an instance of the TrustAll and attach it to the ServicePointManager  
  53. $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")  
  54. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  55.   
  56. ## end code from http://poshcode.org/624  
  57.     
  58. ## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use    
  59.     
  60. #CAS URL Option 1 Autodiscover    
  61. $service.AutodiscoverUrl($MailboxName,{$true})    
  62. "Using CAS Server : " + $Service.url     
  63.      
  64. #CAS URL Option 2 Hardcoded    
  65.     
  66. #$uri=[system.URI] "https://casservername/ews/exchange.asmx"    
  67. #$service.Url = $uri      
  68.     
  69. ## Optional section for Exchange Impersonation    
  70.     
  71. #$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  72.   
  73. function Create-Folder{  
  74.     param (  
  75.             $ParentFolderID = "$( throw 'Enter Id of Parent Folder' )",  
  76.             $FolderName = "$( throw 'Enter Folder Name' )",  
  77.             $FolderClass = "$( throw 'Enter Folder Class IPF.Note,IPF.Appointment,IPF.Contact,IPF.Task' )"  
  78.           )  
  79.     process{  
  80.       
  81.     $NewFolder = new-object Microsoft.Exchange.WebServices.Data.Folder($service)    
  82.     $NewFolder.DisplayName = $FolderName    
  83.     $NewFolder.FolderClass = $FolderClass  
  84.     try{  
  85.         $NewFolder.Save($ParentFolderID)  
  86.         Write-Host $FolderName + " Folder Created "  
  87.     }  
  88.     catch{  
  89.         "Error : " + $Error[0]  
  90.     }  
  91.       
  92.     }  
  93. }  
  94. #Example use creating a Calendar subFolder  
  95. $ParentId = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$MailboxName)     
  96. Create-Folder -ParentFolderID $ParentId -FolderName "New Calendar Folder Name" -FolderClass "IPF.Appointment"  
  97. #Example use creating a Contacts subFolder  
  98. $ParentId = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Contacts,$MailboxName)     
  99. Create-Folder -ParentFolderID $ParentId -FolderName "New Contact Folder Name" -FolderClass "IPF.Contact"  
  100. #Example use creating a Tasks subFolder  
  101. $ParentId = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Tasks,$MailboxName)     
  102. Create-Folder -ParentFolderID $ParentId -FolderName "New Tasks Folder Name" -FolderClass "IPF.Task"  
  103. #Example use creating a Notes subFolder  
  104. $ParentId = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Notes,$MailboxName)     
  105. Create-Folder -ParentFolderID $ParentId -FolderName "New Notes Folder Name" -FolderClass "IPF.StickyNote"  

Monday, January 07, 2013

Cleaning out the Skeletons in your mailbox by deleting all the Empty folders with EWS and Get-MailboxFolderStatistics

One of the things you may find if your using Archive or Retention policies a lot is that you end up with skeleton folders in your mailbox. Which are basically the old folders trees that are all now empty because the items have been moved to the Archive or aged out of the Mailbox. To see your skeletons you can use the Get-MailboxFolderStatistics cmdlet and something like this to identify user created folders that are empty.

get-mailboxfolderstatistics $MailboxName | Where-Object{$_.FolderType -eq "User Created" -band $_.ItemsInFolderAndSubFolders -eq 0}

If you want to delete those folders there is no cmdlet to do this so you need to use EWS. Following on from my last post we can take the FolderId from Get-MailboxFolderStatistics convert this Id to a EWSId so we can then bind to the folder in EWS and then delete it using the Delete method.

I've put together a sample script to show how to do this by first using the Get-MailboxFolderStatistics and then in EWS ConvertId and Delete (a soft folder deletion).

The script itself isn't really intelligent in that it doesn't delete a Sub-folder before the Root folder if both are empty (it just depends they way they comes out). It just relies on the Try-Catch to ignore any errors and uses the EWS Folder TotalCount property as a secondary check.

As this script deletes things (some of which maybe be hard to recover if you don't want them deleted) you should do your own testing and use at your own risk.

I've put a download copy of this script here the code itself looks like

  1. ## Get the Mailbox to Access from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4.  
  5. ## Load Managed API dll    
  6. Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"    
  7.    
  8. ## Set Exchange Version    
  9. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2    
  10.    
  11. ## Create Exchange Service Object    
  12. $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)    
  13.    
  14. ## Set Credentials to use two options are availible Option1 to use explict credentials or Option 2 use the Default (logged On) credentials    
  15.    
  16. #Credentials Option 1 using UPN for the windows Account    
  17. $psCred = Get-Credential    
  18. $creds = New-Object System.Net.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  19. $service.Credentials = $creds        
  20.    
  21. #Credentials Option 2    
  22. #service.UseDefaultCredentials = $true    
  23.    
  24. ## Choose to ignore any SSL Warning issues caused by Self Signed Certificates    
  25.    
  26. ## Code From http://poshcode.org/624  
  27. ## Create a compilation environment  
  28. $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider  
  29. $Compiler=$Provider.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 Local.ToolkitExtensions.Net.CertificatePolicy{ 
  38.     public class TrustAll : System.Net.ICertificatePolicy { 
  39.       public TrustAll() {  
  40.       } 
  41.       public bool CheckValidationResult(System.Net.ServicePoint sp, 
  42.         System.Security.Cryptography.X509Certificates.X509Certificate cert,  
  43.         System.Net.WebRequest req, int problem) { 
  44.         return true; 
  45.       } 
  46.     } 
  47.   } 
  48. '@   
  49. $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)  
  50. $TAAssembly=$TAResults.CompiledAssembly  
  51.  
  52. ## We now create an instance of the TrustAll and attach it to the ServicePointManager  
  53. $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")  
  54. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  55.  
  56. ## end code from http://poshcode.org/624  
  57.    
  58. ## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use    
  59.    
  60. #CAS URL Option 1 Autodiscover    
  61. $service.AutodiscoverUrl($MailboxName,{$true})    
  62. "Using CAS Server : " + $Service.url     
  63.     
  64. #CAS URL Option 2 Hardcoded    
  65.    
  66. #$uri=[system.URI] "https://casservername/ews/exchange.asmx"    
  67. #$service.Url = $uri      
  68.    
  69. ## Optional section for Exchange Impersonation    
  70.    
  71. #$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  72.   
  73. function ConvertId{      
  74.     param (  
  75.             $OwaId = "$( throw 'OWAId is a mandatory Parameter' )"  
  76.           )  
  77.     process{  
  78.         $aiItem = New-Object Microsoft.Exchange.WebServices.Data.AlternateId        
  79.         $aiItem.Mailbox = $MailboxName        
  80.         $aiItem.UniqueId = $OwaId     
  81.         $aiItem.Format = [Microsoft.Exchange.WebServices.Data.IdFormat]::OwaId        
  82.         $convertedId = $service.ConvertId($aiItem, [Microsoft.Exchange.WebServices.Data.IdFormat]::EwsId)   
  83.         return $convertedId.UniqueId  
  84.     }  
  85. }  
  86.  
  87. ## Get Empty Folders from EMS  
  88.   
  89. get-mailboxfolderstatistics $MailboxName | Where-Object{$_.FolderType -eq "User Created" -band $_.ItemsInFolderAndSubFolders -eq 0} | ForEach-Object{  
  90.     # Bind to the Inbox Folder  
  91.     "Deleting Folder " + $_.FolderPath    
  92.     try{  
  93.         $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId((Convertid $_.FolderId))     
  94.         $ewsFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)       
  95.         if($ewsFolder.TotalCount -eq 0){  
  96.             $ewsFolder.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::SoftDelete)  
  97.             "Folder Deleted"  
  98.         }  
  99.     }  
  100.     catch{  
  101.   
  102.     }  
  103. }  

Tuesday, January 01, 2013

Converting FolderId's from Get-MailboxFolderStatistics to use in EWS

If you are using the Exchange Managed Shell Get-MailboxFolderStatistics cmdlet to track down issues or report on folders and you want to be able to get that same folder in EWS to do something else with it here's is script that you can use to do this. This script uses the ConvertId Operation in EWS to convert the OWAId you get from EMS to a EWSId which you can then use in EWS to bind to the folder.

  1. ## Get the Mailbox to Access from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4.  
  5. ## Load Managed API dll    
  6. Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"    
  7.    
  8. ## Set Exchange Version    
  9. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2    
  10.    
  11. ## Create Exchange Service Object    
  12. $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)    
  13.    
  14. ## Set Credentials to use two options are availible Option1 to use explict credentials or Option 2 use the Default (logged On) credentials    
  15.    
  16. #Credentials Option 1 using UPN for the windows Account    
  17. $psCred = Get-Credential    
  18. $creds = New-Object System.Net.NetworkCredential($psCred.UserName.ToString(),$psCred.GetNetworkCredential().password.ToString())    
  19. $service.Credentials = $creds        
  20.    
  21. #Credentials Option 2    
  22. #service.UseDefaultCredentials = $true    
  23.    
  24. ## Choose to ignore any SSL Warning issues caused by Self Signed Certificates    
  25.    
  26. ## Code From http://poshcode.org/624  
  27. ## Create a compilation environment  
  28. $Provider=New-Object Microsoft.CSharp.CSharpCodeProvider  
  29. $Compiler=$Provider.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 Local.ToolkitExtensions.Net.CertificatePolicy{ 
  38.     public class TrustAll : System.Net.ICertificatePolicy { 
  39.       public TrustAll() {  
  40.       } 
  41.       public bool CheckValidationResult(System.Net.ServicePoint sp, 
  42.         System.Security.Cryptography.X509Certificates.X509Certificate cert,  
  43.         System.Net.WebRequest req, int problem) { 
  44.         return true; 
  45.       } 
  46.     } 
  47.   } 
  48. '@   
  49. $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)  
  50. $TAAssembly=$TAResults.CompiledAssembly  
  51.  
  52. ## We now create an instance of the TrustAll and attach it to the ServicePointManager  
  53. $TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")  
  54. [System.Net.ServicePointManager]::CertificatePolicy=$TrustAll  
  55.  
  56. ## end code from http://poshcode.org/624  
  57.    
  58. ## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use    
  59.    
  60. #CAS URL Option 1 Autodiscover    
  61. $service.AutodiscoverUrl($MailboxName,{$true})    
  62. "Using CAS Server : " + $Service.url     
  63.     
  64. #CAS URL Option 2 Hardcoded    
  65.    
  66. #$uri=[system.URI] "https://casservername/ews/exchange.asmx"    
  67. #$service.Url = $uri      
  68.    
  69. ## Optional section for Exchange Impersonation    
  70.    
  71. #$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  72.   
  73. function ConvertId{      
  74.     param (  
  75.             $OwaId = "$( throw 'OWAId is a mandatory Parameter' )"  
  76.           )  
  77.     process{  
  78.         $aiItem = New-Object Microsoft.Exchange.WebServices.Data.AlternateId        
  79.         $aiItem.Mailbox = $MailboxName        
  80.         $aiItem.UniqueId = $OwaId     
  81.         $aiItem.Format = [Microsoft.Exchange.WebServices.Data.IdFormat]::OwaId        
  82.         $convertedId = $service.ConvertId($aiItem, [Microsoft.Exchange.WebServices.Data.IdFormat]::EwsId)   
  83.         return $convertedId.UniqueId  
  84.     }  
  85. }  
  86.  
  87. ## Get Folder id from EMS and bind to the Folder in EWS
  88.   
  89. get-mailboxfolderstatistics $MailboxName | ForEach-Object{  
  90.     # Bind to the Inbox Folder  
  91.     $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId((Convertid $_.FolderId))     
  92.     $ewsFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)  
  93.     $ewsFolder  
  94. }