fixed bugs

This commit is contained in:
vfedosevich 2013-08-30 18:59:05 +03:00
parent 80d4843693
commit 7be09843de
27 changed files with 513 additions and 274 deletions

View file

@ -127,9 +127,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution
private System.Threading.SendOrPostCallback GetOrganizationSecurityGroupsPagedOperationCompleted; 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; private System.Threading.SendOrPostCallback GetSecurityGroupsByMemberOperationCompleted;
@ -235,10 +235,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution
public event GetOrganizationSecurityGroupsPagedCompletedEventHandler GetOrganizationSecurityGroupsPagedCompleted; public event GetOrganizationSecurityGroupsPagedCompletedEventHandler GetOrganizationSecurityGroupsPagedCompleted;
/// <remarks/> /// <remarks/>
public event AddUserToSecurityGroupCompletedEventHandler AddUserToSecurityGroupCompleted; public event AddObjectToSecurityGroupCompletedEventHandler AddObjectToSecurityGroupCompleted;
/// <remarks/> /// <remarks/>
public event DeleteUserFromSecurityGroupCompletedEventHandler DeleteUserFromSecurityGroupCompleted; public event DeleteObjectFromSecurityGroupCompletedEventHandler DeleteObjectFromSecurityGroupCompleted;
/// <remarks/> /// <remarks/>
public event GetSecurityGroupsByMemberCompletedEventHandler GetSecurityGroupsByMemberCompleted; public event GetSecurityGroupsByMemberCompletedEventHandler GetSecurityGroupsByMemberCompleted;
@ -2166,112 +2166,112 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution
} }
/// <remarks/> /// <remarks/>
[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)] [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 AddUserToSecurityGroup(int itemId, int userAccountId, string groupName) public int AddObjectToSecurityGroup(int itemId, int accountId, string groupName)
{ {
object[] results = this.Invoke("AddUserToSecurityGroup", new object[] { object[] results = this.Invoke("AddObjectToSecurityGroup", new object[] {
itemId, itemId,
userAccountId, accountId,
groupName}); groupName});
return ((int)(results[0])); return ((int)(results[0]));
} }
/// <remarks/> /// <remarks/>
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, itemId,
userAccountId, accountId,
groupName}, callback, asyncState); groupName}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
public int EndAddUserToSecurityGroup(System.IAsyncResult asyncResult) public int EndAddObjectToSecurityGroup(System.IAsyncResult asyncResult)
{ {
object[] results = this.EndInvoke(asyncResult); object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0])); return ((int)(results[0]));
} }
/// <remarks/> /// <remarks/>
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);
} }
/// <remarks/> /// <remarks/>
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, itemId,
userAccountId, accountId,
groupName}, this.AddUserToSecurityGroupOperationCompleted, userState); 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)); 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));
} }
} }
/// <remarks/> /// <remarks/>
[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)] [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 DeleteUserFromSecurityGroup(int itemId, int userAccountId, string groupName) public int DeleteObjectFromSecurityGroup(int itemId, int accountId, string groupName)
{ {
object[] results = this.Invoke("DeleteUserFromSecurityGroup", new object[] { object[] results = this.Invoke("DeleteObjectFromSecurityGroup", new object[] {
itemId, itemId,
userAccountId, accountId,
groupName}); groupName});
return ((int)(results[0])); return ((int)(results[0]));
} }
/// <remarks/> /// <remarks/>
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, itemId,
userAccountId, accountId,
groupName}, callback, asyncState); groupName}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
public int EndDeleteUserFromSecurityGroup(System.IAsyncResult asyncResult) public int EndDeleteObjectFromSecurityGroup(System.IAsyncResult asyncResult)
{ {
object[] results = this.EndInvoke(asyncResult); object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0])); return ((int)(results[0]));
} }
/// <remarks/> /// <remarks/>
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);
} }
/// <remarks/> /// <remarks/>
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, itemId,
userAccountId, accountId,
groupName}, this.DeleteUserFromSecurityGroupOperationCompleted, userState); 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)); 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
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [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);
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")] [System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class AddUserToSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs public partial class AddObjectToSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
{ {
private object[] results; 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) base(exception, cancelled, userState)
{ {
this.results = results; this.results = results;
@ -3357,18 +3357,18 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [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);
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")] [System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class DeleteUserFromSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs public partial class DeleteObjectFromSecurityGroupCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
{ {
private object[] results; 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) base(exception, cancelled, userState)
{ {
this.results = results; this.results = results;

View file

@ -3407,7 +3407,7 @@ namespace WebsitePanel.EnterpriseServer
ExchangeDistributionList dl = exchange.GetDistributionListGeneralSettings(accountName); ExchangeDistributionList dl = exchange.GetDistributionListGeneralSettings(accountName);
// add meta-item // add meta-item
int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, email, int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, accountName,
displayName, email, false, displayName, email, false,
0, dl.SAMAccountName, null, 0, null); 0, dl.SAMAccountName, null, 0, null);

View file

@ -2514,7 +2514,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
public static int AddUserToSecurityGroup(int itemId, int userAccountId, string groupName) public static int AddObjectToSecurityGroup(int itemId, int accountId, string groupName)
{ {
// check account // check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
@ -2531,11 +2531,11 @@ namespace WebsitePanel.EnterpriseServer
return -1; return -1;
// load user account // load user account
OrganizationUser userAccount = GetAccount(itemId, userAccountId); ExchangeAccount account = ExchangeServerController.GetAccount(itemId, accountId);
Organizations orgProxy = GetOrganizationProxy(org.ServiceId); Organizations orgProxy = GetOrganizationProxy(org.ServiceId);
orgProxy.AddUserToSecurityGroup(org.OrganizationId, userAccount.AccountName, groupName); orgProxy.AddObjectToSecurityGroup(org.OrganizationId, account.AccountName, groupName);
return 0; 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 // check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
@ -2566,11 +2566,11 @@ namespace WebsitePanel.EnterpriseServer
return -1; return -1;
// load user account // load user account
OrganizationUser userAccount = GetAccount(itemId, userAccountId); ExchangeAccount account = ExchangeServerController.GetAccount(itemId, accountId);
Organizations orgProxy = GetOrganizationProxy(org.ServiceId); Organizations orgProxy = GetOrganizationProxy(org.ServiceId);
orgProxy.DeleteUserFromSecurityGroup(org.OrganizationId, userAccount.AccountName, groupName); orgProxy.DeleteObjectFromSecurityGroup(org.OrganizationId, account.AccountName, groupName);
return 0; return 0;
} }
@ -2699,8 +2699,8 @@ namespace WebsitePanel.EnterpriseServer
if (!includeOnlySecurityGroups) if (!includeOnlySecurityGroups)
{ {
accountTypes = string.Format("{0}, {1}, {2}, {3}, {4}", accountTypes, ((int)ExchangeAccountType.User), ((int)ExchangeAccountType.Mailbox), accountTypes = string.Format("{0}, {1}, {2}, {3}, {4}, {5}", accountTypes, ((int)ExchangeAccountType.User), ((int)ExchangeAccountType.Mailbox),
((int)ExchangeAccountType.Room), ((int)ExchangeAccountType.Equipment)); ((int)ExchangeAccountType.Room), ((int)ExchangeAccountType.Equipment), ((int)ExchangeAccountType.DistributionList));
} }
List<ExchangeAccount> tmpAccounts = ObjectUtils.CreateListFromDataReader<ExchangeAccount>( List<ExchangeAccount> tmpAccounts = ObjectUtils.CreateListFromDataReader<ExchangeAccount>(
@ -2711,9 +2711,22 @@ namespace WebsitePanel.EnterpriseServer
foreach (ExchangeAccount tmpAccount in tmpAccounts.ToArray()) foreach (ExchangeAccount tmpAccount in tmpAccounts.ToArray())
{ {
if (tmpAccount.AccountType == ExchangeAccountType.SecurityGroup bool bSuccess = false;
? GetSecurityGroupGeneralSettings(itemId, tmpAccount.AccountId) != null
: GetUserGeneralSettings(itemId, tmpAccount.AccountId) != null) 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); accounts.Add(tmpAccount);
} }

View file

@ -276,15 +276,15 @@ namespace WebsitePanel.EnterpriseServer
} }
[WebMethod] [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] [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] [WebMethod]

View file

@ -50,9 +50,9 @@ namespace WebsitePanel.Providers.HostedSolution
void SetSecurityGroupGeneralSettings(string organizationId, string groupName, string[] memberAccounts, string notes); 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, void SetUserGeneralSettings(string organizationId, string accountName, string displayName, string password,
bool hideFromAddressBook, bool disabled, bool locked, string firstName, string initials, bool hideFromAddressBook, bool disabled, bool locked, string firstName, string initials,

View file

@ -5656,7 +5656,7 @@ namespace WebsitePanel.Providers.HostedSolution
internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd) internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd)
{ {
return ExecuteShellCommand(runSpace, cmd, true); return ExecuteShellCommand(runSpace, cmd, false);
} }
internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController) internal Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController)

