Addressbook Policy Changes. Add Code to Create Rooms per Organization.
This commit is contained in:
parent
d01b735e6f
commit
8a99080a90
7 changed files with 157 additions and 17 deletions
|
@ -408,7 +408,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
// rollback organization creation
|
||||
if (organizationExtended)
|
||||
mailboxRole.DeleteOrganization(org.OrganizationId, org.DistinguishedName,
|
||||
org.GlobalAddressList, org.AddressList, org.OfflineAddressBook, org.SecurityGroup);
|
||||
org.GlobalAddressList, org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup);
|
||||
|
||||
// rollback domain
|
||||
if (authDomainCreated)
|
||||
|
@ -504,6 +504,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
org.DistinguishedName,
|
||||
org.GlobalAddressList,
|
||||
org.AddressList,
|
||||
org.RoomsAddressList,
|
||||
org.OfflineAddressBook,
|
||||
org.SecurityGroup);
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
string GetOABVirtualDirectory();
|
||||
Organization CreateOrganizationOfflineAddressBook(string organizationId, string securityGroup, string oabVirtualDir);
|
||||
void UpdateOrganizationOfflineAddressBook(string id);
|
||||
bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string offlineAddressBook, string securityGroup);
|
||||
bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup);
|
||||
void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays);
|
||||
ExchangeItemStatistics[] GetMailboxesStatistics(string organizationDistinguishedName);
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
private string defaultDomain;
|
||||
private string offlineAddressBook;
|
||||
private string addressList;
|
||||
private string roomsAddressList;
|
||||
private string globalAddressList;
|
||||
private string database;
|
||||
private string securityGroup;
|
||||
|
@ -167,6 +168,13 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
set { addressList = value; }
|
||||
}
|
||||
|
||||
[Persistent]
|
||||
public string RoomsAddressList
|
||||
{
|
||||
get { return roomsAddressList; }
|
||||
set { roomsAddressList = value; }
|
||||
}
|
||||
|
||||
[Persistent]
|
||||
public string GlobalAddressList
|
||||
{
|
||||
|
|
|
@ -184,11 +184,11 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
}
|
||||
|
||||
public bool DeleteOrganization(string organizationId, string distinguishedName,
|
||||
string globalAddressList, string addressList, string offlineAddressBook,
|
||||
string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook,
|
||||
string securityGroup)
|
||||
{
|
||||
return DeleteOrganizationInternal(organizationId, distinguishedName, globalAddressList,
|
||||
addressList, offlineAddressBook, securityGroup);
|
||||
addressList, roomsAddressList, offlineAddressBook, securityGroup);
|
||||
}
|
||||
|
||||
public void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB,
|
||||
|
@ -618,7 +618,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
{
|
||||
Organization org = item as Organization;
|
||||
DeleteOrganization(org.OrganizationId, org.DistinguishedName, org.GlobalAddressList,
|
||||
org.AddressList, org.OfflineAddressBook, org.SecurityGroup);
|
||||
org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup);
|
||||
}
|
||||
else if (item is ExchangeDomain)
|
||||
{
|
||||
|
@ -738,6 +738,12 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
ExchangeLog.LogInfo(" Address List: {0}", alId);
|
||||
UpdateAddressList(runSpace, alId, securityGroupPath);
|
||||
|
||||
//create RAL
|
||||
string ralId = CreateRoomsAddressList(runSpace, organizationId);
|
||||
transaction.RegisterNewRoomsAddressList(ralId);
|
||||
ExchangeLog.LogInfo(" Rooms Address List: {0}", ralId);
|
||||
UpdateRoomsAddressList(runSpace, ralId, securityGroupPath);
|
||||
|
||||
//create ActiveSync policy
|
||||
string asId = CreateActiveSyncPolicy(runSpace, organizationId);
|
||||
transaction.RegisterNewActiveSyncPolicy(asId);
|
||||
|
@ -753,6 +759,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
|
||||
info.AddressList = alId;
|
||||
info.GlobalAddressList = galId;
|
||||
info.RoomsAddressList = ralId;
|
||||
info.OrganizationId = organizationId;
|
||||
info.Database = databaseId;
|
||||
|
||||
|
@ -904,7 +911,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
|
||||
|
||||
private bool DeleteOrganizationInternal(string organizationId, string distinguishedName,
|
||||
string globalAddressList, string addressList, string offlineAddressBook, string securityGroup)
|
||||
string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup)
|
||||
{
|
||||
ExchangeLog.LogStart("DeleteOrganizationInternal");
|
||||
bool ret = true;
|
||||
|
@ -986,6 +993,18 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
ExchangeLog.LogError("Could not delete Address List " + addressList, ex);
|
||||
}
|
||||
|
||||
//delete RAL (Rooms Address List)
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(roomsAddressList))
|
||||
DeleteRoomsAddressList(runSpace, roomsAddressList);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ret = false;
|
||||
ExchangeLog.LogError("Could not delete Rooms Address List " + roomsAddressList, ex);
|
||||
}
|
||||
|
||||
//delete GAL
|
||||
try
|
||||
{
|
||||
|
@ -4730,7 +4749,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
|
||||
#endregion
|
||||
|
||||
#region Address Lists (GAL, AL, OAB, ABP)
|
||||
#region Address Lists (GAL, AL, RAL, OAB, ABP)
|
||||
|
||||
private string GetAddressListDN(Runspace runSpace, string id)
|
||||
{
|
||||
|
@ -4824,6 +4843,99 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
ExchangeLog.LogEnd("DeleteAddressList");
|
||||
}
|
||||
|
||||
private string GetRoomsAddressListDN(Runspace runSpace, string id)
|
||||
{
|
||||
ExchangeLog.LogStart("GetRoomsAddressListDN");
|
||||
string resultObjectDN = null;
|
||||
Command cmd = new Command("Get-AddressList");
|
||||
cmd.Parameters.Add("Identity", id);
|
||||
Collection<PSObject> result = this.ExecuteShellCommand(runSpace, cmd);
|
||||
if ((result != null) && (result.Count > 0))
|
||||
{
|
||||
resultObjectDN = this.GetResultObjectDN(result);
|
||||
ExchangeLog.DebugInfo("RAL DN: {0}", new object[] { resultObjectDN });
|
||||
}
|
||||
ExchangeLog.DebugInfo("GetRommsAddressListDN, cmd = {0}", cmd.CommandText);
|
||||
ExchangeLog.LogEnd("GetRoomsAddressListDN");
|
||||
return resultObjectDN;
|
||||
}
|
||||
|
||||
private string CreateRoomsAddressList(Runspace runSpace, string organizationId)
|
||||
{
|
||||
ExchangeLog.LogStart("CreateRoomsAddressList");
|
||||
string roomsAddressListName = this.GetRoomsAddressListName(organizationId);
|
||||
string roomsAddressListDN = this.GetRoomsAddressListDN(runSpace, roomsAddressListName);
|
||||
if (!string.IsNullOrEmpty(roomsAddressListDN))
|
||||
{
|
||||
//rooms address list already exists - we will use it
|
||||
ExchangeLog.LogWarning("Rooms Address List '{0}' already exists", new object[] { roomsAddressListName });
|
||||
}
|
||||
else
|
||||
{
|
||||
//try to create a new rooms address list (10 attempts)
|
||||
int attempts = 0;
|
||||
Command cmd = null;
|
||||
Collection<PSObject> result = null;
|
||||
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
//try to create address list
|
||||
cmd = new Command("New-AddressList");
|
||||
cmd.Parameters.Add("Name", roomsAddressListName);
|
||||
cmd.Parameters.Add("IncludedRecipients", "Resources");
|
||||
cmd.Parameters.Add("ConditionalCustomAttribute1", organizationId);
|
||||
|
||||
result = ExecuteShellCommand(runSpace, cmd);
|
||||
roomsAddressListDN = CheckResultObjectDN(result);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ExchangeLog.LogError(ex);
|
||||
}
|
||||
if (roomsAddressListDN != null)
|
||||
break;
|
||||
|
||||
if (attempts > 9)
|
||||
throw new Exception(
|
||||
string.Format("Could not create Rooms Address List '{0}' cmd = '{1}'", roomsAddressListName, cmd));
|
||||
|
||||
attempts++;
|
||||
ExchangeLog.LogWarning("Attempt #{0} to create rooms address list failed!", attempts);
|
||||
// wait 1 sec
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
ExchangeLog.LogEnd("CreateRoomsAddressList");
|
||||
return roomsAddressListDN;
|
||||
}
|
||||
|
||||
private void UpdateRoomsAddressList(Runspace runSpace, string id, string securityGroup)
|
||||
{
|
||||
ExchangeLog.LogStart("UpdateRoomsAddressList");
|
||||
|
||||
string path = AddADPrefix(id);
|
||||
Command cmd = new Command("Update-AddressList");
|
||||
cmd.Parameters.Add("Identity", id);
|
||||
ExecuteShellCommand(runSpace, cmd);
|
||||
|
||||
AdjustADSecurity(path, securityGroup, false);
|
||||
|
||||
ExchangeLog.LogEnd("UpdateRoomsAddressList");
|
||||
}
|
||||
|
||||
private void DeleteRoomsAddressList(Runspace runSpace, string id)
|
||||
{
|
||||
ExchangeLog.LogStart("DeleteRoomsAddressList");
|
||||
Command cmd = new Command("Remove-AddressList");
|
||||
cmd.Parameters.Add("Identity", id);
|
||||
cmd.Parameters.Add("Confirm", false);
|
||||
ExecuteShellCommand(runSpace, cmd);
|
||||
ExchangeLog.LogEnd("DeleteRoomsAddressList");
|
||||
}
|
||||
|
||||
private string GetGlobalAddressListDN(Runspace runSpace, string id)
|
||||
{
|
||||
ExchangeLog.LogStart("GetGlobalAddressListDN");
|
||||
|
@ -4945,7 +5057,7 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
string AL = GetAddressListName(organizationId);
|
||||
string GAL = GetGlobalAddressListName(organizationId);
|
||||
string OAB = GetOfflineAddressBookName(organizationId);
|
||||
string RL = "All Rooms";
|
||||
string RL = GetRoomsAddressListName(organizationId);
|
||||
|
||||
Command cmd = new Command("New-AddressBookPolicy");
|
||||
cmd.Parameters.Add("Name", ABP);
|
||||
|
@ -4991,6 +5103,11 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
return orgName + " Address Policy";
|
||||
}
|
||||
|
||||
private string GetRoomsAddressListName(string orgName)
|
||||
{
|
||||
return orgName + " Rooms";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Active Directory
|
||||
|
@ -6596,6 +6713,9 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
case TransactionAction.TransactionActionTypes.CreateAddressList:
|
||||
DeleteAddressList(runspace, action.Id);
|
||||
break;
|
||||
case TransactionAction.TransactionActionTypes.CreateRoomsAddressList:
|
||||
DeleteRoomsAddressList(runspace, action.Id);
|
||||
break;
|
||||
case TransactionAction.TransactionActionTypes.CreateOfflineAddressBook:
|
||||
DeleteOfflineAddressBook(runspace, action.Id);
|
||||
break;
|
||||
|
|
|
@ -84,6 +84,13 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
action.Id = id;
|
||||
Actions.Add(action);
|
||||
}
|
||||
internal void RegisterNewRoomsAddressList(string id)
|
||||
{
|
||||
TransactionAction action = new TransactionAction();
|
||||
action.ActionType = TransactionAction.TransactionActionTypes.CreateRoomsAddressList;
|
||||
action.Id = id;
|
||||
Actions.Add(action);
|
||||
}
|
||||
internal void RegisterNewAddressPolicy(string id)
|
||||
{
|
||||
TransactionAction action = new TransactionAction();
|
||||
|
@ -241,7 +248,8 @@ namespace WebsitePanel.Providers.HostedSolution
|
|||
AddMailboxFullAccessPermission,
|
||||
AddSendAsPermission,
|
||||
RemoveMailboxFullAccessPermission,
|
||||
RemoveSendAsPermission
|
||||
RemoveSendAsPermission,
|
||||
CreateRoomsAddressList
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -770,24 +770,26 @@ namespace WebsitePanel.Providers.Exchange {
|
|||
/// <remarks/>
|
||||
[System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")]
|
||||
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteOrganization", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
|
||||
public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string offlineAddressBook, string securityGroup) {
|
||||
public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup) {
|
||||
object[] results = this.Invoke("DeleteOrganization", new object[] {
|
||||
organizationId,
|
||||
distinguishedName,
|
||||
globalAddressList,
|
||||
addressList,
|
||||
roomsAddressList,
|
||||
offlineAddressBook,
|
||||
securityGroup});
|
||||
return ((bool)(results[0]));
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public System.IAsyncResult BeginDeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string offlineAddressBook, string securityGroup, System.AsyncCallback callback, object asyncState) {
|
||||
public System.IAsyncResult BeginDeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup, System.AsyncCallback callback, object asyncState) {
|
||||
return this.BeginInvoke("DeleteOrganization", new object[] {
|
||||
organizationId,
|
||||
distinguishedName,
|
||||
globalAddressList,
|
||||
addressList,
|
||||
roomsAddressList,
|
||||
offlineAddressBook,
|
||||
securityGroup}, callback, asyncState);
|
||||
}
|
||||
|
@ -799,12 +801,12 @@ namespace WebsitePanel.Providers.Exchange {
|
|||
}
|
||||
|
||||
/// <remarks/>
|
||||
public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string offlineAddressBook, string securityGroup) {
|
||||
this.DeleteOrganizationAsync(organizationId, distinguishedName, globalAddressList, addressList, offlineAddressBook, securityGroup, null);
|
||||
public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup) {
|
||||
this.DeleteOrganizationAsync(organizationId, distinguishedName, globalAddressList, addressList, roomsAddressList, offlineAddressBook, securityGroup, null);
|
||||
}
|
||||
|
||||
/// <remarks/>
|
||||
public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string offlineAddressBook, string securityGroup, object userState) {
|
||||
public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup, object userState) {
|
||||
if ((this.DeleteOrganizationOperationCompleted == null)) {
|
||||
this.DeleteOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationOperationCompleted);
|
||||
}
|
||||
|
@ -813,6 +815,7 @@ namespace WebsitePanel.Providers.Exchange {
|
|||
distinguishedName,
|
||||
globalAddressList,
|
||||
addressList,
|
||||
roomsAddressList,
|
||||
offlineAddressBook,
|
||||
securityGroup}, this.DeleteOrganizationOperationCompleted, userState);
|
||||
}
|
||||
|
|
|
@ -176,12 +176,12 @@ namespace WebsitePanel.Server
|
|||
}
|
||||
|
||||
[WebMethod, SoapHeader("settings")]
|
||||
public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string offlineAddressBook, string securityGroup)
|
||||
public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup)
|
||||
{
|
||||
try
|
||||
{
|
||||
LogStart("DeleteOrganization");
|
||||
bool ret = ES.DeleteOrganization(organizationId, distinguishedName, globalAddressList, addressList, offlineAddressBook, securityGroup);
|
||||
bool ret = ES.DeleteOrganization(organizationId, distinguishedName, globalAddressList, addressList, roomsAddressList, offlineAddressBook, securityGroup);
|
||||
LogEnd("DeleteOrganization");
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue