示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
        }