View file

@ -1027,56 +1027,56 @@ namespace WebsitePanel.Providers.HostedSolution
entry.CommitChanges(); 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.LogStart("AddUserToSecurityGroupInternal");
HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId);
HostedSolutionLog.DebugInfo("loginName : {0}", loginName); HostedSolutionLog.DebugInfo("accountName : {0}", accountName);
HostedSolutionLog.DebugInfo("groupName : {0}", groupName); HostedSolutionLog.DebugInfo("groupName : {0}", groupName);
if (string.IsNullOrEmpty(organizationId)) if (string.IsNullOrEmpty(organizationId))
throw new ArgumentNullException("organizationId"); throw new ArgumentNullException("organizationId");
if (string.IsNullOrEmpty(loginName)) if (string.IsNullOrEmpty(accountName))
throw new ArgumentNullException("loginName"); throw new ArgumentNullException("loginName");
if (string.IsNullOrEmpty(groupName)) if (string.IsNullOrEmpty(groupName))
throw new ArgumentNullException("groupName"); throw new ArgumentNullException("groupName");
string userPath = GetUserPath(organizationId, loginName); string userPath = GetObjectPath(organizationId, accountName);
string groupPath = GetGroupPath(organizationId, groupName); string groupPath = GetGroupPath(organizationId, groupName);
ActiveDirectoryUtils.AddObjectToGroup(userPath, groupPath); ActiveDirectoryUtils.AddObjectToGroup(userPath, 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.LogStart("AddUserToSecurityGroupInternal");
HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId);
HostedSolutionLog.DebugInfo("loginName : {0}", loginName); HostedSolutionLog.DebugInfo("accountName : {0}", accountName);
HostedSolutionLog.DebugInfo("groupName : {0}", groupName); HostedSolutionLog.DebugInfo("groupName : {0}", groupName);
if (string.IsNullOrEmpty(organizationId)) if (string.IsNullOrEmpty(organizationId))
throw new ArgumentNullException("organizationId"); throw new ArgumentNullException("organizationId");
if (string.IsNullOrEmpty(loginName)) if (string.IsNullOrEmpty(accountName))
throw new ArgumentNullException("loginName"); throw new ArgumentNullException("loginName");
if (string.IsNullOrEmpty(groupName)) if (string.IsNullOrEmpty(groupName))
throw new ArgumentNullException("groupName"); throw new ArgumentNullException("groupName");
string userPath = GetUserPath(organizationId, loginName); string userPath = GetObjectPath(organizationId, accountName);
string groupPath = GetGroupPath(organizationId, groupName); string groupPath = GetGroupPath(organizationId, groupName);

