diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs index fe3e9e11..5bf2a416 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs @@ -127,9 +127,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution private System.Threading.SendOrPostCallback GetOrganizationSecurityGroupsPagedOperationCompleted; - private System.Threading.SendOrPostCallback AddUserToSecurityGroupOperationCompleted; + private System.Threading.SendOrPostCallback AddObjectToSecurityGroupOperationCompleted; - private System.Threading.SendOrPostCallback DeleteUserFromSecurityGroupOperationCompleted; + private System.Threading.SendOrPostCallback DeleteObjectFromSecurityGroupOperationCompleted; private System.Threading.SendOrPostCallback GetSecurityGroupsByMemberOperationCompleted; @@ -235,10 +235,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution public event GetOrganizationSecurityGroupsPagedCompletedEventHandler GetOrganizationSecurityGroupsPagedCompleted; /// - public event AddUserToSecurityGroupCompletedEventHandler AddUserToSecurityGroupCompleted; + public event AddObjectToSecurityGroupCompletedEventHandler AddObjectToSecurityGroupCompleted; /// - public event DeleteUserFromSecurityGroupCompletedEventHandler DeleteUserFromSecurityGroupCompleted; + public event DeleteObjectFromSecurityGroupCompletedEventHandler DeleteObjectFromSecurityGroupCompleted; /// public event GetSecurityGroupsByMemberCompletedEventHandler GetSecurityGroupsByMemberCompleted; @@ -2166,112 +2166,112 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution } /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddUserToSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int AddUserToSecurityGroup(int itemId, int userAccountId, string groupName) + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddObjectToSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddObjectToSecurityGroup(int itemId, int accountId, string groupName) { - object[] results = this.Invoke("AddUserToSecurityGroup", new object[] { + object[] results = this.Invoke("AddObjectToSecurityGroup", new object[] { itemId, - userAccountId, + accountId, groupName}); return ((int)(results[0])); } /// - public System.IAsyncResult BeginAddUserToSecurityGroup(int itemId, int userAccountId, string groupName, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginAddObjectToSecurityGroup(int itemId, int accountId, string groupName, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("AddUserToSecurityGroup", new object[] { + return this.BeginInvoke("AddObjectToSecurityGroup", new object[] { itemId, - userAccountId, + accountId, groupName}, callback, asyncState); } /// - public int EndAddUserToSecurityGroup(System.IAsyncResult asyncResult) + public int EndAddObjectToSecurityGroup(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } /// - public void AddUserToSecurityGroupAsync(int itemId, int userAccountId, string groupName) + public void AddObjectToSecurityGroupAsync(int itemId, int accountId, string groupName) { - this.AddUserToSecurityGroupAsync(itemId, userAccountId, groupName, null); + this.AddObjectToSecurityGroupAsync(itemId, accountId, groupName, null); } /// - public void AddUserToSecurityGroupAsync(int itemId, int userAccountId, string groupName, object userState) + public void AddObjectToSecurityGroupAsync(int itemId, int accountId, string groupName, object userState) { - if ((this.AddUserToSecurityGroupOperationCompleted == null)) + if ((this.AddObjectToSecurityGroupOperationCompleted == null)) { - this.AddUserToSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddUserToSecurityGroupOperationCompleted); + this.AddObjectToSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddObjectToSecurityGroupOperationCompleted); } - this.InvokeAsync("AddUserToSecurityGroup", new object[] { + this.InvokeAsync("AddObjectToSecurityGroup", new object[] { itemId, - userAccountId, - groupName}, this.AddUserToSecurityGroupOperationCompleted, userState); + accountId, + groupName}, this.AddObjectToSecurityGroupOperationCompleted, userState); } - private void OnAddUserToSecurityGroupOperationCompleted(object arg) + private void OnAddObjectToSecurityGroupOperationCompleted(object arg) { - if ((this.AddUserToSecurityGroupCompleted != null)) + if ((this.AddObjectToSecurityGroupCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.AddUserToSecurityGroupCompleted(this, new AddUserToSecurityGroupCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.AddObjectToSecurityGroupCompleted(this, new AddObjectToSecurityGroupCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteUserFromSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int DeleteUserFromSecurityGroup(int itemId, int userAccountId, string groupName) + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteObjectFromSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeleteObjectFromSecurityGroup(int itemId, int accountId, string groupName) { - object[] results = this.Invoke("DeleteUserFromSecurityGroup", new object[] { + object[] results = this.Invoke("DeleteObjectFromSecurityGroup", new object[] { itemId, - userAccountId, + accountId, groupName}); return ((int)(results[0])); } /// - public System.IAsyncResult BeginDeleteUserFromSecurityGroup(int itemId, int userAccountId, string groupName, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginDeleteObjectFromSecurityGroup(int itemId, int accountId, string groupName, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeleteUserFromSecurityGroup", new object[] { + return this.BeginInvoke("DeleteObjectFromSecurityGroup", new object[] { itemId, - userAccountId, + accountId, groupName}, callback, asyncState); } /// - public int EndDeleteUserFromSecurityGroup(System.IAsyncResult asyncResult) + public int EndDeleteObjectFromSecurityGroup(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } /// - public void DeleteUserFromSecurityGroupAsync(int itemId, int userAccountId, string groupName) + public void DeleteObjectFromSecurityGroupAsync(int itemId, int accountId, string groupName) { - this.DeleteUserFromSecurityGroupAsync(itemId, userAccountId, groupName, null); + this.DeleteObjectFromSecurityGroupAsync(itemId, accountId, groupName, null); } /// - public void DeleteUserFromSecurityGroupAsync(int itemId, int userAccountId, string groupName, object userState) + public void DeleteObjectFromSecurityGroupAsync(int itemId, int accountId, string groupName, object userState) { - if ((this.DeleteUserFromSecurityGroupOperationCompleted == null)) + if ((this.DeleteObjectFromSecurityGroupOperationCompleted == null)) { - this.DeleteUserFromSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteUserFromSecurityGroupOperationCompleted); + this.DeleteObjectFromSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteObjectFromSecurityGroupOperationCompleted); } - this.InvokeAsync("DeleteUserFromSecurityGroup", new object[] { + this.InvokeAsync("DeleteObjectFromSecurityGroup", new object[] { itemId, - userAccountId, - groupName}, this.DeleteUserFromSecurityGroupOperationCompleted, userState); + accountId, + groupName}, this.DeleteObjectFromSecurityGroupOperationCompleted, userState); } - private void OnDeleteUserFromSecurityGroupOperationCompleted(object arg) + private void OnDeleteObjectFromSecurityGroupOperationCompleted(object arg) { - if ((this.DeleteUserFromSecurityGroupCompleted != null)) + if ((this.DeleteObjectFromSecurityGroupCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteUserFromSecurityGroupCompleted(this, new DeleteUserFromSecurityGroupCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.DeleteObjectFromSecurityGroupCompleted(this, new DeleteObjectFromSecurityGroupCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -3327,18 +3327,18 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] - public delegate void AddUserToSecurityGroupCompletedEventHandler(object sender, AddUserToSecurityGroupCompletedEventArgs e); + public delegate void AddObjectToSecurityGroupCompletedEventHandler(object sender, AddObjectToSecurityGroupCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class AddUserToSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + public partial class AddObjectToSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { private object[] results; - internal AddUserToSecurityGroupCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + internal AddObjectToSecurityGroupCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; @@ -3357,18 +3357,18 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] - public delegate void DeleteUserFromSecurityGroupCompletedEventHandler(object sender, DeleteUserFromSecurityGroupCompletedEventArgs e); + public delegate void DeleteObjectFromSecurityGroupCompletedEventHandler(object sender, DeleteObjectFromSecurityGroupCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteUserFromSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + public partial class DeleteObjectFromSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { private object[] results; - internal DeleteUserFromSecurityGroupCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + internal DeleteObjectFromSecurityGroupCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs index 47d067fb..1513a736 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs @@ -3407,7 +3407,7 @@ namespace WebsitePanel.EnterpriseServer ExchangeDistributionList dl = exchange.GetDistributionListGeneralSettings(accountName); // add meta-item - int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, email, + int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, accountName, displayName, email, false, 0, dl.SAMAccountName, null, 0, null); @@ -3993,7 +3993,8 @@ namespace WebsitePanel.EnterpriseServer List DistributionLists = GetAccounts(itemId, ExchangeAccountType.DistributionList); foreach (ExchangeAccount DistributionAccount in DistributionLists) { - ExchangeDistributionList DistributionList = exchange.GetDistributionListGeneralSettings(DistributionAccount.AccountName); + //ExchangeDistributionList DistributionList = exchange.GetDistributionListGeneralSettings(DistributionAccount.AccountName); + OrganizationSecurityGroup DistributionList = OrganizationController.GetSecurityGroupGeneralSettings(itemId, DistributionAccount.AccountId); foreach (ExchangeAccount member in DistributionList.MembersAccounts) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index d2fb54ce..7a8f6762 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -2514,7 +2514,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - public static int AddUserToSecurityGroup(int itemId, int userAccountId, string groupName) + public static int AddObjectToSecurityGroup(int itemId, int accountId, string groupName) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); @@ -2531,11 +2531,11 @@ namespace WebsitePanel.EnterpriseServer return -1; // load user account - OrganizationUser userAccount = GetAccount(itemId, userAccountId); + ExchangeAccount account = ExchangeServerController.GetAccount(itemId, accountId); Organizations orgProxy = GetOrganizationProxy(org.ServiceId); - orgProxy.AddUserToSecurityGroup(org.OrganizationId, userAccount.AccountName, groupName); + orgProxy.AddObjectToSecurityGroup(org.OrganizationId, account.AccountName, groupName); return 0; } @@ -2549,7 +2549,7 @@ namespace WebsitePanel.EnterpriseServer } } - public static int DeleteUserFromSecurityGroup(int itemId, int userAccountId, string groupName) + public static int DeleteObjectFromSecurityGroup(int itemId, int accountId, string groupName) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); @@ -2566,11 +2566,11 @@ namespace WebsitePanel.EnterpriseServer return -1; // load user account - OrganizationUser userAccount = GetAccount(itemId, userAccountId); + ExchangeAccount account = ExchangeServerController.GetAccount(itemId, accountId); Organizations orgProxy = GetOrganizationProxy(org.ServiceId); - orgProxy.DeleteUserFromSecurityGroup(org.OrganizationId, userAccount.AccountName, groupName); + orgProxy.DeleteObjectFromSecurityGroup(org.OrganizationId, account.AccountName, groupName); return 0; } @@ -2699,8 +2699,8 @@ namespace WebsitePanel.EnterpriseServer if (!includeOnlySecurityGroups) { - accountTypes = string.Format("{0}, {1}, {2}, {3}, {4}", accountTypes, ((int)ExchangeAccountType.User), ((int)ExchangeAccountType.Mailbox), - ((int)ExchangeAccountType.Room), ((int)ExchangeAccountType.Equipment)); + accountTypes = string.Format("{0}, {1}, {2}, {3}, {4}, {5}", accountTypes, ((int)ExchangeAccountType.User), ((int)ExchangeAccountType.Mailbox), + ((int)ExchangeAccountType.Room), ((int)ExchangeAccountType.Equipment), ((int)ExchangeAccountType.DistributionList)); } List tmpAccounts = ObjectUtils.CreateListFromDataReader( @@ -2711,9 +2711,22 @@ namespace WebsitePanel.EnterpriseServer foreach (ExchangeAccount tmpAccount in tmpAccounts.ToArray()) { - if (tmpAccount.AccountType == ExchangeAccountType.SecurityGroup - ? GetSecurityGroupGeneralSettings(itemId, tmpAccount.AccountId) != null - : GetUserGeneralSettings(itemId, tmpAccount.AccountId) != null) + bool bSuccess = false; + + switch (tmpAccount.AccountType) + { + case ExchangeAccountType.SecurityGroup: + bSuccess = GetSecurityGroupGeneralSettings(itemId, tmpAccount.AccountId) != null; + break; + case ExchangeAccountType.DistributionList: + bSuccess = ExchangeServerController.GetDistributionListGeneralSettings(itemId, tmpAccount.AccountId) != null; + break; + default: + bSuccess = GetUserGeneralSettings(itemId, tmpAccount.AccountId) != null; + break; + } + + if (bSuccess) { accounts.Add(tmpAccount); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs index 54d3fa82..951ce0d9 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs @@ -276,15 +276,15 @@ namespace WebsitePanel.EnterpriseServer } [WebMethod] - public int AddUserToSecurityGroup(int itemId, int userAccountId, string groupName) + public int AddObjectToSecurityGroup(int itemId, int accountId, string groupName) { - return OrganizationController.AddUserToSecurityGroup(itemId, userAccountId, groupName); + return OrganizationController.AddObjectToSecurityGroup(itemId, accountId, groupName); } [WebMethod] - public int DeleteUserFromSecurityGroup(int itemId, int userAccountId, string groupName) + public int DeleteObjectFromSecurityGroup(int itemId, int accountId, string groupName) { - return OrganizationController.DeleteUserFromSecurityGroup(itemId, userAccountId, groupName); + return OrganizationController.DeleteObjectFromSecurityGroup(itemId, accountId, groupName); } [WebMethod] diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs index 02a86255..6d9650b5 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs @@ -50,9 +50,9 @@ namespace WebsitePanel.Providers.HostedSolution void SetSecurityGroupGeneralSettings(string organizationId, string groupName, string[] memberAccounts, string notes); - void AddUserToSecurityGroup(string organizationId, string loginName, string groupName); + void AddObjectToSecurityGroup(string organizationId, string accountName, string groupName); - void DeleteUserFromSecurityGroup(string organizationId, string loginName, string groupName); + void DeleteObjectFromSecurityGroup(string organizationId, string accountName, string groupName); void SetUserGeneralSettings(string organizationId, string accountName, string displayName, string password, bool hideFromAddressBook, bool disabled, bool locked, string firstName, string initials, diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs index a21d05b7..7197eb88 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs @@ -5656,7 +5656,7 @@ namespace WebsitePanel.Providers.HostedSolution internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd) { - return ExecuteShellCommand(runSpace, cmd, true); + return ExecuteShellCommand(runSpace, cmd, false); } internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs index 82bba885..9d7760a8 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs @@ -1027,60 +1027,60 @@ namespace WebsitePanel.Providers.HostedSolution entry.CommitChanges(); } - public void AddUserToSecurityGroup(string organizationId, string loginName, string groupName) + public void AddObjectToSecurityGroup(string organizationId, string accountName, string groupName) { - AddUserToSecurityGroupInternal(organizationId, loginName, groupName); + AddObjectToSecurityGroupInternal(organizationId, accountName, groupName); } - internal void AddUserToSecurityGroupInternal(string organizationId, string loginName, string groupName) + internal void AddObjectToSecurityGroupInternal(string organizationId, string accountName, string groupName) { HostedSolutionLog.LogStart("AddUserToSecurityGroupInternal"); HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); - HostedSolutionLog.DebugInfo("loginName : {0}", loginName); + HostedSolutionLog.DebugInfo("accountName : {0}", accountName); HostedSolutionLog.DebugInfo("groupName : {0}", groupName); if (string.IsNullOrEmpty(organizationId)) throw new ArgumentNullException("organizationId"); - if (string.IsNullOrEmpty(loginName)) + if (string.IsNullOrEmpty(accountName)) throw new ArgumentNullException("loginName"); if (string.IsNullOrEmpty(groupName)) throw new ArgumentNullException("groupName"); - string userPath = GetUserPath(organizationId, loginName); + string objectPath = GetObjectPath(organizationId, accountName); string groupPath = GetGroupPath(organizationId, groupName); - ActiveDirectoryUtils.AddObjectToGroup(userPath, groupPath); + ActiveDirectoryUtils.AddObjectToGroup(objectPath, groupPath); } - public void DeleteUserFromSecurityGroup(string organizationId, string loginName, string groupName) + public void DeleteObjectFromSecurityGroup(string organizationId, string accountName, string groupName) { - DeleteUserFromSecurityGroupInternal(organizationId, loginName, groupName); + DeleteObjectFromSecurityGroupInternal(organizationId, accountName, groupName); } - internal void DeleteUserFromSecurityGroupInternal(string organizationId, string loginName, string groupName) + internal void DeleteObjectFromSecurityGroupInternal(string organizationId, string accountName, string groupName) { HostedSolutionLog.LogStart("AddUserToSecurityGroupInternal"); HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); - HostedSolutionLog.DebugInfo("loginName : {0}", loginName); + HostedSolutionLog.DebugInfo("accountName : {0}", accountName); HostedSolutionLog.DebugInfo("groupName : {0}", groupName); if (string.IsNullOrEmpty(organizationId)) throw new ArgumentNullException("organizationId"); - if (string.IsNullOrEmpty(loginName)) + if (string.IsNullOrEmpty(accountName)) throw new ArgumentNullException("loginName"); if (string.IsNullOrEmpty(groupName)) throw new ArgumentNullException("groupName"); - string userPath = GetUserPath(organizationId, loginName); + string objectPath = GetObjectPath(organizationId, accountName); string groupPath = GetGroupPath(organizationId, groupName); - ActiveDirectoryUtils.RemoveObjectFromGroup(userPath, groupPath); + ActiveDirectoryUtils.RemoveObjectFromGroup(objectPath, groupPath); } #endregion @@ -1089,7 +1089,5 @@ namespace WebsitePanel.Providers.HostedSolution { return Environment.UserDomainName != Environment.MachineName; } - - } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs index 260fba07..ef573e31 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs @@ -85,9 +85,9 @@ namespace WebsitePanel.Providers.HostedSolution private System.Threading.SendOrPostCallback SetSecurityGroupGeneralSettingsOperationCompleted; - private System.Threading.SendOrPostCallback AddUserToSecurityGroupOperationCompleted; + private System.Threading.SendOrPostCallback AddObjectToSecurityGroupOperationCompleted; - private System.Threading.SendOrPostCallback DeleteUserFromSecurityGroupOperationCompleted; + private System.Threading.SendOrPostCallback DeleteObjectFromSecurityGroupOperationCompleted; private System.Threading.SendOrPostCallback SetUserGeneralSettingsOperationCompleted; @@ -142,10 +142,10 @@ namespace WebsitePanel.Providers.HostedSolution public event SetSecurityGroupGeneralSettingsCompletedEventHandler SetSecurityGroupGeneralSettingsCompleted; /// - public event AddUserToSecurityGroupCompletedEventHandler AddUserToSecurityGroupCompleted; + public event AddObjectToSecurityGroupCompletedEventHandler AddObjectToSecurityGroupCompleted; /// - public event DeleteUserFromSecurityGroupCompletedEventHandler DeleteUserFromSecurityGroupCompleted; + public event DeleteObjectFromSecurityGroupCompletedEventHandler DeleteObjectFromSecurityGroupCompleted; /// public event SetUserGeneralSettingsCompletedEventHandler SetUserGeneralSettingsCompleted; @@ -704,109 +704,109 @@ namespace WebsitePanel.Providers.HostedSolution /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddUserToSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void AddUserToSecurityGroup(string organizationId, string loginName, string groupName) + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddObjectToSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void AddObjectToSecurityGroup(string organizationId, string accountName, string groupName) { - this.Invoke("AddUserToSecurityGroup", new object[] { + this.Invoke("AddObjectToSecurityGroup", new object[] { organizationId, - loginName, + accountName, groupName}); } /// - public System.IAsyncResult BeginAddUserToSecurityGroup(string organizationId, string loginName, string groupName, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginAddObjectToSecurityGroup(string organizationId, string accountName, string groupName, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("AddUserToSecurityGroup", new object[] { + return this.BeginInvoke("AddObjectToSecurityGroup", new object[] { organizationId, - loginName, + accountName, groupName}, callback, asyncState); } /// - public void EndAddUserToSecurityGroup(System.IAsyncResult asyncResult) + public void EndAddObjectToSecurityGroup(System.IAsyncResult asyncResult) { this.EndInvoke(asyncResult); } /// - public void AddUserToSecurityGroupAsync(string organizationId, string loginName, string groupName) + public void AddObjectToSecurityGroupAsync(string organizationId, string accountName, string groupName) { - this.AddUserToSecurityGroupAsync(organizationId, loginName, groupName, null); + this.AddObjectToSecurityGroupAsync(organizationId, accountName, groupName, null); } /// - public void AddUserToSecurityGroupAsync(string organizationId, string loginName, string groupName, object userState) + public void AddObjectToSecurityGroupAsync(string organizationId, string accountName, string groupName, object userState) { - if ((this.AddUserToSecurityGroupOperationCompleted == null)) + if ((this.AddObjectToSecurityGroupOperationCompleted == null)) { - this.AddUserToSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddUserToSecurityGroupOperationCompleted); + this.AddObjectToSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddObjectToSecurityGroupOperationCompleted); } - this.InvokeAsync("AddUserToSecurityGroup", new object[] { + this.InvokeAsync("AddObjectToSecurityGroup", new object[] { organizationId, - loginName, - groupName}, this.AddUserToSecurityGroupOperationCompleted, userState); + accountName, + groupName}, this.AddObjectToSecurityGroupOperationCompleted, userState); } - private void OnAddUserToSecurityGroupOperationCompleted(object arg) + private void OnAddObjectToSecurityGroupOperationCompleted(object arg) { - if ((this.AddUserToSecurityGroupCompleted != null)) + if ((this.AddObjectToSecurityGroupCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.AddUserToSecurityGroupCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.AddObjectToSecurityGroupCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteUserFromSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void DeleteUserFromSecurityGroup(string organizationId, string loginName, string groupName) + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteObjectFromSecurityGroup", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void DeleteObjectFromSecurityGroup(string organizationId, string accountName, string groupName) { - this.Invoke("DeleteUserFromSecurityGroup", new object[] { + this.Invoke("DeleteObjectFromSecurityGroup", new object[] { organizationId, - loginName, + accountName, groupName}); } /// - public System.IAsyncResult BeginDeleteUserFromSecurityGroup(string organizationId, string loginName, string groupName, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginDeleteObjectFromSecurityGroup(string organizationId, string accountName, string groupName, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeleteUserFromSecurityGroup", new object[] { + return this.BeginInvoke("DeleteObjectFromSecurityGroup", new object[] { organizationId, - loginName, + accountName, groupName}, callback, asyncState); } /// - public void EndDeleteUserFromSecurityGroup(System.IAsyncResult asyncResult) + public void EndDeleteObjectFromSecurityGroup(System.IAsyncResult asyncResult) { this.EndInvoke(asyncResult); } /// - public void DeleteUserFromSecurityGroupAsync(string organizationId, string loginName, string groupName) + public void DeleteObjectFromSecurityGroupAsync(string organizationId, string accountName, string groupName) { - this.DeleteUserFromSecurityGroupAsync(organizationId, loginName, groupName, null); + this.DeleteObjectFromSecurityGroupAsync(organizationId, accountName, groupName, null); } /// - public void DeleteUserFromSecurityGroupAsync(string organizationId, string loginName, string groupName, object userState) + public void DeleteObjectFromSecurityGroupAsync(string organizationId, string accountName, string groupName, object userState) { - if ((this.DeleteUserFromSecurityGroupOperationCompleted == null)) + if ((this.DeleteObjectFromSecurityGroupOperationCompleted == null)) { - this.DeleteUserFromSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteUserFromSecurityGroupOperationCompleted); + this.DeleteObjectFromSecurityGroupOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteObjectFromSecurityGroupOperationCompleted); } - this.InvokeAsync("DeleteUserFromSecurityGroup", new object[] { + this.InvokeAsync("DeleteObjectFromSecurityGroup", new object[] { organizationId, - loginName, - groupName}, this.DeleteUserFromSecurityGroupOperationCompleted, userState); + accountName, + groupName}, this.DeleteObjectFromSecurityGroupOperationCompleted, userState); } - private void OnDeleteUserFromSecurityGroupOperationCompleted(object arg) + private void OnDeleteObjectFromSecurityGroupOperationCompleted(object arg) { - if ((this.DeleteUserFromSecurityGroupCompleted != null)) + if ((this.DeleteObjectFromSecurityGroupCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteUserFromSecurityGroupCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.DeleteObjectFromSecurityGroupCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -1619,11 +1619,11 @@ namespace WebsitePanel.Providers.HostedSolution /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] - public delegate void AddUserToSecurityGroupCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + public delegate void AddObjectToSecurityGroupCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] - public delegate void DeleteUserFromSecurityGroupCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + public delegate void DeleteObjectFromSecurityGroupCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] diff --git a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs index 33d87aed..419d0ac1 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs @@ -135,15 +135,15 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public void AddUserToSecurityGroup(string organizationId, string loginName, string groupName) + public void AddObjectToSecurityGroup(string organizationId, string accountName, string groupName) { - Organization.AddUserToSecurityGroup(organizationId, loginName, groupName); + Organization.AddObjectToSecurityGroup(organizationId, accountName, groupName); } [WebMethod, SoapHeader("settings")] - public void DeleteUserFromSecurityGroup(string organizationId, string loginName, string groupName) + public void DeleteObjectFromSecurityGroup(string organizationId, string accountName, string groupName) { - Organization.DeleteUserFromSecurityGroup(organizationId, loginName, groupName); + Organization.DeleteObjectFromSecurityGroup(organizationId, accountName, groupName); } [WebMethod, SoapHeader("settings")] diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config index cdbb540b..26ba29ee 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config @@ -548,6 +548,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index 2a2994d6..aee77d67 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -5328,5 +5328,19 @@ Phone Numbers per Organization + + Error creating user. See audit log for more details. + + + Error creating security group. See audit log for more details. + + + Error reading group settings + + + Error updating group settings + + + Group general settings have been successfully updated. \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroupMemberOf.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroupMemberOf.ascx.resx new file mode 100644 index 00000000..8f9aefbc --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroupMemberOf.ascx.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Updating...'); + + + Save Changes + + + Edit Group + + + General + + + Groups + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx index e55e65e6..474aaa0c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx @@ -2,7 +2,7 @@ <%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> <%@ Register Src="UserControls/AccountsList.ascx" TagName="AccountsList" TagPrefix="wsp" %> <%@ Register Src="UserControls/MailboxSelector.ascx" TagName="MailboxSelector" TagPrefix="wsp" %> -<%@ Register Src="UserControls/DistributionListTabs.ascx" TagName="DistributionListTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/SecurityGroupTabs.ascx" TagName="SecurityGroupTabs" TagPrefix="wsp" %> <%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> <%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> <%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> @@ -27,15 +27,15 @@
- + - - + + - groupsList = new List(); + foreach (ExchangeAccount distList in dLists) + { + groupsList.Add(distList); + } + + foreach (ExchangeAccount secGroup in secGroups) + { + groupsList.Add(secGroup); + } + + groups.SetAccounts(groupsList.ToArray()); } catch (Exception ex) @@ -83,18 +96,53 @@ namespace WebsitePanel.Portal.ExchangeServer try { - ExchangeAccount[] oldDistributionLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); - List newDistributionLists = new List(distrlists.GetAccounts()); - foreach (ExchangeAccount oldlist in oldDistributionLists) + ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + + IList oldGroups = new List(); + foreach (ExchangeAccount distList in oldSecGroups) { - if (newDistributionLists.Contains(oldlist.AccountName)) - newDistributionLists.Remove(oldlist.AccountName); - else - ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldlist.AccountName, PanelRequest.AccountID); + oldGroups.Add(distList); } - foreach (string newlist in newDistributionLists) - ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newlist, PanelRequest.AccountID); + foreach (ExchangeAccount secGroup in oldDistLists) + { + oldGroups.Add(secGroup); + } + + IDictionary newGroups = groups.GetFullAccounts(); + foreach (ExchangeAccount oldGroup in oldGroups) + { + if (newGroups.ContainsKey(oldGroup.AccountName)) + { + newGroups.Remove(oldGroup.AccountName); + } + else + { + switch (oldGroup.AccountType) + { + case ExchangeAccountType.DistributionList: + ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldGroup.AccountName, PanelRequest.AccountID); + break; + case ExchangeAccountType.SecurityGroup: + ES.Services.Organizations.DeleteObjectFromSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, oldGroup.AccountName); + break; + } + } + } + + foreach (KeyValuePair newGroup in newGroups) + { + switch (newGroup.Value) + { + case ExchangeAccountType.DistributionList: + ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newGroup.Key, PanelRequest.AccountID); + break; + case ExchangeAccountType.SecurityGroup: + ES.Services.Organizations.AddObjectToSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, newGroup.Key); + break; + } + } messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_SETTINGS"); BindSettings(); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx.designer.cs index 4cd03a2d..4344aefe 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMemberOf.ascx.designer.cs @@ -1,3 +1,31 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -73,7 +101,7 @@ namespace WebsitePanel.Portal.ExchangeServer { /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.DistributionListTabs tabs; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SecurityGroupTabs tabs; /// /// messageBox control. @@ -85,22 +113,22 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; /// - /// secDistributionLists control. + /// secGroups control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.CollapsiblePanel secDistributionLists; + protected global::WebsitePanel.Portal.CollapsiblePanel secGroups; /// - /// DistributionLists control. + /// GroupsPanel control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Panel DistributionLists; + protected global::System.Web.UI.WebControls.Panel GroupsPanel; /// /// GeneralUpdatePanel control. @@ -112,13 +140,13 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; /// - /// distrlists control. + /// groups control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList distrlists; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups; /// /// btnSave control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx index 9e8c82cb..f60842ea 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx @@ -32,12 +32,12 @@ - - + + - groupsList = new List(); + foreach (ExchangeAccount distList in dLists) + { + groupsList.Add(distList); + } + + foreach (ExchangeAccount secGroup in securGroups) + { + groupsList.Add(secGroup); + } + + groups.SetAccounts(groupsList.ToArray()); } catch (Exception ex) @@ -78,18 +92,53 @@ namespace WebsitePanel.Portal.ExchangeServer try { - ExchangeAccount[] oldDistributionLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); - List newDistributionLists = new List(distrlists.GetAccounts()); - foreach (ExchangeAccount oldlist in oldDistributionLists) + ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + + IList oldGroups = new List(); + foreach (ExchangeAccount distList in oldSecGroups) { - if (newDistributionLists.Contains(oldlist.AccountName)) - newDistributionLists.Remove(oldlist.AccountName); - else - ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldlist.AccountName, PanelRequest.AccountID); + oldGroups.Add(distList); } - foreach (string newlist in newDistributionLists) - ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newlist, PanelRequest.AccountID); + foreach (ExchangeAccount secGroup in oldDistLists) + { + oldGroups.Add(secGroup); + } + + IDictionary newGroups = groups.GetFullAccounts(); + foreach (ExchangeAccount oldGroup in oldGroups) + { + if (newGroups.ContainsKey(oldGroup.AccountName)) + { + newGroups.Remove(oldGroup.AccountName); + } + else + { + switch (oldGroup.AccountType) + { + case ExchangeAccountType.DistributionList: + ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldGroup.AccountName, PanelRequest.AccountID); + break; + case ExchangeAccountType.SecurityGroup: + ES.Services.Organizations.DeleteObjectFromSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, oldGroup.AccountName); + break; + } + } + } + + foreach (KeyValuePair newGroup in newGroups) + { + switch (newGroup.Value) + { + case ExchangeAccountType.DistributionList: + ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newGroup.Key, PanelRequest.AccountID); + break; + case ExchangeAccountType.SecurityGroup: + ES.Services.Organizations.AddObjectToSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, newGroup.Key); + break; + } + } messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS"); BindSettings(); @@ -104,7 +153,5 @@ namespace WebsitePanel.Portal.ExchangeServer { SaveSettings(); } - - } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx.designer.cs index 8ae1757e..cf9f3e20 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMemberOf.ascx.designer.cs @@ -1,3 +1,31 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -85,22 +113,22 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; /// - /// secDistributionLists control. + /// secGroups control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.CollapsiblePanel secDistributionLists; + protected global::WebsitePanel.Portal.CollapsiblePanel secGroups; /// - /// DistributionLists control. + /// GroupsPanel control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Panel DistributionLists; + protected global::System.Web.UI.WebControls.Panel GroupsPanel; /// /// GeneralUpdatePanel control. @@ -112,13 +140,13 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; /// - /// distrlists control. + /// groups control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList distrlists; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups; /// /// btnSave control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs index 0d251711..a22efa38 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs @@ -128,7 +128,7 @@ namespace WebsitePanel.Portal.HostedSolution } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_CREATE_MAILBOX", ex); + messageBox.ShowErrorMessage("ORGANIZATION_CREATE_USER", ex); } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx new file mode 100644 index 00000000..936319d7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx @@ -0,0 +1,59 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OrganizationSecurityGroupMemberOf.ascx.cs" Inherits="WebsitePanel.Portal.HostedSolution.OrganizationSecurityGroupMemberOf" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> + +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/AccountsList.ascx" TagName="AccountsList" TagPrefix="wsp" %> +<%@ Register Src="UserControls/SecurityGroupTabs.ascx" TagName="SecurityGroupTabs" TagPrefix="wsp"%> + + + +
+
+
+ +
+
+ +
+
+
+
+ + + - + +
+ +
+ + + + + + + + + + + + + + +
+ + +
+
+
+
+
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx.cs new file mode 100644 index 00000000..92ccfc77 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx.cs @@ -0,0 +1,141 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Web.UI.WebControls; +using System.Collections.Generic; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.HostedSolution +{ + public partial class OrganizationSecurityGroupMemberOf : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindSettings(); + } + } + + private void BindSettings() + { + try + { + // get settings + OrganizationSecurityGroup group = ES.Services.Organizations.GetSecurityGroupGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); + //OrganizationUser user = ES.Services.Organizations.GetUserGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); + + litDisplayName.Text = group.DisplayName; + + //Distribution Lists + ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + + //Security Groups + ExchangeAccount[] securGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + + List groupsList = new List(); + foreach (ExchangeAccount distList in dLists) + { + groupsList.Add(distList); + } + + foreach (ExchangeAccount secGroup in securGroups) + { + groupsList.Add(secGroup); + } + + groups.SetAccounts(groupsList.ToArray()); + + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("ORGANIZATION_GET_GROUP_SETTINGS", ex); + } + } + + private void SaveSettings() + { + if (!Page.IsValid) + return; + + try + { + ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + + IList oldGroups = new List(); + foreach (ExchangeAccount distList in oldSecGroups) + { + oldGroups.Add(distList); + } + + foreach (ExchangeAccount secGroup in oldDistLists) + { + oldGroups.Add(secGroup); + } + + IDictionary newGroups = groups.GetFullAccounts(); + foreach (ExchangeAccount oldGroup in oldGroups) + { + if (newGroups.ContainsKey(oldGroup.AccountName)) + { + newGroups.Remove(oldGroup.AccountName); + } + else + { + ES.Services.Organizations.DeleteObjectFromSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, oldGroup.AccountName); + } + } + + foreach (KeyValuePair newGroup in newGroups) + { + ES.Services.Organizations.AddObjectToSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, newGroup.Key); + } + + messageBox.ShowSuccessMessage("ORGANIZATION_UPDATE_SECURITY_GROUP_SETTINGS"); + + + BindSettings(); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("ORGANIZATION_UPDATE_SECURITY_GROUP_SETTINGS", ex); + } + } + + protected void btnSave_Click(object sender, EventArgs e) + { + SaveSettings(); + } + + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx.designer.cs new file mode 100644 index 00000000..26e24876 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupMemberOf.ascx.designer.cs @@ -0,0 +1,169 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.HostedSolution { + + + public partial class OrganizationSecurityGroupMemberOf { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// litDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litDisplayName; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SecurityGroupTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secGroups control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secGroups; + + /// + /// GroupsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel GroupsPanel; + + /// + /// GeneralUpdatePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; + + /// + /// groups control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups; + + /// + /// btnSave control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSave; + + /// + /// ValidationSummary1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx index 36c12744..03e0181c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx @@ -43,27 +43,17 @@ - - - + + + - - - - - - - - - - - - + DistributionListsEnabled="true" + SecurityGroupsEnabled="true" /> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.cs index cf175d4a..72cbe1dc 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.cs @@ -44,6 +44,7 @@ namespace WebsitePanel.Portal.HostedSolution BindSettings(); MailboxTabsId.Visible = (PanelRequest.Context == "Mailbox"); + UserTabsId.Visible = (PanelRequest.Context == "User"); } } @@ -53,26 +54,37 @@ namespace WebsitePanel.Portal.HostedSolution try { // get settings - ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxGeneralSettings(PanelRequest.ItemID, - PanelRequest.AccountID); + OrganizationUser user = ES.Services.Organizations.GetUserGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); - // title - litDisplayName.Text = mailbox.DisplayName; - + groups.DistributionListsEnabled = (user.AccountType == ExchangeAccountType.Mailbox + || user.AccountType == ExchangeAccountType.Room + || user.AccountType == ExchangeAccountType.Equipment); + + litDisplayName.Text = user.DisplayName; + //Distribution Lists ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); - distrlists.SetAccounts(dLists); - //Security Groups ExchangeAccount[] securGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); - securegroups.SetAccounts(securGroups); + List groupsList = new List(); + foreach (ExchangeAccount distList in dLists) + { + groupsList.Add(distList); + } + + foreach (ExchangeAccount secGroup in securGroups) + { + groupsList.Add(secGroup); + } + + groups.SetAccounts(groupsList.ToArray()); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_SETTINGS", ex); + messageBox.ShowErrorMessage("ORGANIZATION_GET_USER_SETTINGS", ex); } } @@ -83,48 +95,62 @@ namespace WebsitePanel.Portal.HostedSolution try { - //Distribution Lists - ExchangeAccount[] oldDistributionLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); - List newDistributionLists = new List(distrlists.GetAccounts()); - foreach (ExchangeAccount oldlist in oldDistributionLists) + ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); + + IList oldGroups = new List(); + foreach (ExchangeAccount distList in oldSecGroups) { - if (newDistributionLists.Contains(oldlist.AccountName)) - newDistributionLists.Remove(oldlist.AccountName); - else - ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldlist.AccountName, PanelRequest.AccountID); + oldGroups.Add(distList); } - foreach (string newlist in newDistributionLists) - ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newlist, PanelRequest.AccountID); - - //Security Groups - ExchangeAccount[] oldDSecurityGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); - List newSecurityGroups = new List(securegroups.GetAccounts()); - foreach (ExchangeAccount oldgroup in oldDSecurityGroups) + foreach (ExchangeAccount secGroup in oldDistLists) { - if (newSecurityGroups.Contains(oldgroup.AccountName)) + oldGroups.Add(secGroup); + } + + IDictionary newGroups = groups.GetFullAccounts(); + foreach (ExchangeAccount oldGroup in oldGroups) + { + if (newGroups.ContainsKey(oldGroup.AccountName)) { - newSecurityGroups.Remove(oldgroup.AccountName); + newGroups.Remove(oldGroup.AccountName); } else { - ES.Services.Organizations.DeleteUserFromSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, oldgroup.AccountName); + switch (oldGroup.AccountType) + { + case ExchangeAccountType.DistributionList: + ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldGroup.AccountName, PanelRequest.AccountID); + break; + case ExchangeAccountType.SecurityGroup: + ES.Services.Organizations.DeleteObjectFromSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, oldGroup.AccountName); + break; + } } } - foreach (string newgroup in newSecurityGroups) + foreach (KeyValuePair newGroup in newGroups) { - ES.Services.Organizations.AddUserToSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, newgroup); + switch (newGroup.Value) + { + case ExchangeAccountType.DistributionList: + ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newGroup.Key, PanelRequest.AccountID); + break; + case ExchangeAccountType.SecurityGroup: + ES.Services.Organizations.AddObjectToSecurityGroup(PanelRequest.ItemID, PanelRequest.AccountID, newGroup.Key); + break; + } } - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS"); + messageBox.ShowSuccessMessage("ORGANIZATION_UPDATE_USER_SETTINGS"); BindSettings(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS", ex); + messageBox.ShowErrorMessage("ORGANIZATION_UPDATE_USER_SETTINGS", ex); } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.designer.cs index 07a67d81..e184f834 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserMemberOf.ascx.designer.cs @@ -123,76 +123,40 @@ namespace WebsitePanel.Portal.HostedSolution { protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; /// - /// secDistributionLists control. + /// secGroups control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.CollapsiblePanel secDistributionLists; + protected global::WebsitePanel.Portal.CollapsiblePanel secGroups; /// - /// DistributionListsPanel control. + /// GroupsPanel control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Panel DistributionListsPanel; + protected global::System.Web.UI.WebControls.Panel GroupsPanel; /// - /// DLGeneralUpdatePanel control. + /// GeneralUpdatePanel control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.UpdatePanel DLGeneralUpdatePanel; + protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; /// - /// distrlists control. + /// groups control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList distrlists; - - /// - /// secSecurityGroups control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secSecurityGroups; - - /// - /// SecurityGroupsPanel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel SecurityGroupsPanel; - - /// - /// SCGeneralUpdatePanel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.UpdatePanel SCGeneralUpdatePanel; - - /// - /// securegroups control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.GroupsList securegroups; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups; /// /// btnSave control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx index d0a54064..75e858da 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx @@ -37,6 +37,13 @@ + + + + + + + @@ -111,6 +118,12 @@ + + + + + +
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx.cs index 6884ce2c..ae1f7d0e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/AccountsList.ascx.cs @@ -27,6 +27,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Linq; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.WebControls; @@ -83,16 +84,31 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls BindAccounts(accounts, false); } - public string[] GetAccounts() + public string[] GetAccounts() + { + // get selected accounts + List selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.All); + + List accountNames = new List(); + foreach (ExchangeAccount account in selectedAccounts) + accountNames.Add(account.AccountName); + + return accountNames.ToArray(); + } + + public IDictionary GetFullAccounts() { // get selected accounts List selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.All); - List accountNames = new List(); - foreach (ExchangeAccount account in selectedAccounts) - accountNames.Add(account.AccountName); + IDictionary accounts = new Dictionary(); - return accountNames.ToArray(); + foreach (ExchangeAccount account in selectedAccounts) + { + accounts.Add(account.AccountName, account.AccountType); + } + + return accounts; } protected void Page_Load(object sender, EventArgs e) @@ -118,6 +134,8 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls chkIncludeGroups.Visible = SecurityGroupsEnabled; chkIncludeGroups.Checked = SecurityGroupsEnabled; + + gvAccounts.Columns[3].Visible = gvPopupAccounts.Columns[3].Visible = SecurityGroupsEnabled; } // register javascript @@ -142,18 +160,35 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls string imgName = "mailbox_16.gif"; if (accountType == ExchangeAccountType.Contact) imgName = "contact_16.gif"; - else if (accountType == ExchangeAccountType.DistributionList) + else if (accountType == ExchangeAccountType.DistributionList + || accountType == ExchangeAccountType.SecurityGroup + || accountType == ExchangeAccountType.DefaultSecurityGroup) imgName = "dlist_16.gif"; else if (accountType == ExchangeAccountType.Room) imgName = "room_16.gif"; else if (accountType == ExchangeAccountType.Equipment) imgName = "equipment_16.gif"; - else if (accountType == ExchangeAccountType.Equipment) - imgName = "dlist_16.gif"; return GetThemedImage("Exchange/" + imgName); } + public string GetType(int accountTypeId) + { + ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; + + switch(accountType) + { + case ExchangeAccountType.DistributionList: + return "Distribution"; + case ExchangeAccountType.SecurityGroup: + return "Security"; + case ExchangeAccountType.DefaultSecurityGroup: + return "Default"; + default: + return string.Empty; + } + } + protected void btnAdd_Click(object sender, EventArgs e) { // bind all accounts @@ -188,6 +223,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls chkIncludeRooms.Checked, chkIncludeEquipment.Checked, chkIncludeGroups.Checked, ddlSearchColumn.SelectedValue, txtSearchValue.Text + "%", ""); + if (SecurityGroupsEnabled) + { + accounts = accounts.Where(x => !GetAccounts().Contains(x.AccountName)).ToArray(); + } + if (ExcludeAccountId > 0) { List updatedAccounts = new List(); @@ -200,6 +240,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls gvPopupAccounts.DataSource = accounts; gvPopupAccounts.DataBind(); + + if (gvPopupAccounts.Rows.Count > 0) + { + UpdateGridViewAccounts(gvPopupAccounts); + } } private void BindAccounts(ExchangeAccount[] newAccounts, bool preserveExisting) @@ -235,6 +280,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls gvAccounts.DataSource = accounts; gvAccounts.DataBind(); + if (gvAccounts.Rows.Count > 0) + { + UpdateGridViewAccounts(gvAccounts); + } + btnDelete.Visible = gvAccounts.Rows.Count > 0; } @@ -262,6 +312,38 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls return accounts; } + private void UpdateGridViewAccounts(GridView gv) + { + CheckBox chkSelectAll = (CheckBox)gv.HeaderRow.FindControl("chkSelectAll"); + + for (int i = 0; i < gv.Rows.Count; i++) + { + GridViewRow row = gv.Rows[i]; + CheckBox chkSelect = (CheckBox)row.FindControl("chkSelect"); + if (chkSelect == null) + { + continue; + } + + ExchangeAccountType exAccountType = (ExchangeAccountType)Enum.Parse(typeof(ExchangeAccountType), ((Literal)row.FindControl("litAccountType")).Text); + + if (exAccountType != ExchangeAccountType.DefaultSecurityGroup) + { + chkSelectAll = null; + chkSelect.Enabled = true; + } + else + { + chkSelect.Enabled = false; + } + } + + if (chkSelectAll != null) + { + chkSelectAll.Enabled = false; + } + } + protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e) { BindPopupAccounts(); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/AccountsList.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/AccountsList.ascx.resx index e8f53b78..63976c0b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/AccountsList.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/AccountsList.ascx.resx @@ -156,6 +156,9 @@ The list of accounts is empty. Click "Add..." button to add accounts. + + Type + Display Name diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx index 54fc0f61..c8e8b70e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx @@ -153,6 +153,9 @@ The list of accounts is empty. Click "Add..." button to add accounts. + + Type + Display Name @@ -163,7 +166,7 @@ No accounts found.
- Organization Users + Organization Accounts Include in search: diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/GroupsList.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/GroupsList.ascx.cs index ffc23fdf..a8d0ee51 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/GroupsList.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/GroupsList.ascx.cs @@ -216,7 +216,6 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls { chkSelectAll.Enabled = false; } - } protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs index e99be105..9e83947b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs @@ -53,6 +53,7 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls { List tabsList = new List(); tabsList.Add(CreateTab("secur_group_settings", "Tab.Settings")); + tabsList.Add(CreateTab("secur_group_memberof", "Tab.MemberOf")); PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx index 5e68681b..7d41e78e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx @@ -23,7 +23,7 @@ - + @@ -31,11 +31,18 @@ - + + + + + + + + @@ -83,18 +90,24 @@ - + - + + + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs index ec47b2e2..9fad6965 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs @@ -139,9 +139,15 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls case ExchangeAccountType.Equipment: imgName = "equipment_16.gif"; break; + case ExchangeAccountType.DistributionList: + imgName = "dlist_16.gif"; + break; case ExchangeAccountType.SecurityGroup: imgName = "dlist_16.gif"; break; + case ExchangeAccountType.DefaultSecurityGroup: + imgName = "dlist_16.gif"; + break; default: imgName = "admin_16.png"; break; @@ -150,6 +156,23 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls return GetThemedImage("Exchange/" + imgName); } + public string GetType(int accountTypeId) + { + ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; + + switch (accountType) + { + case ExchangeAccountType.DistributionList: + return "Distribution"; + case ExchangeAccountType.SecurityGroup: + return "Security"; + case ExchangeAccountType.DefaultSecurityGroup: + return "Default Group"; + default: + return accountType.ToString(); + } + } + private void BindPopupAccounts() { ExchangeAccount[] accounts = ES.Services.Organizations.SearchOrganizationAccounts(PanelRequest.ItemID, diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 975475c9..20646721 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -209,6 +209,13 @@ + + OrganizationSecurityGroupMemberOf.ascx + ASPXCodeBehind + + + OrganizationSecurityGroupMemberOf.ascx + ExchangeDistributionListMemberOf.ascx ASPXCodeBehind @@ -3973,6 +3980,7 @@ + @@ -5200,6 +5208,7 @@ Designer + Designer