From 2a5b26ba1ce23f70677092477c66e9b253c957ea Mon Sep 17 00:00:00 2001 From: omara Date: Sun, 8 Jan 2012 22:58:57 -0500 Subject: [PATCH 1/3] Exchange SP2 Addressbook Policy Support - Using this code will currently break SP1 or earlier implementation --- .../Exchange2007.cs | 73 +++++++++++++++++-- .../ExchangeTransaction.cs | 9 +++ 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs index efa526fd..d93036a3 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs @@ -754,6 +754,7 @@ namespace WebsitePanel.Providers.HostedSolution info.GlobalAddressList = galId; info.OrganizationId = organizationId; info.Database = databaseId; + } catch (Exception ex) { @@ -838,6 +839,12 @@ namespace WebsitePanel.Providers.HostedSolution transaction.RegisterNewOfflineAddressBook(oabId); UpdateOfflineAddressBook(runSpace, oabId, securityGroupId); info.OfflineAddressBook = oabId; + + //create ABP + string abpId = CreateAddressPolicy(runSpace, organizationId); + transaction.RegisterNewAddressPolicy(abpId); + ExchangeLog.LogInfo(" Address Policy: {0}", abpId); + } catch (Exception ex) { @@ -851,6 +858,8 @@ namespace WebsitePanel.Providers.HostedSolution CloseRunspace(runSpace); } ExchangeLog.LogEnd("CreateOrganizationOfflineAddressBookInternal"); + + return info; } @@ -919,6 +928,19 @@ namespace WebsitePanel.Providers.HostedSolution if (!DeleteOrganizationPublicFolders(runSpace, organizationId)) ret = false; + //delete ABP + + string adpstring = GetAddressPolicyName(organizationId); + try + { + if (!string.IsNullOrEmpty(adpstring)) + DeleteAddressPolicy(runSpace, adpstring); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete Address Policy " + globalAddressList, ex); + } //delete OAB try @@ -1795,6 +1817,7 @@ namespace WebsitePanel.Providers.HostedSolution //transaction.RegisterNewMailbox(id); string windowsEmailAddress = ObjToString(GetPSObjectProperty(result[0], "WindowsEmailAddress")); + string adpstring = GetAddressPolicyName(organizationId); //update mailbox cmd = new Command("Set-Mailbox"); @@ -1805,7 +1828,7 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); cmd.Parameters.Add("PrimarySmtpAddress", upn); cmd.Parameters.Add("WindowsEmailAddress", upn); - + cmd.Parameters.Add("AddressBookPolicy", adpstring); cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); @@ -1814,6 +1837,8 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("RetainDeletedItemsFor", ConvertDaysToEnhancedTimeSpan(keepDeletedItemsDays)); ExecuteShellCommand(runSpace, cmd); + + //update AD object string globalAddressListName = this.GetGlobalAddressListName(organizationId); string globalAddressListDN = this.GetGlobalAddressListDN(runSpace, globalAddressListName); @@ -1916,6 +1941,7 @@ namespace WebsitePanel.Providers.HostedSolution transaction.RegisterNewMailbox(id); string windowsEmailAddress = ObjToString(GetPSObjectProperty(result[0], "WindowsEmailAddress")); + string adpstring = GetAddressPolicyName(organizationId); //update mailbox cmd = new Command("Set-Mailbox"); @@ -1926,7 +1952,7 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); cmd.Parameters.Add("PrimarySmtpAddress", upn); cmd.Parameters.Add("WindowsEmailAddress", upn); - + cmd.Parameters.Add("AddressBookPolicy", adpstring); cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); @@ -4671,7 +4697,7 @@ namespace WebsitePanel.Providers.HostedSolution #endregion - #region Address Lists (GAL, AL, OAB) + #region Address Lists (GAL, AL, OAB, ABP) private string GetAddressListDN(Runspace runSpace, string id) { @@ -4755,7 +4781,6 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("UpdateAddressList"); } - private void DeleteAddressList(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteAddressList"); @@ -4814,7 +4839,6 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("UpdateGlobalAddressList"); } - private void DeleteGlobalAddressList(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteGlobalAddressList"); @@ -4880,6 +4904,41 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("DeleteOfflineAddressBook"); } + private string CreateAddressPolicy(Runspace runSpace, string organizationId) + { + ExchangeLog.LogStart("CreateAddressPolicy"); + + string ABP = GetAddressPolicyName(organizationId); + string AL = GetAddressListName(organizationId); + string GAL = GetGlobalAddressListName(organizationId); + string OAB = GetOfflineAddressBookName(organizationId); + string RL = "All Rooms"; + + Command cmd = new Command("New-AddressBookPolicy"); + cmd.Parameters.Add("Name", ABP); + cmd.Parameters.Add("GlobalAddressList", GAL); + cmd.Parameters.Add("OfflineAddressBook", OAB); + cmd.Parameters.Add("AddressLists", AL); + cmd.Parameters.Add("RoomList", RL); + + + Collection result = ExecuteShellCommand(runSpace, cmd); + string id = GetResultObjectDN(result); + + ExchangeLog.LogEnd("CreateAddressPolicy"); + return id; + } + + private void DeleteAddressPolicy(Runspace runSpace, string id) + { + ExchangeLog.LogStart("DeleteAddressPolicy"); + Command cmd = new Command("Remove-AddressBookPolicy"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("Confirm", false); + ExecuteShellCommand(runSpace, cmd); + ExchangeLog.LogEnd("DeleteAddressList"); + } + private string GetAddressListName(string orgName) { return orgName + " Address List"; @@ -4894,6 +4953,10 @@ namespace WebsitePanel.Providers.HostedSolution { return orgName + " Offline Address Book"; } + private string GetAddressPolicyName(string orgName) + { + return orgName + " Address Policy"; + } #endregion diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs index 503d1343..7708ca78 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs @@ -84,6 +84,14 @@ namespace WebsitePanel.Providers.HostedSolution action.Id = id; Actions.Add(action); } + internal void RegisterNewAddressPolicy(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateAddressPolicy; + action.Id = id; + Actions.Add(action); + } + internal void RegisterNewOfflineAddressBook(string id) { @@ -220,6 +228,7 @@ namespace WebsitePanel.Providers.HostedSolution CreateOrganizationUnit, CreateGlobalAddressList, CreateAddressList, + CreateAddressPolicy, CreateOfflineAddressBook, CreateDistributionGroup, EnableDistributionGroup, From 1ca6c02fd1693f818289b6fea523e452137debe1 Mon Sep 17 00:00:00 2001 From: omara Date: Wed, 11 Jan 2012 20:58:13 -0500 Subject: [PATCH 2/3] Updated ABP Code to check Exchange Version for SP2 and App Setting --- .../Exchange2007.cs | 67 ++++++++++++++----- ...bsitePanel.Providers.HostedSolution.csproj | 34 +++++----- .../Sources/WebsitePanel.Server/Web.config | 2 + 3 files changed, 68 insertions(+), 35 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs index d93036a3..b83b08d0 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs @@ -67,6 +67,7 @@ namespace WebsitePanel.Providers.HostedSolution #region Constants private const string CONFIG_CLEAR_QUERYBASEDN = "WebsitePanel.Exchange.ClearQueryBaseDN"; + private const string CONFIG_ENABLESP2ABP = "WebsitePanel.Exchange.enableSP2abp"; #endregion #region Properties @@ -841,11 +842,19 @@ namespace WebsitePanel.Providers.HostedSolution info.OfflineAddressBook = oabId; //create ABP - string abpId = CreateAddressPolicy(runSpace, organizationId); - transaction.RegisterNewAddressPolicy(abpId); - ExchangeLog.LogInfo(" Address Policy: {0}", abpId); - } + bool enableSP2abp = false; + if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) + enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); + Version exchangeVersion = GetExchangeVersion(); + + if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) + { + string abpId = CreateAddressPolicy(runSpace, organizationId); + transaction.RegisterNewAddressPolicy(abpId); + ExchangeLog.LogInfo(" Address Policy: {0}", abpId); + } + } catch (Exception ex) { ExchangeLog.LogError("CreateOrganizationOfflineAddressBookInternal", ex); @@ -930,16 +939,27 @@ namespace WebsitePanel.Providers.HostedSolution //delete ABP - string adpstring = GetAddressPolicyName(organizationId); - try + bool enableSP2abp = false; + if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) + enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); + Version exchangeVersion = GetExchangeVersion(); + + if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) { - if (!string.IsNullOrEmpty(adpstring)) - DeleteAddressPolicy(runSpace, adpstring); - } - catch (Exception ex) - { - ret = false; - ExchangeLog.LogError("Could not delete Address Policy " + globalAddressList, ex); + + + string adpstring = GetAddressPolicyName(organizationId); + + try + { + if (!string.IsNullOrEmpty(adpstring)) + DeleteAddressPolicy(runSpace, adpstring); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete Address Policy " + globalAddressList, ex); + } } //delete OAB @@ -1770,6 +1790,7 @@ namespace WebsitePanel.Providers.HostedSolution int attempts = 0; string id = null; + Version exchangeVersion = GetExchangeVersion(); try @@ -1828,7 +1849,13 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); cmd.Parameters.Add("PrimarySmtpAddress", upn); cmd.Parameters.Add("WindowsEmailAddress", upn); - cmd.Parameters.Add("AddressBookPolicy", adpstring); + + bool enableSP2abp = false; + if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) + enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); + if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) + cmd.Parameters.Add("AddressBookPolicy", adpstring); + cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); @@ -1849,7 +1876,6 @@ namespace WebsitePanel.Providers.HostedSolution bool clearQueryBaseDN = false; if (ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN] != null) clearQueryBaseDN = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN]); - Version exchangeVersion = GetExchangeVersion(); if (!(clearQueryBaseDN && (exchangeVersion >= new Version(14, 1)))) SetADObjectPropertyValue(mailbox, "msExchQueryBaseDN", globalAddressListDN); @@ -1910,6 +1936,8 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeTransaction transaction = StartTransaction(); Runspace runSpace = null; + Version exchangeVersion = GetExchangeVersion(); + try { runSpace = OpenRunspace(); @@ -1952,7 +1980,13 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); cmd.Parameters.Add("PrimarySmtpAddress", upn); cmd.Parameters.Add("WindowsEmailAddress", upn); - cmd.Parameters.Add("AddressBookPolicy", adpstring); + + bool enableSP2abp = false; + if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) + enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); + if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) + cmd.Parameters.Add("AddressBookPolicy", adpstring); + cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); @@ -1970,7 +2004,6 @@ namespace WebsitePanel.Providers.HostedSolution bool clearQueryBaseDN = false; if (ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN] != null) clearQueryBaseDN = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN]); - Version exchangeVersion = GetExchangeVersion(); if (!(clearQueryBaseDN && (exchangeVersion >= new Version(14, 1)))) SetADObjectPropertyValue(mailbox, "msExchQueryBaseDN", globalAddressListDN); diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj index 70640894..dbdd2a0d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj @@ -15,7 +15,7 @@ 3.5 - v4.0 + v3.5 publish\ true Disk @@ -80,31 +80,31 @@ False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Common.dll + ..\..\Bin\Microsoft.Exchange.Common.dll False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Data.dll + ..\..\Bin\Microsoft.Exchange.Data.dll False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Data.Directory.dll + ..\..\Bin\Microsoft.Exchange.Data.Directory.dll False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Data.Storage.dll + ..\..\Bin\Microsoft.Exchange.Data.Storage.dll False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Diagnostics.dll + ..\..\Bin\Microsoft.Exchange.Diagnostics.dll False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Extensibility.Internal.dll + ..\..\Bin\Microsoft.Exchange.Extensibility.Internal.dll False - ..\..\..\..\..\WebsitePanel.bak\WebsitePanel\Branches\1.2.0\Lib\References\Microsoft\Microsoft.Exchange.Net.dll + ..\..\Bin\Microsoft.Exchange.Net.dll ..\..\Lib\References\Microsoft\Microsoft.SharePoint.dll @@ -123,6 +123,14 @@ + + False + ..\..\..\bin\WebsitePanel.Providers.Base.dll + + + False + ..\..\..\bin\WebsitePanel.Server.Utils.dll + @@ -145,16 +153,6 @@ - - - {684C932A-6C75-46AC-A327-F3689D89EB42} - WebsitePanel.Providers.Base - - - {E91E52F3-9555-4D00-B577-2B1DBDD87CA7} - WebsitePanel.Server.Utils - - diff --git a/WebsitePanel/Sources/WebsitePanel.Server/Web.config b/WebsitePanel/Sources/WebsitePanel.Server/Web.config index 133e5739..dacf072e 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/Web.config +++ b/WebsitePanel/Sources/WebsitePanel.Server/Web.config @@ -8,6 +8,8 @@ + + From d01b735e6f1180c7406dd5b0cdb77ac1c0d32e92 Mon Sep 17 00:00:00 2001 From: omara Date: Wed, 11 Jan 2012 21:02:33 -0500 Subject: [PATCH 3/3] Various changes --- .../WebsitePanel.Providers.HostedSolution/Exchange2007.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs index b83b08d0..a056c350 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs @@ -4969,7 +4969,7 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("Identity", id); cmd.Parameters.Add("Confirm", false); ExecuteShellCommand(runSpace, cmd); - ExchangeLog.LogEnd("DeleteAddressList"); + ExchangeLog.LogEnd("DeleteAddressPolicy"); } private string GetAddressListName(string orgName)