View file

@ -85,9 +85,9 @@ namespace WebsitePanel.Providers.HostedSolution
private System.Threading.SendOrPostCallback SetSecurityGroupGeneralSettingsOperationCompleted; 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; private System.Threading.SendOrPostCallback SetUserGeneralSettingsOperationCompleted;
@ -142,10 +142,10 @@ namespace WebsitePanel.Providers.HostedSolution
public event SetSecurityGroupGeneralSettingsCompletedEventHandler SetSecurityGroupGeneralSettingsCompleted; public event SetSecurityGroupGeneralSettingsCompletedEventHandler SetSecurityGroupGeneralSettingsCompleted;
/// <remarks/> /// <remarks/>
public event AddUserToSecurityGroupCompletedEventHandler AddUserToSecurityGroupCompleted; public event AddObjectToSecurityGroupCompletedEventHandler AddObjectToSecurityGroupCompleted;
/// <remarks/> /// <remarks/>
public event DeleteUserFromSecurityGroupCompletedEventHandler DeleteUserFromSecurityGroupCompleted; public event DeleteObjectFromSecurityGroupCompletedEventHandler DeleteObjectFromSecurityGroupCompleted;
/// <remarks/> /// <remarks/>
public event SetUserGeneralSettingsCompletedEventHandler SetUserGeneralSettingsCompleted; public event SetUserGeneralSettingsCompletedEventHandler SetUserGeneralSettingsCompleted;
@ -704,109 +704,109 @@ namespace WebsitePanel.Providers.HostedSolution
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [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)] [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 AddUserToSecurityGroup(string organizationId, string loginName, string groupName) public void AddObjectToSecurityGroup(string organizationId, string accountName, string groupName)
{ {
this.Invoke("AddUserToSecurityGroup", new object[] { this.Invoke("AddObjectToSecurityGroup", new object[] {
organizationId, organizationId,
loginName, accountName,
groupName}); groupName});
} }
/// <remarks/> /// <remarks/>
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, organizationId,
loginName, accountName,
groupName}, callback, asyncState); groupName}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
public void EndAddUserToSecurityGroup(System.IAsyncResult asyncResult) public void EndAddObjectToSecurityGroup(System.IAsyncResult asyncResult)
{ {
this.EndInvoke(asyncResult); this.EndInvoke(asyncResult);
} }
/// <remarks/> /// <remarks/>
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);
} }
/// <remarks/> /// <remarks/>
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, organizationId,
loginName, accountName,
groupName}, this.AddUserToSecurityGroupOperationCompleted, userState); 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)); 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));
} }
} }
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [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)] [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 DeleteUserFromSecurityGroup(string organizationId, string loginName, string groupName) public void DeleteObjectFromSecurityGroup(string organizationId, string accountName, string groupName)
{ {
this.Invoke("DeleteUserFromSecurityGroup", new object[] { this.Invoke("DeleteObjectFromSecurityGroup", new object[] {
organizationId, organizationId,
loginName, accountName,
groupName}); groupName});
} }
/// <remarks/> /// <remarks/>
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, organizationId,
loginName, accountName,
groupName}, callback, asyncState); groupName}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
public void EndDeleteUserFromSecurityGroup(System.IAsyncResult asyncResult) public void EndDeleteObjectFromSecurityGroup(System.IAsyncResult asyncResult)
{ {
this.EndInvoke(asyncResult); this.EndInvoke(asyncResult);
} }
/// <remarks/> /// <remarks/>
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);
} }
/// <remarks/> /// <remarks/>
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, organizationId,
loginName, accountName,
groupName}, this.DeleteUserFromSecurityGroupOperationCompleted, userState); 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)); 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
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [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);
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [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);
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]

View file

@ -135,15 +135,15 @@ namespace WebsitePanel.Server
} }
[WebMethod, SoapHeader("settings")] [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")] [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")] [WebMethod, SoapHeader("settings")]

View file

@ -5326,4 +5326,19 @@
<data name="WarningDescription.PHONE_EDIT_LIST_EMPTY_ERROR" xml:space="preserve"> <data name="WarningDescription.PHONE_EDIT_LIST_EMPTY_ERROR" xml:space="preserve">
<value>At least one Phone number must be selected.</value> <value>At least one Phone number must be selected.</value>
</data> </data>
<data name="Error.ORGANIZATION_CREATE_USER" xml:space="preserve">
<value>Error creating user. See audit log for more details.</value>
</data>
<data name="Error.ORGANIZATION_CREATE_SECURITY_GROUP" xml:space="preserve">
<value>Error creating security group. See audit log for more details.</value>
</data>
<data name="Error.ORGANIZATION_GET_SECURITY_GROUP_SETTINGS" xml:space="preserve">
<value>Error reading organization security group settings</value>
</data>
<data name="Error.ORGANIZATION_UPDATE_SECURITY_GROUP_SETTINGS" xml:space="preserve">
<value>Error updating organization security group settings</value>
</data>
<data name="Success.ORGANIZATION_UPDATE_SECURITY_GROUP_SETTINGS" xml:space="preserve">
<value>Security group general settings have been successfully updated.</value>
</data>
</root> </root>

