internal override Organization CreateOrganizationAddressBookPolicyInternal(string organizationId, string gal, string addressBook, string roomList, string oab) { ExchangeLog.LogStart("CreateOrganizationAddressBookPolicyInternal"); ExchangeLog.LogInfo(" Organization Id: {0}", organizationId); ExchangeLog.LogInfo(" GAL: {0}", gal); ExchangeLog.LogInfo(" AddressBook: {0}", addressBook); ExchangeLog.LogInfo(" RoomList: {0}", roomList); ExchangeLog.LogInfo(" OAB: {0}", oab); ExchangeTransaction transaction = StartTransaction(); Organization info = new Organization(); string policyName = GetAddressBookPolicyName(organizationId); Runspace runSpace = null; try { runSpace = OpenRunspace(); Command cmd = new Command("New-AddressBookPolicy"); cmd.Parameters.Add("Name", policyName); cmd.Parameters.Add("AddressLists", addressBook); cmd.Parameters.Add("RoomList", roomList); cmd.Parameters.Add("GlobalAddressList", gal); cmd.Parameters.Add("OfflineAddressBook", oab); Collection <PSObject> result = ExecuteShellCommand(runSpace, cmd); info.AddressBookPolicy = GetResultObjectDN(result); } catch (Exception ex) { ExchangeLog.LogError("CreateOrganizationAddressBookPolicyInternal", ex); RollbackTransaction(transaction); throw; } finally { CloseRunspace(runSpace); } ExchangeLog.LogEnd("CreateOrganizationAddressBookPolicyInternal"); return(info); }
/// <summary> /// Creates organization on Mail Server /// </summary> /// <param name="organizationId"></param> /// <returns></returns> internal override Organization ExtendToExchangeOrganizationInternal(string organizationId, string securityGroup, bool IsConsumer) { ExchangeLog.LogStart("CreateOrganizationInternal"); ExchangeLog.DebugInfo(" Organization Id: {0}", organizationId); ExchangeTransaction transaction = StartTransaction(); Organization info = new Organization(); Runspace runSpace = null; try { runSpace = OpenRunspace(); string server = GetServerName(); string securityGroupPath = AddADPrefix(securityGroup); //Create mail enabled organization security group EnableMailSecurityDistributionGroup(runSpace, securityGroup, organizationId); transaction.RegisterMailEnabledDistributionGroup(securityGroup); UpdateSecurityDistributionGroup(runSpace, securityGroup, organizationId, IsConsumer); //create GAL string galId = CreateGlobalAddressList(runSpace, organizationId); transaction.RegisterNewGlobalAddressList(galId); ExchangeLog.LogInfo(" Global Address List: {0}", galId); UpdateGlobalAddressList(runSpace, galId, securityGroupPath); //create AL string alId = CreateAddressList(runSpace, organizationId); transaction.RegisterNewAddressList(alId); 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); UpdateAddressList(runSpace, ralId, securityGroupPath); //create ActiveSync policy string asId = CreateActiveSyncPolicy(runSpace, organizationId); transaction.RegisterNewActiveSyncPolicy(asId); ExchangeLog.LogInfo(" ActiveSync Policy: {0}", asId); info.AddressList = alId; info.GlobalAddressList = galId; info.RoomsAddressList = ralId; info.OrganizationId = organizationId; } catch (Exception ex) { ExchangeLog.LogError("CreateOrganizationInternal", ex); RollbackTransaction(transaction); throw; } finally { CloseRunspace(runSpace); } ExchangeLog.LogEnd("CreateOrganizationInternal"); return(info); }
internal string GetDatabase(Runspace runSpace, string primaryDomainController, string dagName) { string database = string.Empty; if (string.IsNullOrEmpty(dagName)) { return(string.Empty); } ExchangeLog.LogStart("GetDatabase"); ExchangeLog.LogInfo("DAG: " + dagName); // this part of code handles mailboxnames like in the old 2007 provider // check if DAG is in reality DAG\mailboxdatabase string dagNameDAG = string.Empty; string dagNameMBX = string.Empty; bool isFixedDatabase = false; if (dagName.Contains("\\")) { // split the two parts and extract DAG-Name and mailboxdatabase-name string[] parts = dagName.Split(new char[] { '\\' }, 2, StringSplitOptions.None); dagNameDAG = parts[0]; dagNameMBX = parts[1]; // check that we realy have a database name if (!String.IsNullOrEmpty(dagNameMBX)) { isFixedDatabase = true; } } else { // there is no mailboxdatabase-name use the loadbalancing-code dagNameDAG = dagName; isFixedDatabase = false; } //Get Dag Servers - with the name of the database availability group Collection <PSObject> dags = null; Command cmd = new Command("Get-DatabaseAvailabilityGroup"); cmd.Parameters.Add("Identity", dagNameDAG); dags = ExecuteShellCommand(runSpace, cmd); if (htBbalancer == null) { htBbalancer = new Hashtable(); } // use fully qualified dagName for loadbalancer. Thus if there are two services and one of them // contains only the DAG, the "fixed" database could also be used in loadbalancing. If you do not want this, // set either IsExcludedFromProvisioning or IsSuspendedFromProvisioning - it is not evaluated for fixed databases if (htBbalancer[dagName] == null) { htBbalancer.Add(dagName, 0); } if (dags != null && dags.Count > 0) { ADMultiValuedProperty <ADObjectId> servers = (ADMultiValuedProperty <ADObjectId>)GetPSObjectProperty(dags[0], "Servers"); if (servers != null) { System.Collections.Generic.List <string> lstDatabase = new System.Collections.Generic.List <string>(); if (!isFixedDatabase) // "old" loadbalancing code { foreach (object objServer in servers) { Collection <PSObject> databases = null; cmd = new Command("Get-MailboxDatabase"); cmd.Parameters.Add("Server", ObjToString(objServer)); databases = ExecuteShellCommand(runSpace, cmd); foreach (PSObject objDatabase in databases) { if (((bool)GetPSObjectProperty(objDatabase, "IsExcludedFromProvisioning") == false) && ((bool)GetPSObjectProperty(objDatabase, "IsSuspendedFromProvisioning") == false)) { string db = ObjToString(GetPSObjectProperty(objDatabase, "Identity")); bool bAdd = true; foreach (string s in lstDatabase) { if (s.ToLower() == db.ToLower()) { bAdd = false; break; } } if (bAdd) { lstDatabase.Add(db); ExchangeLog.LogInfo("AddDatabase: " + db); } } } } } else // new fixed database code { Collection <PSObject> databases = null; cmd = new Command("Get-MailboxDatabase"); cmd.Parameters.Add("Identity", dagNameMBX); databases = ExecuteShellCommand(runSpace, cmd); // do not check "IsExcludedFromProvisioning" or "IsSuspended", just check if it is a member of the DAG foreach (PSObject objDatabase in databases) { string dagSetting = ObjToString(GetPSObjectProperty(objDatabase, "MasterServerOrAvailabilityGroup")); if (dagNameDAG.Equals(dagSetting, StringComparison.OrdinalIgnoreCase)) { lstDatabase.Add(dagNameMBX); ExchangeLog.LogInfo("AddFixedDatabase: " + dagNameMBX); } } } int balancer = (int)htBbalancer[dagName]; balancer++; if (balancer >= lstDatabase.Count) { balancer = 0; } htBbalancer[dagName] = balancer; if (lstDatabase.Count != 0) { database = lstDatabase[balancer]; } } } ExchangeLog.LogEnd("GetDatabase"); return(database); }