by

Including an extra/Shared Mailbox to OWA with EWS and Powershell in Alternate 2013

Including an extra/Shared Mailbox to OWA with EWS and Powershell in Alternate 2013 The flexibility so as to add a shared Mailbox Folders was a function that was launched in Alternate 2010 and carried over into 2013. When an extra Mailbox folder is added this updates an XML configuration documented within the OWA.OtherMailbox FAI Merchandise for this Mailbox.

In Alternate 2010 this consists of an Id to the Folder however in Alternate2013/OWA it simply consists of the PrimarySMTP of the Mailbox your including whereas the folderId is left clean. As a result of this motive this script will not work on a Alternate 2010 server.

Notice : Its necessary to level out even on 2013/Workplace365 the sort of script that modifies the configuration merchandise would additionally not be supported as it could inadvertently corrupt the config doc so it is supplied as is for testing solely.

 The script to do that seems like

  1. ## Get the Mailbox to Entry from the 1st commandline argument  
  2.   
  3. $MailboxName = $args[0]  
  4. $maMailboxToAdd = $args[1]  
  5.   
  6. ## Load Managed API dll    
  7. Add-Sort -Path “C:Program FilesMicrosoftExchangeWeb Services2.0Microsoft.Exchange.WebServices.dll”    
  8.     
  9. ## Set Alternate Model    
  10. $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Alternate2013  
  11.     
  12. ## Create Alternate Service Object    
  13. $service = New-Object Microsoft.Alternate.WebServices.Information.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.Web.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 triggered by Self Signed Certificates    
  26.     
  27. ## Code From http://poshcode.org/624  
  28. ## Create a compilation surroundings  
  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=@ 
  38.   namespace Native.ToolkitExtensions.Web.CertificatePolicy{ 
  39.     public class TrustAll : System.Web.ICertificatePolicy { 
  40.       public TrustAll() {  
  41.       } 
  42.       public bool CheckValidationResult(System.Web.ServicePoint sp, 
  43.         System.Safety.Cryptography.X509Certificates.X509Certificates cert,  
  44.         System.Web.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 (Shopper 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. ## Elective part for Alternate Impersonation    
  71.     
  72. #$service.ImpersonatedUserId = new-object Microsoft.Alternate.WebServices.Information.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName)   
  73.   
  74. $exists = $false;  
  75. $up to date = $false;  
  76. # Bind to the MsgFolderRoot folder    
  77. $folderid= new-object Microsoft.Alternate.WebServices.Information.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName)     
  78. $Root = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)  
  79. #Verify for present Merchandise  
  80. $SfSearchFilter = new-object Microsoft.Alternate.WebServices.Information.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::ItemClass,“IPM.Configuration.OWA.OtherMailbox”)  
  81. $ivItemView =  New-Object Microsoft.Alternate.WebServices.Information.ItemView(1)  
  82. $ivItemView.Traversal =  [Microsoft.Exchange.WebServices.Data.ItemTraversal]::Related  
  83. $fiResults = $service.FindItems($Root.Id,$SfSearchFilter,$ivItemView)  
  84. if($fiResults.Gadgets.Depend -eq 0){  
  85.     Write-Host (“No Config Item found, create new Item”)  
  86.     $UMConfig = New-Object Microsoft.Alternate.WebServices.Information.UserConfiguration -ArgumentList $service  
  87.     $UMConfig.Save(“OWA.OtherMailbox”,$Root.Id)  
  88. }  
  89. else{  
  90.     Write-Host (“Existing Config Item Found”);  
  91. }  
  92. $owaOtherMailbox = [Microsoft.Exchange.WebServices.Data.UserConfiguration]::Bind($service“OWA.OtherMailbox”$Root.Id, [Microsoft.Exchange.WebServices.Data.UserConfigurationProperties]::All);  
  93. #Make certain the server is working 2013 this script would not work on Alternate 2010  
  94. if($service.service.ServerInfo.MajorVersion -ge 15){  
  95.     $xmlConfig = New-Object System.Xml.XmlDocument  
  96.     if ($owaOtherMailbox.XmlData -eq $null)  
  97.     {  
  98.        $xmlConfig.LoadXml(“<OtherMailbox></OtherMailbox>”);  
  99.     }  
  100.     else  
  101.      {  
  102.        $xmlConfig.LoadXml([System.Text.UTF8Encoding]::UTF8.GetString($owaOtherMailbox.XmlData));  
  103.     }  
  104.     if($xmlConfig.OtherMailbox.entry -ne $null){  
  105.         foreach($obMailbox in  $xmlConfig.OtherMailbox.entry){  
  106.             Write-host (“Processing Mailbox : “ + $obMailbox.principalSMTPAddress);  
  107.             if($obMailbox.principalSMTPAddress -eq $maMailboxToAdd.ToLower()){  
  108.                 $exists = $true;  
  109.             }  
  110.         }  
  111.     }  
  112.     if (!$exists)  
  113.     {  
  114.       $ncCol = $service.ResolveName($maMailboxToAdd,[Microsoft.Exchange.WebServices.Data.ResolveNameSearchLocation]::DirectoryOnly,$true);  
  115.       if ($ncCol.Depend -gt 0)  
  116.        {  
  117.             $newmb = $xmlConfig.CreateElement(“entry”);  
  118.             $newmb.SetAttribute(“displayName”$ncCol[0].Contact.DisplayName);  
  119.             $newmb.SetAttribute(“rootFolderId”“”);  
  120.             $newmb.SetAttribute(“principalSMTPAddress”$ncCol[0].Mailbox.Deal with);  
  121.             $newmb.InnerText = “”;  
  122.             $xmlConfig.DocumentElement.AppendChild($newmb);  
  123.             $up to date = $true;  
  124.        }  
  125.     }  
  126.     else  
  127.     {  
  128.         write-host (“Mailbox already added”);  
  129.     }                 
  130.   
  131.     if ($up to date) {  
  132.         $xmlbytes = [System.Text.UTF8Encoding]::UTF8.GetBytes($xmlConfig.OuterXml);  
  133.         $owaOtherMailbox.XmlData = $xmlbytes;  
  134.         $owaOtherMailbox.Replace();  
  135.         write-host (“Config updated”)  
  136.     }  
  137. }