View file

@ -30,12 +30,12 @@
<wsp:DistributionListTabs id="tabs" runat="server" SelectedTab="dlist_memberof" /> <wsp:DistributionListTabs id="tabs" runat="server" SelectedTab="dlist_memberof" />
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
<wsp:CollapsiblePanel id="secDistributionLists" runat="server" TargetControlID="DistributionLists" meta:resourcekey="secDistributionLists" Text="Distribution Lists"></wsp:CollapsiblePanel> <wsp:CollapsiblePanel id="secGroups" runat="server" TargetControlID="GroupsPanel" meta:resourcekey="secGroups" Text="Groups"></wsp:CollapsiblePanel>
<asp:Panel ID="DistributionLists" runat="server" Height="0" style="overflow:hidden;"> <asp:Panel ID="GroupsPanel" runat="server" Height="0" style="overflow:hidden;">
<asp:UpdatePanel ID="GeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true"> <asp:UpdatePanel ID="GeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate> <ContentTemplate>
<wsp:AccountsList id="distrlists" runat="server" <wsp:AccountsList id="groups" runat="server"
MailboxesEnabled="false" MailboxesEnabled="false"
EnableMailboxOnly="true" EnableMailboxOnly="true"
ContactsEnabled="false" ContactsEnabled="false"

View file

@ -67,7 +67,20 @@ namespace WebsitePanel.Portal.ExchangeServer
ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
distrlists.SetAccounts(dLists); ExchangeAccount[] secGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
List<ExchangeAccount> groupsList = new List<ExchangeAccount>();
foreach (ExchangeAccount distList in dLists)
{
groupsList.Add(distList);
}
foreach (ExchangeAccount secGroup in secGroups)
{
groupsList.Add(secGroup);
}
groups.SetAccounts(groupsList.ToArray());
} }
catch (Exception ex) catch (Exception ex)
@ -83,18 +96,53 @@ namespace WebsitePanel.Portal.ExchangeServer
try try
{ {
ExchangeAccount[] oldDistributionLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
List<string> newDistributionLists = new List<string>(distrlists.GetAccounts()); ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
foreach (ExchangeAccount oldlist in oldDistributionLists)
IList<ExchangeAccount> oldGroups = new List<ExchangeAccount>();
foreach (ExchangeAccount distList in oldSecGroups)
{ {
if (newDistributionLists.Contains(oldlist.AccountName)) oldGroups.Add(distList);
newDistributionLists.Remove(oldlist.AccountName);
else
ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldlist.AccountName, PanelRequest.AccountID);
} }
foreach (string newlist in newDistributionLists) foreach (ExchangeAccount secGroup in oldDistLists)
ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newlist, PanelRequest.AccountID); {
oldGroups.Add(secGroup);
}
IDictionary<string, ExchangeAccountType> 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<string, ExchangeAccountType> 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"); messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_SETTINGS");
BindSettings(); BindSettings();

View file

@ -85,22 +85,22 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
/// <summary> /// <summary>
/// secDistributionLists control. /// secGroups control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.CollapsiblePanel secDistributionLists; protected global::WebsitePanel.Portal.CollapsiblePanel secGroups;
/// <summary> /// <summary>
/// DistributionLists control. /// GroupsPanel control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Panel DistributionLists; protected global::System.Web.UI.WebControls.Panel GroupsPanel;
/// <summary> /// <summary>
/// GeneralUpdatePanel control. /// GeneralUpdatePanel control.
@ -112,13 +112,13 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel;
/// <summary> /// <summary>
/// distrlists control. /// groups control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList distrlists; protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups;
/// <summary> /// <summary>
/// btnSave control. /// btnSave control.

View file

@ -32,12 +32,12 @@
<wsp:MailboxTabs id="tabs" runat="server" SelectedTab="mailbox_memberof" /> <wsp:MailboxTabs id="tabs" runat="server" SelectedTab="mailbox_memberof" />
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
<wsp:CollapsiblePanel id="secDistributionLists" runat="server" TargetControlID="DistributionLists" meta:resourcekey="secDistributionLists" Text="Distribution Lists"></wsp:CollapsiblePanel> <wsp:CollapsiblePanel id="secGroups" runat="server" TargetControlID="GroupsPanel" meta:resourcekey="secGroups" Text="Groups"></wsp:CollapsiblePanel>
<asp:Panel ID="DistributionLists" runat="server" Height="0" style="overflow:hidden;"> <asp:Panel ID="GroupsPanel" runat="server" Height="0" style="overflow:hidden;">
<asp:UpdatePanel ID="GeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true"> <asp:UpdatePanel ID="GeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate> <ContentTemplate>
<wsp:AccountsList id="distrlists" runat="server" <wsp:AccountsList id="groups" runat="server"
MailboxesEnabled="false" MailboxesEnabled="false"
EnableMailboxOnly="true" EnableMailboxOnly="true"
ContactsEnabled="false" ContactsEnabled="false"

View file

@ -59,10 +59,24 @@ namespace WebsitePanel.Portal.ExchangeServer
// title // title
litDisplayName.Text = mailbox.DisplayName; litDisplayName.Text = mailbox.DisplayName;
//Distribution Lists
ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); 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);
List<ExchangeAccount> groupsList = new List<ExchangeAccount>();
foreach (ExchangeAccount distList in dLists)
{
groupsList.Add(distList);
}
foreach (ExchangeAccount secGroup in securGroups)
{
groupsList.Add(secGroup);
}
groups.SetAccounts(groupsList.ToArray());
} }
catch (Exception ex) catch (Exception ex)
@ -78,18 +92,53 @@ namespace WebsitePanel.Portal.ExchangeServer
try try
{ {
ExchangeAccount[] oldDistributionLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
List<string> newDistributionLists = new List<string>(distrlists.GetAccounts()); ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
foreach (ExchangeAccount oldlist in oldDistributionLists)
IList<ExchangeAccount> oldGroups = new List<ExchangeAccount>();
foreach (ExchangeAccount distList in oldSecGroups)
{ {
if (newDistributionLists.Contains(oldlist.AccountName)) oldGroups.Add(distList);
newDistributionLists.Remove(oldlist.AccountName);
else
ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldlist.AccountName, PanelRequest.AccountID);
} }
foreach (string newlist in newDistributionLists) foreach (ExchangeAccount secGroup in oldDistLists)
ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newlist, PanelRequest.AccountID); {
oldGroups.Add(secGroup);
}
IDictionary<string, ExchangeAccountType> 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<string, ExchangeAccountType> 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"); messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS");
BindSettings(); BindSettings();
@ -104,7 +153,5 @@ namespace WebsitePanel.Portal.ExchangeServer
{ {
SaveSettings(); SaveSettings();
} }
} }
} }

View file

@ -85,22 +85,22 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
/// <summary> /// <summary>
/// secDistributionLists control. /// secGroups control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.CollapsiblePanel secDistributionLists; protected global::WebsitePanel.Portal.CollapsiblePanel secGroups;
/// <summary> /// <summary>
/// DistributionLists control. /// GroupsPanel control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Panel DistributionLists; protected global::System.Web.UI.WebControls.Panel GroupsPanel;
/// <summary> /// <summary>
/// GeneralUpdatePanel control. /// GeneralUpdatePanel control.
@ -112,13 +112,13 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel;
/// <summary> /// <summary>
/// distrlists control. /// groups control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList distrlists; protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups;
/// <summary> /// <summary>
/// btnSave control. /// btnSave control.

View file

@ -128,7 +128,7 @@ namespace WebsitePanel.Portal.HostedSolution
} }
catch (Exception ex) catch (Exception ex)
{ {
messageBox.ShowErrorMessage("EXCHANGE_CREATE_MAILBOX", ex); messageBox.ShowErrorMessage("ORGANIZATION_CREATE_USER", ex);
} }
} }

View file

@ -43,27 +43,17 @@
<uc1:MailboxTabs ID="MailboxTabsId" runat="server" SelectedTab="user_memberof" /> <uc1:MailboxTabs ID="MailboxTabsId" runat="server" SelectedTab="user_memberof" />
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
<wsp:CollapsiblePanel id="secDistributionLists" runat="server" TargetControlID="DistributionListsPanel" meta:resourcekey="secDistributionLists" Text="Distribution Lists"></wsp:CollapsiblePanel> <wsp:CollapsiblePanel id="secGroups" runat="server" TargetControlID="GroupsPanel" meta:resourcekey="secGroups" Text="Groups"></wsp:CollapsiblePanel>
<asp:Panel ID="DistributionListsPanel" runat="server" Height="0" style="overflow:hidden;"> <asp:Panel ID="GroupsPanel" runat="server" Height="0" style="overflow:hidden;">
<asp:UpdatePanel ID="DLGeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true"> <asp:UpdatePanel ID="GeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate> <ContentTemplate>
<wsp:AccountsList id="distrlists" runat="server" <wsp:AccountsList id="groups" runat="server"
MailboxesEnabled="false" MailboxesEnabled="false"
EnableMailboxOnly="true" EnableMailboxOnly="true"
ContactsEnabled="false" ContactsEnabled="false"
DistributionListsEnabled="true" /> DistributionListsEnabled="true"
SecurityGroupsEnabled="true" />
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
<wsp:CollapsiblePanel id="secSecurityGroups" runat="server" TargetControlID="SecurityGroupsPanel" meta:resourcekey="secSecurityGroups" Text="Groups"></wsp:CollapsiblePanel>
<asp:Panel ID="SecurityGroupsPanel" runat="server" Height="0" style="overflow:hidden;">
<asp:UpdatePanel ID="SCGeneralUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<wsp:GroupsList id="securegroups" runat="server" />
</ContentTemplate> </ContentTemplate>
</asp:UpdatePanel> </asp:UpdatePanel>

View file

@ -44,6 +44,7 @@ namespace WebsitePanel.Portal.HostedSolution
BindSettings(); BindSettings();
MailboxTabsId.Visible = (PanelRequest.Context == "Mailbox"); MailboxTabsId.Visible = (PanelRequest.Context == "Mailbox");
UserTabsId.Visible = (PanelRequest.Context == "User"); UserTabsId.Visible = (PanelRequest.Context == "User");
} }
} }
@ -53,26 +54,37 @@ namespace WebsitePanel.Portal.HostedSolution
try try
{ {
// get settings // get settings
ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxGeneralSettings(PanelRequest.ItemID, OrganizationUser user = ES.Services.Organizations.GetUserGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID);
PanelRequest.AccountID);
// title groups.DistributionListsEnabled = (user.AccountType == ExchangeAccountType.Mailbox
litDisplayName.Text = mailbox.DisplayName; || user.AccountType == ExchangeAccountType.Room
|| user.AccountType == ExchangeAccountType.Equipment);
litDisplayName.Text = user.DisplayName;
//Distribution Lists //Distribution Lists
ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); ExchangeAccount[] dLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
distrlists.SetAccounts(dLists);
//Security Groups //Security Groups
ExchangeAccount[] securGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID); ExchangeAccount[] securGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
securegroups.SetAccounts(securGroups); List<ExchangeAccount> groupsList = new List<ExchangeAccount>();
foreach (ExchangeAccount distList in dLists)
{
groupsList.Add(distList);
}
foreach (ExchangeAccount secGroup in securGroups)
{
groupsList.Add(secGroup);
}
groups.SetAccounts(groupsList.ToArray());
} }
catch (Exception ex) 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 try
{ {
//Distribution Lists ExchangeAccount[] oldSecGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
ExchangeAccount[] oldDistributionLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID); ExchangeAccount[] oldDistLists = ES.Services.ExchangeServer.GetDistributionListsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
List<string> newDistributionLists = new List<string>(distrlists.GetAccounts());
foreach (ExchangeAccount oldlist in oldDistributionLists) IList<ExchangeAccount> oldGroups = new List<ExchangeAccount>();
foreach (ExchangeAccount distList in oldSecGroups)
{ {
if (newDistributionLists.Contains(oldlist.AccountName)) oldGroups.Add(distList);
newDistributionLists.Remove(oldlist.AccountName);
else
ES.Services.ExchangeServer.DeleteDistributionListMember(PanelRequest.ItemID, oldlist.AccountName, PanelRequest.AccountID);
} }
foreach (string newlist in newDistributionLists) foreach (ExchangeAccount secGroup in oldDistLists)
ES.Services.ExchangeServer.AddDistributionListMember(PanelRequest.ItemID, newlist, PanelRequest.AccountID);
//Security Groups
ExchangeAccount[] oldDSecurityGroups = ES.Services.Organizations.GetSecurityGroupsByMember(PanelRequest.ItemID, PanelRequest.AccountID);
List<string> newSecurityGroups = new List<string>(securegroups.GetAccounts());
foreach (ExchangeAccount oldgroup in oldDSecurityGroups)
{ {
if (newSecurityGroups.Contains(oldgroup.AccountName)) oldGroups.Add(secGroup);
}
IDictionary<string, ExchangeAccountType> newGroups = groups.GetFullAccounts();
foreach (ExchangeAccount oldGroup in oldGroups)
{
if (newGroups.ContainsKey(oldGroup.AccountName))
{ {
newSecurityGroups.Remove(oldgroup.AccountName); newGroups.Remove(oldGroup.AccountName);
} }
else 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<string, ExchangeAccountType> 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(); BindSettings();
} }
catch (Exception ex) catch (Exception ex)
{ {
messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS", ex); messageBox.ShowErrorMessage("ORGANIZATION_UPDATE_USER_SETTINGS", ex);
} }
} }

View file

@ -94,76 +94,40 @@ namespace WebsitePanel.Portal.HostedSolution {
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
/// <summary> /// <summary>
/// secDistributionLists control. /// secGroups control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.CollapsiblePanel secDistributionLists; protected global::WebsitePanel.Portal.CollapsiblePanel secGroups;
/// <summary> /// <summary>
/// DistributionListsPanel control. /// GroupsPanel control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Panel DistributionListsPanel; protected global::System.Web.UI.WebControls.Panel GroupsPanel;
/// <summary> /// <summary>
/// DLGeneralUpdatePanel control. /// GeneralUpdatePanel control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.UpdatePanel DLGeneralUpdatePanel; protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel;
/// <summary> /// <summary>
/// distrlists control. /// groups control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList distrlists; protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups;
/// <summary>
/// secSecurityGroups control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.CollapsiblePanel secSecurityGroups;
/// <summary>
/// SecurityGroupsPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Panel SecurityGroupsPanel;
/// <summary>
/// SCGeneralUpdatePanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel SCGeneralUpdatePanel;
/// <summary>
/// securegroups control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.GroupsList securegroups;
/// <summary> /// <summary>
/// btnSave control. /// btnSave control.

View file

@ -37,6 +37,13 @@
<asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal> <asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsAccountType" HeaderText="gvAccountsAccountType">
<HeaderStyle Wrap="false" />
<ItemStyle Width="50%" Wrap="false"></ItemStyle>
<ItemTemplate>
<asp:Literal ID="litType" runat="server" Text='<%# GetType((int)Eval("AccountType")) %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
</Columns> </Columns>
</asp:GridView> </asp:GridView>
@ -111,6 +118,12 @@
<asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal> <asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsAccountType" HeaderText="gvAccountsAccountType">
<ItemStyle Width="50%"></ItemStyle>
<ItemTemplate>
<asp:Literal ID="litType" runat="server" Text='<%# GetType((int)Eval("AccountType")) %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
</Columns> </Columns>
</asp:GridView> </asp:GridView>
</div> </div>

View file

@ -27,6 +27,7 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
@ -83,16 +84,31 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
BindAccounts(accounts, false); BindAccounts(accounts, false);
} }
public string[] GetAccounts() public string[] GetAccounts()
{
// get selected accounts
List<ExchangeAccount> selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.All);
List<string> accountNames = new List<string>();
foreach (ExchangeAccount account in selectedAccounts)
accountNames.Add(account.AccountName);
return accountNames.ToArray();
}
public IDictionary<string, ExchangeAccountType> GetFullAccounts()
{ {
// get selected accounts // get selected accounts
List<ExchangeAccount> selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.All); List<ExchangeAccount> selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.All);
List<string> accountNames = new List<string>(); IDictionary<string, ExchangeAccountType> accounts = new Dictionary<string, ExchangeAccountType>();
foreach (ExchangeAccount account in selectedAccounts)
accountNames.Add(account.AccountName);
return accountNames.ToArray(); foreach (ExchangeAccount account in selectedAccounts)
{
accounts.Add(account.AccountName, account.AccountType);
}
return accounts;
} }
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
@ -118,6 +134,8 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
chkIncludeGroups.Visible = SecurityGroupsEnabled; chkIncludeGroups.Visible = SecurityGroupsEnabled;
chkIncludeGroups.Checked = SecurityGroupsEnabled; chkIncludeGroups.Checked = SecurityGroupsEnabled;
gvAccounts.Columns[3].Visible = gvPopupAccounts.Columns[3].Visible = SecurityGroupsEnabled;
} }
// register javascript // register javascript
@ -142,18 +160,35 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
string imgName = "mailbox_16.gif"; string imgName = "mailbox_16.gif";
if (accountType == ExchangeAccountType.Contact) if (accountType == ExchangeAccountType.Contact)
imgName = "contact_16.gif"; imgName = "contact_16.gif";
else if (accountType == ExchangeAccountType.DistributionList) else if (accountType == ExchangeAccountType.DistributionList
|| accountType == ExchangeAccountType.SecurityGroup
|| accountType == ExchangeAccountType.DefaultSecurityGroup)
imgName = "dlist_16.gif"; imgName = "dlist_16.gif";
else if (accountType == ExchangeAccountType.Room) else if (accountType == ExchangeAccountType.Room)
imgName = "room_16.gif"; imgName = "room_16.gif";
else if (accountType == ExchangeAccountType.Equipment) else if (accountType == ExchangeAccountType.Equipment)
imgName = "equipment_16.gif"; imgName = "equipment_16.gif";
else if (accountType == ExchangeAccountType.Equipment)
imgName = "dlist_16.gif";
return GetThemedImage("Exchange/" + imgName); 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) protected void btnAdd_Click(object sender, EventArgs e)
{ {
// bind all accounts // bind all accounts
@ -188,6 +223,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
chkIncludeRooms.Checked, chkIncludeEquipment.Checked, chkIncludeGroups.Checked, chkIncludeRooms.Checked, chkIncludeEquipment.Checked, chkIncludeGroups.Checked,
ddlSearchColumn.SelectedValue, txtSearchValue.Text + "%", ""); ddlSearchColumn.SelectedValue, txtSearchValue.Text + "%", "");
if (SecurityGroupsEnabled)
{
accounts = accounts.Where(x => !GetAccounts().Contains(x.AccountName)).ToArray();
}
if (ExcludeAccountId > 0) if (ExcludeAccountId > 0)
{ {
List<ExchangeAccount> updatedAccounts = new List<ExchangeAccount>(); List<ExchangeAccount> updatedAccounts = new List<ExchangeAccount>();
@ -200,6 +240,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
gvPopupAccounts.DataSource = accounts; gvPopupAccounts.DataSource = accounts;
gvPopupAccounts.DataBind(); gvPopupAccounts.DataBind();
if (gvPopupAccounts.Rows.Count > 0)
{
UpdateGridViewAccounts(gvPopupAccounts);
}
} }
private void BindAccounts(ExchangeAccount[] newAccounts, bool preserveExisting) private void BindAccounts(ExchangeAccount[] newAccounts, bool preserveExisting)
@ -235,6 +280,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
gvAccounts.DataSource = accounts; gvAccounts.DataSource = accounts;
gvAccounts.DataBind(); gvAccounts.DataBind();
if (gvAccounts.Rows.Count > 0)
{
UpdateGridViewAccounts(gvAccounts);
}
btnDelete.Visible = gvAccounts.Rows.Count > 0; btnDelete.Visible = gvAccounts.Rows.Count > 0;
} }
@ -262,6 +312,38 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
return accounts; 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) protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e)
{ {
BindPopupAccounts(); BindPopupAccounts();

View file

@ -156,6 +156,9 @@
<data name="gvAccounts.EmptyDataText" xml:space="preserve"> <data name="gvAccounts.EmptyDataText" xml:space="preserve">
<value>The list of accounts is empty. Click "Add..." button to add accounts.</value> <value>The list of accounts is empty. Click "Add..." button to add accounts.</value>
</data> </data>
<data name="gvAccountsAccountType.HeaderText" xml:space="preserve">
<value>Type</value>
</data>
<data name="gvAccountsDisplayName.HeaderText" xml:space="preserve"> <data name="gvAccountsDisplayName.HeaderText" xml:space="preserve">
<value>Display Name</value> <value>Display Name</value>
</data> </data>

View file

@ -153,6 +153,9 @@
<data name="gvAccounts.EmptyDataText" xml:space="preserve"> <data name="gvAccounts.EmptyDataText" xml:space="preserve">
<value>The list of accounts is empty. Click "Add..." button to add accounts.</value> <value>The list of accounts is empty. Click "Add..." button to add accounts.</value>
</data> </data>
<data name="gvAccountsAccountType.HeaderText" xml:space="preserve">
<value>Type</value>
</data>
<data name="gvAccountsDisplayName.HeaderText" xml:space="preserve"> <data name="gvAccountsDisplayName.HeaderText" xml:space="preserve">
<value>Display Name</value> <value>Display Name</value>
</data> </data>
@ -163,7 +166,7 @@
<value>No accounts found.</value> <value>No accounts found.</value>
</data> </data>
<data name="headerAddAccounts.Text" xml:space="preserve"> <data name="headerAddAccounts.Text" xml:space="preserve">
<value>Organization Users</value> <value>Organization Accounts</value>
</data> </data>
<data name="locIncludeSearch.Text" xml:space="preserve"> <data name="locIncludeSearch.Text" xml:space="preserve">
<value>Include in search:</value> <value>Include in search:</value>

View file

@ -216,7 +216,6 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
{ {
chkSelectAll.Enabled = false; chkSelectAll.Enabled = false;
} }
} }
protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e) protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e)

View file

@ -23,7 +23,7 @@
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsDisplayName" HeaderText="gvAccountsDisplayName"> <asp:TemplateField meta:resourcekey="gvAccountsDisplayName" HeaderText="gvAccountsDisplayName">
<HeaderStyle Wrap="false" /> <HeaderStyle Wrap="false" />
<ItemStyle Width="50%" Wrap="false"></ItemStyle> <ItemStyle Width="34%" Wrap="false"></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:Image ID="img1" runat="server" ImageUrl='<%# GetAccountImage((int)Eval("AccountType")) %>' ImageAlign="AbsMiddle" /> <asp:Image ID="img1" runat="server" ImageUrl='<%# GetAccountImage((int)Eval("AccountType")) %>' ImageAlign="AbsMiddle" />
<asp:Literal ID="litDisplayName" runat="server" Text='<%# Eval("DisplayName") %>'></asp:Literal> <asp:Literal ID="litDisplayName" runat="server" Text='<%# Eval("DisplayName") %>'></asp:Literal>
@ -31,11 +31,18 @@
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsEmail" HeaderText="gvAccountsEmail"> <asp:TemplateField meta:resourcekey="gvAccountsEmail" HeaderText="gvAccountsEmail">
<HeaderStyle Wrap="false" /> <HeaderStyle Wrap="false" />
<ItemStyle Width="50%" Wrap="false"></ItemStyle> <ItemStyle Width="33%" Wrap="false"></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal> <asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsAccountType" HeaderText="gvAccountsAccountType">
<HeaderStyle Wrap="false" />
<ItemStyle Width="33%" Wrap="false"></ItemStyle>
<ItemTemplate>
<asp:Literal ID="litType" runat="server" Text='<%# GetType((int)Eval("AccountType")) %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
</Columns> </Columns>
</asp:GridView> </asp:GridView>
@ -83,18 +90,24 @@
<ItemStyle Width="10px" /> <ItemStyle Width="10px" />
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsDisplayName"> <asp:TemplateField meta:resourcekey="gvAccountsDisplayName">
<ItemStyle Width="50%"></ItemStyle> <ItemStyle Width="34%"></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:Image ID="img1" runat="server" ImageUrl='<%# GetAccountImage((int)Eval("AccountType")) %>' ImageAlign="AbsMiddle" /> <asp:Image ID="img1" runat="server" ImageUrl='<%# GetAccountImage((int)Eval("AccountType")) %>' ImageAlign="AbsMiddle" />
<asp:Literal ID="litDisplayName" runat="server" Text='<%# Eval("DisplayName") %>'></asp:Literal> <asp:Literal ID="litDisplayName" runat="server" Text='<%# Eval("DisplayName") %>'></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsEmail"> <asp:TemplateField meta:resourcekey="gvAccountsEmail">
<ItemStyle Width="50%"></ItemStyle> <ItemStyle Width="33%"></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal> <asp:Literal ID="litPrimaryEmailAddress" runat="server" Text='<%# Eval("PrimaryEmailAddress") %>'></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAccountsAccountType" HeaderText="gvAccountsAccountType">
<ItemStyle Width="33%"></ItemStyle>
<ItemTemplate>
<asp:Literal ID="litType" runat="server" Text='<%# GetType((int)Eval("AccountType")) %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
</Columns> </Columns>
</asp:GridView> </asp:GridView>
</div> </div>

View file

@ -139,9 +139,15 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
case ExchangeAccountType.Equipment: case ExchangeAccountType.Equipment:
imgName = "equipment_16.gif"; imgName = "equipment_16.gif";
break; break;
case ExchangeAccountType.DistributionList:
imgName = "dlist_16.gif";
break;
case ExchangeAccountType.SecurityGroup: case ExchangeAccountType.SecurityGroup:
imgName = "dlist_16.gif"; imgName = "dlist_16.gif";
break; break;
case ExchangeAccountType.DefaultSecurityGroup:
imgName = "dlist_16.gif";
break;
default: default:
imgName = "admin_16.png"; imgName = "admin_16.png";
break; break;
@ -150,6 +156,23 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
return GetThemedImage("Exchange/" + imgName); 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() private void BindPopupAccounts()
{ {
ExchangeAccount[] accounts = ES.Services.Organizations.SearchOrganizationAccounts(PanelRequest.ItemID, ExchangeAccount[] accounts = ES.Services.Organizations.SearchOrganizationAccounts(PanelRequest.ItemID,