示例#1
0
        protected override void InternalProcessRecord()
        {
            TaskLogger.LogEnter(new object[]
            {
                this.Identity
            });
            DatabaseAvailabilityGroup     databaseAvailabilityGroup = null;
            ITopologyConfigurationSession globalConfigSession       = base.GlobalConfigSession;

            if (this.DatabaseAvailabilityGroup != null)
            {
                databaseAvailabilityGroup = this.LookupDag(this.DatabaseAvailabilityGroup);
            }
            else if (this.Identity != null)
            {
                ADObjectId adobjectId = this.LookupIdentityObjectAndGetDagId();
                databaseAvailabilityGroup = globalConfigSession.Read <DatabaseAvailabilityGroup>(adobjectId);
                if (databaseAvailabilityGroup == null)
                {
                    base.WriteError(new ManagementObjectNotFoundException(Strings.ErrorDagNotFound(adobjectId.Name)), ErrorCategory.InvalidData, adobjectId);
                }
            }
            string serverToQueryFqdn          = this.DiscoverServerToQuery(this.ServerToContact, databaseAvailabilityGroup);
            HealthInfoPersisted dagHealthInfo = this.GetDagHealthInfo(serverToQueryFqdn);

            this.WriteResultsFromHealthInfo(dagHealthInfo, serverToQueryFqdn);
        }
示例#2
0
        private AmServerName GetPrimaryActiveManager(DatabaseAvailabilityGroup dag)
        {
            Exception    ex     = null;
            AmServerName result = null;

            try
            {
                result = DagTaskHelper.GetPrimaryActiveManagerNode(dag);
            }
            catch (AmFailedToDeterminePAM amFailedToDeterminePAM)
            {
                ex = amFailedToDeterminePAM;
            }
            catch (AmServerException ex2)
            {
                ex = ex2;
            }
            catch (AmServerTransientException ex3)
            {
                ex = ex3;
            }
            if (ex != null)
            {
                base.WriteError(new PAMCouldNotBeDeterminedException(dag.Name, ex.Message, ex), ErrorCategory.ConnectionError, dag);
                return(null);
            }
            return(result);
        }
        private void CheckDagMembership()
        {
            ADObjectId databaseAvailabilityGroup = this.m_server.DatabaseAvailabilityGroup;

            if (ADObjectId.IsNullOrEmpty(databaseAvailabilityGroup))
            {
                base.WriteError(new AddDatabaseCopyNewCopyMustBeInDagException(this.m_server.Name, this.DataObject.Name), ErrorCategory.InvalidArgument, null);
            }
            DatabaseAvailabilityGroup databaseAvailabilityGroup2 = (DatabaseAvailabilityGroup)base.DataSession.Read <DatabaseAvailabilityGroup>(databaseAvailabilityGroup);

            if (databaseAvailabilityGroup2 == null)
            {
                base.WriteError(new AddDatabaseCopyNewCopyMustBeInDagException(this.m_server.Name, this.DataObject.Name), ErrorCategory.InvalidArgument, null);
            }
            if (ThirdPartyReplicationMode.Enabled == databaseAvailabilityGroup2.ThirdPartyReplication)
            {
                this.m_isThirdPartyReplicationEnabled = true;
            }
            ITopologyConfigurationSession topologyConfigurationSession = (ITopologyConfigurationSession)base.DataSession;

            foreach (DatabaseCopy databaseCopy in this.m_databaseCopies)
            {
                ADObjectId hostServer = databaseCopy.HostServer;
                MiniServer miniServer = topologyConfigurationSession.ReadMiniServer(hostServer, AddMailboxDatabaseCopy.s_miniServerProperties);
                ADObjectId databaseAvailabilityGroup3 = miniServer.DatabaseAvailabilityGroup;
                if (ADObjectId.IsNullOrEmpty(databaseAvailabilityGroup3))
                {
                    base.WriteError(new AddDatabaseCopyAllCopiesMustBeInTheDagException(this.DataObject.Name, this.m_server.Name, databaseAvailabilityGroup2.Name, miniServer.Name), ErrorCategory.InvalidArgument, null);
                }
                else if (!databaseAvailabilityGroup3.Equals(databaseAvailabilityGroup))
                {
                    base.WriteError(new AddDatabaseCopyAllCopiesMustBeInSameDagException(this.DataObject.Name, this.m_server.Name, databaseAvailabilityGroup2.Name, miniServer.Name, databaseAvailabilityGroup3.Name), ErrorCategory.InvalidArgument, null);
                }
            }
        }
        protected void PerformSeedIfNecessary()
        {
            TDataObject                  dataObject    = this.DataObject;
            IIdentityParameter           id            = new DatabaseIdParameter(dataObject.Id);
            IConfigDataProvider          dataSession   = base.DataSession;
            ObjectId                     rootId        = this.RootId;
            TDataObject                  dataObject2   = this.DataObject;
            LocalizedString?             notFoundError = new LocalizedString?(Strings.ErrorDatabaseNotFound(dataObject2.Name));
            TDataObject                  dataObject3   = this.DataObject;
            Database                     database      = (Database)base.GetDataObject <Database>(id, dataSession, rootId, notFoundError, new LocalizedString?(Strings.ErrorDatabaseNotUnique(dataObject3.Name)));
            IADDatabaseAvailabilityGroup dag           = null;

            if (this.m_server.DatabaseAvailabilityGroup != null)
            {
                DatabaseAvailabilityGroup dag2 = this.ConfigurationSession.Read <DatabaseAvailabilityGroup>(this.m_server.DatabaseAvailabilityGroup);
                dag = ADObjectWrapperFactory.CreateWrapper(dag2);
            }
            ReplayConfiguration config = RemoteReplayConfiguration.TaskGetReplayConfig(dag, ADObjectWrapperFactory.CreateWrapper(database), ADObjectWrapperFactory.CreateWrapper(this.m_server));

            if (this.m_fSeeding)
            {
                this.SeedDatabase(config);
            }
            this.SuspendDatabaseCopyIfNecessary(config);
        }
示例#5
0
        protected override void InternalValidate()
        {
            TaskLogger.LogEnter();
            base.InternalValidate();
            DatabaseAvailabilityGroupNetwork dataObject                = this.DataObject;
            IConfigurationSession            configSession             = this.SetupAdSession();
            DatabaseAvailabilityGroup        databaseAvailabilityGroup = DagTaskHelper.DagIdParameterToDag(this.DatabaseAvailabilityGroup, configSession);

            DagTaskHelper.VerifyDagAndServersAreWithinScopes <DatabaseAvailabilityGroupNetwork>(this, databaseAvailabilityGroup, true);
            if (databaseAvailabilityGroup.IsDagEmpty())
            {
                base.WriteError(new DagNetworkEmptyDagException(databaseAvailabilityGroup.Name), ErrorCategory.InvalidArgument, null);
            }
            DagTaskHelper.PreventTaskWhenAutoNetConfigIsEnabled(databaseAvailabilityGroup, this);
            DagNetworkObjectId identity = new DagNetworkObjectId(databaseAvailabilityGroup.Name, dataObject.Name);

            dataObject.SetIdentity(identity);
            DagNetworkConfigDataProvider     dagNetworkConfigDataProvider     = (DagNetworkConfigDataProvider)base.DataSession;
            DagNetworkConfiguration          dagNetworkConfiguration          = dagNetworkConfigDataProvider.ReadNetConfig(databaseAvailabilityGroup);
            DatabaseAvailabilityGroupNetwork databaseAvailabilityGroupNetwork = dagNetworkConfiguration.FindNetwork(dataObject.Name);

            if (databaseAvailabilityGroupNetwork != null)
            {
                throw new DagNetworkManagementException(ServerStrings.DagNetworkCreateDupName(dataObject.Name));
            }
            DagNetworkValidation.ValidateSwitches(dataObject, new Task.TaskErrorLoggingDelegate(base.WriteError));
            if (base.Fields["Subnets"] != null)
            {
                DagNetworkValidation.ValidateSubnets(this.Subnets, dagNetworkConfiguration, this.Name, null, new Task.TaskErrorLoggingDelegate(base.WriteError), new Task.TaskWarningLoggingDelegate(this.WriteWarning), new Task.TaskVerboseLoggingDelegate(base.WriteVerbose));
                dataObject.ReplaceSubnets(this.Subnets);
            }
            TaskLogger.LogExit();
        }
示例#6
0
        public static MultiValuedProperty <ADObjectId> GetDagServers(object dagList, object dagIdentity)
        {
            if (dagList == null)
            {
                throw new ArgumentNullException("dagList");
            }
            if (!(dagList is IList))
            {
                throw new ArgumentException("dagList");
            }
            if (dagIdentity == null)
            {
                throw new ArgumentNullException("dagIdentity");
            }
            MultiValuedProperty <ADObjectId> multiValuedProperty = new MultiValuedProperty <ADObjectId>();

            foreach (object obj in ((IList)dagList))
            {
                DatabaseAvailabilityGroup databaseAvailabilityGroup = (DatabaseAvailabilityGroup)obj;
                if (databaseAvailabilityGroup != null && databaseAvailabilityGroup.Identity.Equals(dagIdentity))
                {
                    using (MultiValuedProperty <ADObjectId> .Enumerator enumerator2 = databaseAvailabilityGroup.Servers.GetEnumerator())
                    {
                        while (enumerator2.MoveNext())
                        {
                            ADObjectId item = enumerator2.Current;
                            multiValuedProperty.Add(item);
                        }
                        break;
                    }
                }
            }
            multiValuedProperty.ResetChangeTracking();
            return(multiValuedProperty);
        }
示例#7
0
        private ADDatabaseAvailabilityGroupWrapper(DatabaseAvailabilityGroup dag) : base(dag)
        {
            this.DatacenterActivationMode = (DatacenterActivationModeOption)dag[DatabaseAvailabilityGroupSchema.DataCenterActivationMode];
            this.ThirdPartyReplication    = (ThirdPartyReplicationMode)dag[DatabaseAvailabilityGroupSchema.ThirdPartyReplication];
            this.Servers = (MultiValuedProperty <ADObjectId>)dag[DatabaseAvailabilityGroupSchema.Servers];
            this.StoppedMailboxServers            = (MultiValuedProperty <string>)dag[DatabaseAvailabilityGroupSchema.StoppedMailboxServers];
            this.StartedMailboxServers            = (MultiValuedProperty <string>)dag[DatabaseAvailabilityGroupSchema.StartedMailboxServers];
            this.AutoDagVolumesRootFolderPath     = (NonRootLocalLongFullPath)dag[DatabaseAvailabilityGroupSchema.AutoDagVolumesRootFolderPath];
            this.AutoDagDatabasesRootFolderPath   = (NonRootLocalLongFullPath)dag[DatabaseAvailabilityGroupSchema.AutoDagDatabasesRootFolderPath];
            this.AutoDagDatabaseCopiesPerVolume   = (int)dag[DatabaseAvailabilityGroupSchema.AutoDagDatabaseCopiesPerVolume];
            this.AutoDagDatabaseCopiesPerDatabase = (int)dag[DatabaseAvailabilityGroupSchema.AutoDagDatabaseCopiesPerDatabase];
            this.AutoDagTotalNumberOfDatabases    = (int)dag[DatabaseAvailabilityGroupSchema.AutoDagTotalNumberOfDatabases];
            this.AutoDagTotalNumberOfServers      = (int)dag[DatabaseAvailabilityGroupSchema.AutoDagTotalNumberOfServers];
            this.ReplayLagManagerEnabled          = (bool)dag[DatabaseAvailabilityGroupSchema.ReplayLagManagerEnabled];
            this.AutoDagAutoReseedEnabled         = (bool)dag[DatabaseAvailabilityGroupSchema.AutoDagAutoReseedEnabled];
            this.AutoDagDiskReclaimerEnabled      = (bool)dag[DatabaseAvailabilityGroupSchema.AutoDagDiskReclaimerEnabled];
            this.AutoDagBitlockerEnabled          = (bool)dag[DatabaseAvailabilityGroupSchema.AutoDagBitlockerEnabled];
            this.AutoDagFIPSCompliant             = (bool)dag[DatabaseAvailabilityGroupSchema.AutoDagFIPSCompliant];
            this.AllowCrossSiteRpcClientAccess    = ((int)dag[DatabaseAvailabilityGroupSchema.AllowCrossSiteRpcClientAccess] != 0);
            this.ReplicationPort = dag.ReplicationPort;
            long networkSettings = (long)dag[DatabaseAvailabilityGroupSchema.NetworkSettings];

            DatabaseAvailabilityGroup.NetworkOption networkCompression;
            DatabaseAvailabilityGroup.NetworkOption networkEncryption;
            bool manualDagNetworkConfiguration;

            DatabaseAvailabilityGroup.DecodeNetworkSettings(networkSettings, out networkCompression, out networkEncryption, out manualDagNetworkConfiguration);
            this.NetworkCompression            = networkCompression;
            this.NetworkEncryption             = networkEncryption;
            this.ManualDagNetworkConfiguration = manualDagNetworkConfiguration;
        }
示例#8
0
        private void InternalValidateDatabaseMode()
        {
            base.InternalValidate();
            if (base.HasErrors)
            {
                return;
            }
            this.m_database   = this.DataObject.GetDatabase <Database>();
            this.m_dbCopyName = string.Format("{0}\\{1}", this.m_database.Name, this.m_server.Name);
            if (this.m_database.ReplicationType != ReplicationType.Remote)
            {
                base.WriteError(new InvalidRCROperationOnNonRcrDB(this.m_database.Name), ErrorCategory.InvalidOperation, this.Identity);
            }
            if (this.CancelSeed)
            {
                ExTraceGlobals.CmdletsTracer.TraceDebug <string>((long)this.GetHashCode(), "UpdateDatabaseCopy: CancelSeed called for database copy '{0}'", this.m_dbCopyName);
                base.WriteVerbose(Strings.SeederCancelCalled(this.m_dbCopyName));
            }
            if (this.SourceServer != null)
            {
                this.m_sourceServer = (Server)base.GetDataObject <Server>(this.SourceServer, base.DataSession, null, new LocalizedString?(Strings.ErrorServerNotFound(this.SourceServer.ToString())), new LocalizedString?(Strings.ErrorServerNotUnique(this.SourceServer.ToString())));
                if (!this.m_sourceServer.IsMailboxServer)
                {
                    base.WriteError(new OperationOnlyOnMailboxServerException(this.m_sourceServer.Name), ErrorCategory.InvalidOperation, this.Identity);
                }
                if (this.m_sourceServer.MajorVersion != Microsoft.Exchange.Data.Directory.SystemConfiguration.Server.CurrentExchangeMajorVersion)
                {
                    base.WriteError(new DagTaskErrorServerWrongVersion(this.m_sourceServer.Name), ErrorCategory.InvalidOperation, this.Identity);
                }
            }
            DatabaseAvailabilityGroup dagForDatabase = DagTaskHelper.GetDagForDatabase(this.m_database, base.DataSession, new Task.TaskErrorLoggingDelegate(base.WriteError));

            DagTaskHelper.PreventTaskWhenTPREnabled(dagForDatabase, this);
        }
        private void BuildReplayConfigurations(DatabaseAvailabilityGroup dag, IADServer server)
        {
            IADDatabaseAvailabilityGroup dag2 = null;

            if (dag != null)
            {
                dag2 = ADObjectWrapperFactory.CreateWrapper(dag);
            }
            List <ReplayConfiguration> list;
            List <ReplayConfiguration> list2;

            ReplayConfigurationHelper.TaskConstructAllDatabaseConfigurations(dag2, server, out list, out list2);
            if (list != null && list.Count > 0)
            {
                ExTraceGlobals.CmdletsTracer.TraceDebug((long)this.GetHashCode(), "BuildReplayConfigurations(): Found RCR Source Configurations.");
                this.m_serverConfigBitfield |= ServerConfig.RcrSource;
                this.m_replayConfigs.AddRange(list);
            }
            if (list2 != null && list2.Count > 0)
            {
                ExTraceGlobals.CmdletsTracer.TraceDebug((long)this.GetHashCode(), "BuildReplayConfigurations(): Found RCR Target Configurations.");
                this.m_serverConfigBitfield |= ServerConfig.RcrTarget;
                this.m_replayConfigs.AddRange(list2);
            }
            if (this.AreConfigBitsSet(ServerConfig.DagMember) && !this.AreConfigBitsSet(ServerConfig.RcrSource) && !this.AreConfigBitsSet(ServerConfig.RcrTarget))
            {
                ExTraceGlobals.CmdletsTracer.TraceDebug((long)this.GetHashCode(), "BuildReplayConfigurations(): Server is a DAG member but has no Database copies.");
                this.m_serverConfigBitfield |= ServerConfig.DagMemberNoDatabases;
            }
            ExTraceGlobals.CmdletsTracer.TraceDebug <string>((long)this.GetHashCode(), "BuildReplayConfigurations(): The following bits are set on localConfigBitfield: {0}", this.m_serverConfigBitfield.ToString());
        }
示例#10
0
        public static ADObjectId[] GetServersInDag(object dagList, object dagIdentity)
        {
            if (dagList == null)
            {
                throw new ArgumentNullException("dagList");
            }
            if (!(dagList is IList))
            {
                throw new ArgumentException("dagList");
            }
            if (dagIdentity == null)
            {
                throw new ArgumentNullException("dagIdentity");
            }
            List <ADObjectId> list = new List <ADObjectId>();

            foreach (object obj in ((IList)dagList))
            {
                DatabaseAvailabilityGroup databaseAvailabilityGroup = (DatabaseAvailabilityGroup)obj;
                if (databaseAvailabilityGroup != null && !databaseAvailabilityGroup.Identity.Equals(dagIdentity))
                {
                    list.AddRange(databaseAvailabilityGroup.Servers);
                }
            }
            return(list.ToArray());
        }
示例#11
0
 private void ResolveDag()
 {
     foreach (DatabaseAvailabilityGroupIdParameter databaseAvailabilityGroupIdParameter in this.Dag)
     {
         DatabaseAvailabilityGroup dag = base.GetDataObject <DatabaseAvailabilityGroup>(databaseAvailabilityGroupIdParameter, this.session, null, new LocalizedString?(Strings.ErrorDagNotFound(databaseAvailabilityGroupIdParameter.ToString())), new LocalizedString?(Strings.ErrorDagNotUnique(databaseAvailabilityGroupIdParameter.ToString()))) as DatabaseAvailabilityGroup;
         this.impl.ResolveDag(dag);
     }
 }
示例#12
0
 public static ADDatabaseAvailabilityGroupWrapper CreateWrapper(DatabaseAvailabilityGroup dag)
 {
     if (dag == null)
     {
         return(null);
     }
     return(new ADDatabaseAvailabilityGroupWrapper(dag));
 }
示例#13
0
        private void ApplyLoadBalanceSettingValuesToDatabase(MailboxDatabase database, DirectoryDatabase directoryDatabase)
        {
            QueryFilter filter = new ComparisonFilter(ComparisonOperator.Equal, ADObjectSchema.Id, database.MasterServerOrAvailabilityGroup);
            DatabaseAvailabilityGroup ownerDag = this.ConfigurationSession.Find <DatabaseAvailabilityGroup>(null, QueryScope.SubTree, filter, null, 1).FirstOrDefault <DatabaseAvailabilityGroup>();

            directoryDatabase.RelativeLoadCapacity = this.GetRelativeLoadCapacityForDatabase(database, ownerDag);
            directoryDatabase.MaximumSize          = this.GetMaximumFileSizeForDatabase(database, ownerDag);
        }
示例#14
0
        public static DagNetworkConfiguration GetDagNetworkConfig(DatabaseAvailabilityGroup dag)
        {
            DagNetworkConfiguration dagNetworkConfiguration = null;

            if (dag.Servers.Count == 0)
            {
                return(null);
            }
            Exception ex = null;
            ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 85, "GetDagNetworkConfig", "f:\\15.00.1497\\sources\\dev\\data\\src\\storage\\Cluster\\DagNetworkClientRpc.cs");

            topologyConfigurationSession.UseConfigNC      = false;
            topologyConfigurationSession.UseGlobalCatalog = true;
            foreach (ADObjectId adobjectId in dag.Servers)
            {
                try
                {
                    ADComputer adcomputer = topologyConfigurationSession.FindComputerByHostName(adobjectId.Name);
                    if (adcomputer != null && !string.IsNullOrEmpty(adcomputer.DnsHostName))
                    {
                        if (dag.DatacenterActivationMode != DatacenterActivationModeOption.DagOnly || !dag.StoppedMailboxServers.Contains(adcomputer.DnsHostName, StringComparer.OrdinalIgnoreCase))
                        {
                            dagNetworkConfiguration = DagNetworkRpc.GetDagNetworkConfig(adcomputer.DnsHostName);
                            if (dagNetworkConfiguration != null)
                            {
                                break;
                            }
                        }
                    }
                }
                catch (TaskServerTransientException ex2)
                {
                    ex = ex2;
                }
                catch (TaskServerException ex3)
                {
                    ex = ex3;
                }
                catch (ADTransientException ex4)
                {
                    ex = ex4;
                }
                catch (ADExternalException ex5)
                {
                    ex = ex5;
                }
                catch (ADOperationException ex6)
                {
                    ex = ex6;
                }
            }
            if (dagNetworkConfiguration == null && ex != null)
            {
                throw ex;
            }
            return(dagNetworkConfiguration);
        }
        private List <DatabaseAvailabilityGroupNetwork> Find(QueryFilter queryFilter, ObjectId rootId, bool deepSearch, SortBy sortBy)
        {
            List <DatabaseAvailabilityGroupNetwork> list = new List <DatabaseAvailabilityGroupNetwork>();
            DagNetworkQueryFilter dagNetworkQueryFilter  = null;

            if (queryFilter != null)
            {
                dagNetworkQueryFilter = (queryFilter as DagNetworkQueryFilter);
            }
            IEnumerable <DatabaseAvailabilityGroup> enumerable;

            if (this.TargetDag != null)
            {
                enumerable = new DatabaseAvailabilityGroup[]
                {
                    this.TargetDag
                };
            }
            else
            {
                string identity = "*";
                if (dagNetworkQueryFilter != null && dagNetworkQueryFilter.NamesToMatch != null && dagNetworkQueryFilter.NamesToMatch.DagName != null)
                {
                    identity = dagNetworkQueryFilter.NamesToMatch.DagName;
                }
                DatabaseAvailabilityGroupIdParameter databaseAvailabilityGroupIdParameter = DatabaseAvailabilityGroupIdParameter.Parse(identity);
                enumerable = databaseAvailabilityGroupIdParameter.GetObjects <DatabaseAvailabilityGroup>(null, this.m_adSession);
            }
            if (enumerable != null)
            {
                Regex regex = null;
                if (dagNetworkQueryFilter != null && dagNetworkQueryFilter.NamesToMatch != null && dagNetworkQueryFilter.NamesToMatch.NetName != null)
                {
                    string pattern = Wildcard.ConvertToRegexPattern(dagNetworkQueryFilter.NamesToMatch.NetName);
                    regex = new Regex(pattern, RegexOptions.IgnoreCase);
                }
                foreach (DatabaseAvailabilityGroup databaseAvailabilityGroup in enumerable)
                {
                    DagNetworkConfiguration dagNetworkConfiguration = (this.m_targetServer == null) ? DagNetworkRpc.GetDagNetworkConfig(databaseAvailabilityGroup) : DagNetworkRpc.GetDagNetworkConfig(this.m_targetServer);
                    if (dagNetworkConfiguration != null && dagNetworkConfiguration.Networks != null)
                    {
                        this.m_netConfig = dagNetworkConfiguration;
                        foreach (DatabaseAvailabilityGroupNetwork databaseAvailabilityGroupNetwork in dagNetworkConfiguration.Networks)
                        {
                            if (regex == null || regex.IsMatch(databaseAvailabilityGroupNetwork.Name))
                            {
                                DagNetworkObjectId identity2 = new DagNetworkObjectId(databaseAvailabilityGroup.Name, databaseAvailabilityGroupNetwork.Name);
                                databaseAvailabilityGroupNetwork.SetIdentity(identity2);
                                databaseAvailabilityGroupNetwork.ResetChangeTracking();
                                list.Add(databaseAvailabilityGroupNetwork);
                            }
                        }
                    }
                }
            }
            return(list);
        }
 protected override void InternalValidate()
 {
     TaskLogger.LogEnter();
     try
     {
         ExTraceGlobals.CmdletsTracer.TraceDebug <string, DatabaseCopyIdParameter>((long)this.GetHashCode(), "DatabaseCopyStateAction: enter InternalValidate(DB,ident): {0}, {1}", base.DatabaseName, this.Identity);
         base.InternalValidate();
         if (base.HasErrors)
         {
             TaskLogger.LogExit();
         }
         else
         {
             Database database = this.DataObject.GetDatabase <Database>();
             DatabaseAvailabilityGroup dagForDatabase = DagTaskHelper.GetDagForDatabase(database, base.DataSession, new Task.TaskErrorLoggingDelegate(base.WriteError));
             DagTaskHelper.PreventTaskWhenTPREnabled(dagForDatabase, this);
             this.m_UseRpc = ReplayRpcVersionControl.IsSuspendRpcSupported(this.Server.AdminDisplayVersion);
             ServerVersion serverVersion = this.IsReplayLagManagementOperation ? ReplayRpcVersionControl.GetCopyStatusEx4RpcSupportVersion : ReplayRpcVersionControl.SuspendRpcSupportVersion;
             if (this.m_UseRpc)
             {
                 if (this.IsSuspendOperation)
                 {
                     base.WriteVerbose(Strings.SuspendSgcUseRpc(this.Server.AdminDisplayVersion.ToString(), serverVersion.ToString()));
                 }
                 else
                 {
                     base.WriteVerbose(Strings.ResumeSgcUseRpc(this.Server.AdminDisplayVersion.ToString(), serverVersion.ToString()));
                 }
             }
             else if (this.IsReplayLagManagementOperation)
             {
                 base.WriteError(new ReplayLagRpcUnsupportedException(this.Server.Name, this.Server.AdminDisplayVersion.ToString(), ReplayRpcVersionControl.GetCopyStatusEx4RpcSupportVersion.ToString()), ExchangeErrorCategory.ServerOperation, this.Server);
             }
             else if (this.IsSuspendOperation)
             {
                 base.WriteVerbose(Strings.SuspendSgcUseState(this.Server.Name, this.Server.AdminDisplayVersion.ToString(), ReplayRpcVersionControl.SuspendRpcSupportVersion.ToString()));
             }
             else
             {
                 base.WriteVerbose(Strings.ResumeSgcUseState(this.Server.Name, this.Server.AdminDisplayVersion.ToString(), ReplayRpcVersionControl.SuspendRpcSupportVersion.ToString()));
             }
             this.IsActivationRpcSupported      = ReplayRpcVersionControl.IsActivationRpcSupported(this.Server.AdminDisplayVersion);
             this.IsRequestSuspend3RpcSupported = ReplayRpcVersionControl.IsRequestSuspend3RpcSupported(this.Server.AdminDisplayVersion);
             this.IsOperationRunOnSource        = false;
             DatabaseLocationInfo databaseLocationInfo;
             if (database.ReplicationType == ReplicationType.Remote && RemoteReplayConfiguration.IsServerRcrSource(ADObjectWrapperFactory.CreateWrapper(database), ADObjectWrapperFactory.CreateWrapper(this.Server), out databaseLocationInfo))
             {
                 this.IsOperationRunOnSource = true;
             }
             ExTraceGlobals.CmdletsTracer.TraceDebug <string>((long)this.GetHashCode(), "DatabaseCopyStateAction: leave InternalValidate: {0}", base.DatabaseName);
         }
     }
     finally
     {
         TaskLogger.LogExit();
     }
 }
 public override void ResolveDag(DatabaseAvailabilityGroup dag)
 {
     foreach (Server server in this.GetAllServersInForest())
     {
         if (dag.Id.Equals(server.DatabaseAvailabilityGroup))
         {
             this.ResolveServer(server);
         }
     }
 }
 protected override void InternalValidate()
 {
     TaskLogger.LogEnter();
     base.InternalValidate();
     if (this.preExistingDatabase != null)
     {
         TaskLogger.LogExit();
         return;
     }
     if (this.PublicFolderDatabase == null)
     {
         if (base.OwnerServerPublicFolderDatabases != null && base.OwnerServerPublicFolderDatabases.Length > 0)
         {
             this.DataObject.PublicFolderDatabase = (ADObjectId)base.OwnerServerPublicFolderDatabases[0].Identity;
         }
         else
         {
             base.WriteVerbose(Strings.VerboseFindClosestPublicFolderDatabaseFromServer(base.OwnerServer.Id.ToString()));
             this.DataObject.PublicFolderDatabase = Microsoft.Exchange.Data.Directory.SystemConfiguration.PublicFolderDatabase.FindClosestPublicFolderDatabase(base.DataSession, base.OwnerServer.Id);
         }
     }
     else
     {
         this.PublicFolderDatabase.AllowLegacy = true;
         IConfigurable dataObject = base.GetDataObject <PublicFolderDatabase>(this.PublicFolderDatabase, base.DataSession, null, new LocalizedString?(Strings.ErrorPublicFolderDatabaseNotFound(this.PublicFolderDatabase.ToString())), new LocalizedString?(Strings.ErrorPublicFolderDatabaseNotUnique(this.PublicFolderDatabase.ToString())));
         this.DataObject.PublicFolderDatabase = (ADObjectId)dataObject.Identity;
     }
     if (this.OfflineAddressBook != null)
     {
         IConfigurable dataObject2 = base.GetDataObject <OfflineAddressBook>(this.OfflineAddressBook, base.DataSession, null, new LocalizedString?(Strings.ErrorOfflineAddressBookNotFound(this.OfflineAddressBook.ToString())), new LocalizedString?(Strings.ErrorOfflineAddressBookNotUnique(this.OfflineAddressBook.ToString())));
         this.DataObject.OfflineAddressBook = (ADObjectId)dataObject2.Identity;
     }
     base.ValidateFilePaths(base.ParameterSetName == "Recovery");
     if (base.Fields.IsModified("AutoDagExcludeFromMonitoring"))
     {
         this.DataObject.AutoDagExcludeFromMonitoring = this.AutoDagExcludeFromMonitoring;
     }
     else
     {
         DatabaseAvailabilityGroup databaseAvailabilityGroup = DagTaskHelper.ReadDag(this.DataObject.MasterServerOrAvailabilityGroup, this.ConfigurationSession);
         if (databaseAvailabilityGroup != null)
         {
             DatabaseAvailabilityGroupConfiguration databaseAvailabilityGroupConfiguration = DagConfigurationHelper.ReadDagConfig(databaseAvailabilityGroup.DatabaseAvailabilityGroupConfiguration, this.ConfigurationSession);
             if (databaseAvailabilityGroupConfiguration != null)
             {
                 DagConfigurationHelper dagConfigurationHelper = DagConfigurationHelper.Deserialize(databaseAvailabilityGroupConfiguration.ConfigurationXML);
                 if (dagConfigurationHelper.MinCopiesPerDatabaseForMonitoring > 1)
                 {
                     this.DataObject.AutoDagExcludeFromMonitoring = true;
                 }
             }
         }
     }
     TaskLogger.LogExit();
 }
        internal ReplayConfiguration ConstructReplayConfiguration(Database database)
        {
            IADDatabaseAvailabilityGroup dag = null;

            if (this.m_server.DatabaseAvailabilityGroup != null)
            {
                DatabaseAvailabilityGroup dag2 = this.ConfigurationSession.Read <DatabaseAvailabilityGroup>(this.m_server.DatabaseAvailabilityGroup);
                dag = ADObjectWrapperFactory.CreateWrapper(dag2);
            }
            return(RemoteReplayConfiguration.TaskGetReplayConfig(dag, ADObjectWrapperFactory.CreateWrapper(database), ADObjectWrapperFactory.CreateWrapper(this.m_server)));
        }
示例#20
0
 private int GetRelativeLoadCapacityForDatabase(MailboxDatabase database, DatabaseAvailabilityGroup ownerDag)
 {
     if (database.MailboxLoadBalanceRelativeLoadCapacity != null)
     {
         return(database.MailboxLoadBalanceRelativeLoadCapacity.Value);
     }
     if (ownerDag != null && ownerDag.MailboxLoadBalanceRelativeLoadCapacity != null)
     {
         return(ownerDag.MailboxLoadBalanceRelativeLoadCapacity.Value);
     }
     return(this.settings.DefaultDatabaseRelativeLoadCapacity);
 }
 public IADDatabaseAvailabilityGroup FindDagByServer(IADServer server)
 {
     if (server != null)
     {
         ADObjectId databaseAvailabilityGroup = server.DatabaseAvailabilityGroup;
         if (databaseAvailabilityGroup != null && !databaseAvailabilityGroup.IsDeleted)
         {
             DatabaseAvailabilityGroup dag = this.m_session.Read <DatabaseAvailabilityGroup>(databaseAvailabilityGroup);
             return(ADObjectWrapperFactory.CreateWrapper(dag));
         }
     }
     return(null);
 }
示例#22
0
        private ByteQuantifiedSize GetMaximumDatabaseFileSizeForDag(DatabaseAvailabilityGroup dag)
        {
            ByteQuantifiedSize result;

            if (dag != null && dag.MailboxLoadBalanceMaximumEdbFileSize != null)
            {
                result = dag.MailboxLoadBalanceMaximumEdbFileSize.Value;
            }
            else
            {
                result = ByteQuantifiedSize.FromGB((ulong)this.settings.DefaultDatabaseMaxSizeGb);
            }
            return(result);
        }
示例#23
0
        private void InternalValidateServerMode()
        {
            this.ResolveServerParameters();
            DatabaseTasksHelper.CheckServerObjectForCopyTask(this.Server, new Task.TaskErrorLoggingDelegate(base.WriteError), this.m_server);
            if (this.m_server.DatabaseAvailabilityGroup == null)
            {
                base.WriteError(new InvalidOperationException(Strings.ErrorSourceServerNotInDag(this.m_server.Name)), ErrorCategory.InvalidOperation, this.m_server);
            }
            DatabaseAvailabilityGroup databaseAvailabilityGroup = ((IConfigurationSession)base.DataSession).Read <DatabaseAvailabilityGroup>(this.m_server.DatabaseAvailabilityGroup);

            if (databaseAvailabilityGroup == null)
            {
                base.WriteError(new InconsistentADException(Strings.InconsistentServerNotInDag(this.m_server.Name, this.m_server.DatabaseAvailabilityGroup.ToString())), ErrorCategory.InvalidOperation, this.m_server);
            }
            DagTaskHelper.PreventTaskWhenTPREnabled(databaseAvailabilityGroup, this);
        }
示例#24
0
        public static void SetDagNetwork(DatabaseAvailabilityGroup dag, SetDagNetworkRequest change)
        {
            if (dag.Servers.Count == 0)
            {
                return;
            }
            AmPamInfo primaryActiveManager = AmRpcClientHelper.GetPrimaryActiveManager(ADObjectWrapperFactory.CreateWrapper(dag));
            string    targetServerName     = primaryActiveManager.ServerName;

            byte[] changeAsBytes = Serialization.ObjectToBytes(change);
            DagNetworkRpc.RunRpcOperation(targetServerName, delegate(ReplayRpcClient rpcClient)
            {
                ExTraceGlobals.DatabaseAvailabilityGroupTracer.TraceDebug <string>(0L, "SetDagNetwork sending RPC to {0}", targetServerName);
                return(rpcClient.SetDagNetwork(changeAsBytes));
            });
        }
 // Token: 0x06000815 RID: 2069 RVA: 0x00020EB8 File Offset: 0x0001F0B8
 private void ResolveMasterServerOrDag()
 {
     if (this.serversList == null)
     {
         Database database = this.InvokeResourceForest <Database>(() => this.configSession.FindDatabaseByGuid <Database>(this.DatabaseGuid));
         if (database == null)
         {
             throw new DatabaseNotFoundException(this.DatabaseGuid.ToString());
         }
         ADObjectId masterServerOrDag = null;
         if (database.ExchangeVersion.IsOlderThan(ExchangeObjectVersion.Exchange2010))
         {
             masterServerOrDag = database.Server;
         }
         else
         {
             masterServerOrDag = database.MasterServerOrAvailabilityGroup;
         }
         if (masterServerOrDag == null)
         {
             return;
         }
         if (database.MasterType == MasterType.DatabaseAvailabilityGroup)
         {
             DatabaseAvailabilityGroup databaseAvailabilityGroup = this.InvokeResourceForest <DatabaseAvailabilityGroup>(() => this.configSession.Read <DatabaseAvailabilityGroup>(masterServerOrDag));
             this.Tracer.TraceDebug <Guid, string>((long)this.GetHashCode(), "[MailboxServerLocator.ResolveMasterServerOrDag] Database {0} is mastered by DatabaseAvailabilityGroup {1}.", this.DatabaseGuid, databaseAvailabilityGroup.Id.ToString());
             this.serversList = new List <ADObjectId>(databaseAvailabilityGroup.Servers);
         }
         else
         {
             this.serversList = new List <ADObjectId>
             {
                 masterServerOrDag
             };
         }
     }
     this.masterServer = this.InvokeResourceForest <MiniServer>(() => this.SelectServerFromDag(this.configSession, this.serversList, this.contactedServers));
     this.Tracer.TraceDebug <string>((long)this.GetHashCode(), "[MailboxServerLocator.ResolveMasterServerOrDag] To ServerLocatorService host to use is {0}.", (this.masterServer != null) ? this.masterServer.Fqdn : null);
 }
        private static IList <string> GetDagMembers(IConfigurationSession globalConfigSession, ADObjectId databaseAvailabilityGroupId)
        {
            List <string>             list = new List <string>(5);
            DatabaseAvailabilityGroup databaseAvailabilityGroup = globalConfigSession.Read <DatabaseAvailabilityGroup>(databaseAvailabilityGroupId);

            if (databaseAvailabilityGroup == null)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <ADObjectId>(0, "Null DAG object read for ADObjectId: {0}", databaseAvailabilityGroupId);
                return(list);
            }
            if (databaseAvailabilityGroup.Servers == null)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <ADObjectId>(0, "Servers attribute set to null for DAG-Id: {0}", databaseAvailabilityGroupId);
                return(list);
            }
            foreach (ADObjectId adobjectId in databaseAvailabilityGroup.Servers)
            {
                Server server = globalConfigSession.Read <Server>(adobjectId);
                if (server == null)
                {
                    TraceWrapper.SearchLibraryTracer.TraceError <ADObjectId, ADObjectId>(0, "Null Server attribute was read for server-ID: {0} for DAG-Id: {1}", adobjectId, databaseAvailabilityGroupId);
                    TrackingFatalException.RaiseED(ErrorCode.InvalidADData, "NonExistent Object: {0}", new object[]
                    {
                        adobjectId
                    });
                }
                if (string.IsNullOrEmpty(server.Fqdn))
                {
                    TraceWrapper.SearchLibraryTracer.TraceError <ADObjectId, ADObjectId>(0, "Null/Empty FQDN for server with ID: {0} for DAG-Id: {1}", adobjectId, databaseAvailabilityGroupId);
                    TrackingFatalException.RaiseED(ErrorCode.InvalidADData, "Missing FQDN: {0}", new object[]
                    {
                        adobjectId
                    });
                }
                TraceWrapper.SearchLibraryTracer.TraceDebug <string>(0, "Found server: {0}", server.Fqdn);
                list.Add(server.Fqdn);
            }
            return(list);
        }
示例#27
0
        protected override void InternalValidate()
        {
            TaskLogger.LogEnter();
            base.InternalValidate();
            DatabaseAvailabilityGroupNetwork dataObject = this.DataObject;
            DagNetworkObjectId dagNetworkObjectId       = (DagNetworkObjectId)dataObject.Identity;

            ExTraceGlobals.CmdletsTracer.TraceError <string>((long)this.GetHashCode(), "Validating SetDAGNetwork({0})", dagNetworkObjectId.FullName);
            IConfigurationSession     configSession = this.SetupAdSession();
            DatabaseAvailabilityGroup dag           = DagTaskHelper.ReadDagByName(dagNetworkObjectId.DagName, configSession);

            DagTaskHelper.VerifyDagAndServersAreWithinScopes <DatabaseAvailabilityGroupNetwork>(this, dag, true);
            DagTaskHelper.PreventTaskWhenAutoNetConfigIsEnabled(dag, this);
            DagNetworkConfigDataProvider     dagNetworkConfigDataProvider = (DagNetworkConfigDataProvider)base.DataSession;
            DagNetworkConfiguration          networkConfig = dagNetworkConfigDataProvider.NetworkConfig;
            DatabaseAvailabilityGroupNetwork databaseAvailabilityGroupNetwork = (DatabaseAvailabilityGroupNetwork)dataObject.GetOriginalObject();
            string name = databaseAvailabilityGroupNetwork.Name;
            DatabaseAvailabilityGroupNetwork networkBeingChanged = null;

            foreach (DatabaseAvailabilityGroupNetwork databaseAvailabilityGroupNetwork2 in networkConfig.Networks)
            {
                if (databaseAvailabilityGroupNetwork2 == dataObject)
                {
                    networkBeingChanged = databaseAvailabilityGroupNetwork2;
                }
                else if (DatabaseAvailabilityGroupNetwork.NameComparer.Equals(databaseAvailabilityGroupNetwork2.Name, dataObject.Name))
                {
                    throw new DagNetworkManagementException(ServerStrings.DagNetworkRenameDupName(name, dataObject.Name));
                }
            }
            DagNetworkValidation.ValidateSwitches(dataObject, new Task.TaskErrorLoggingDelegate(base.WriteError));
            if (base.Fields["Subnets"] != null)
            {
                DagNetworkValidation.ValidateSubnets(this.Subnets, networkConfig, dataObject.Name, networkBeingChanged, new Task.TaskErrorLoggingDelegate(base.WriteError), new Task.TaskWarningLoggingDelegate(this.WriteWarning), new Task.TaskVerboseLoggingDelegate(base.WriteVerbose));
                dataObject.ReplaceSubnets(this.Subnets);
            }
            DagNetworkValidation.WarnIfAllNetsAreDisabled(networkConfig, new Task.TaskWarningLoggingDelegate(this.WriteWarning));
            TaskLogger.LogExit();
        }
        protected override void InternalValidate()
        {
            TaskLogger.LogEnter();
            base.InternalValidate();
            this.m_output = new HaTaskOutputHelper("remove-databaseavailabilitygroupnetwork", new Task.TaskErrorLoggingDelegate(base.WriteError), new Task.TaskWarningLoggingDelegate(this.WriteWarning), new Task.TaskVerboseLoggingDelegate(base.WriteVerbose), new Task.TaskProgressLoggingDelegate(base.WriteProgress), this.GetHashCode());
            DatabaseAvailabilityGroupNetwork dataObject = base.DataObject;
            DagNetworkObjectId dagNetworkObjectId       = (DagNetworkObjectId)dataObject.Identity;

            ExTraceGlobals.CmdletsTracer.TraceError <string>((long)this.GetHashCode(), "Validating RemoveDAGNetwork({0})", dagNetworkObjectId.FullName);
            IConfigurationSession     configSession = this.SetupAdSession();
            DatabaseAvailabilityGroup dag           = DagTaskHelper.ReadDagByName(dagNetworkObjectId.DagName, configSession);

            DagTaskHelper.VerifyDagAndServersAreWithinScopes <DatabaseAvailabilityGroupNetwork>(this, dag, true);
            DagTaskHelper.PreventTaskWhenAutoNetConfigIsEnabled(dag, this);
            foreach (DatabaseAvailabilityGroupNetworkSubnet databaseAvailabilityGroupNetworkSubnet in dataObject.Subnets)
            {
                if (databaseAvailabilityGroupNetworkSubnet.State != DatabaseAvailabilityGroupNetworkSubnet.SubnetState.Unknown)
                {
                    this.m_output.WriteErrorSimple(new DagNetworkManagementException(ServerStrings.DagNetworkCannotRemoveActiveSubnet(dataObject.Name)));
                }
            }
            TaskLogger.LogExit();
        }
 private void ResolveTargets()
 {
     if (base.Fields.IsChanged("Server") && this.Server != null)
     {
         foreach (ServerIdParameter serverIdParameter in this.Server)
         {
             Server item = (Server)base.GetDataObject <Server>(serverIdParameter, base.RootOrgGlobalConfigSession, null, new LocalizedString?(Strings.ErrorServerNotFound(serverIdParameter.ToString())), new LocalizedString?(Strings.ErrorServerNotUnique(serverIdParameter.ToString())));
             if (!this.servers.Contains(item))
             {
                 this.servers.Add(item);
             }
         }
     }
     if (base.Fields.IsChanged("Dag") && this.Dag != null)
     {
         foreach (DatabaseAvailabilityGroupIdParameter databaseAvailabilityGroupIdParameter in this.Dag)
         {
             DatabaseAvailabilityGroup item2 = (DatabaseAvailabilityGroup)base.GetDataObject <DatabaseAvailabilityGroup>(databaseAvailabilityGroupIdParameter, base.RootOrgGlobalConfigSession, null, new LocalizedString?(Strings.ErrorDagNotFound(databaseAvailabilityGroupIdParameter.ToString())), new LocalizedString?(Strings.ErrorDagNotUnique(databaseAvailabilityGroupIdParameter.ToString())));
             if (!this.dags.Contains(item2))
             {
                 this.dags.Add(item2);
             }
         }
     }
     if (base.Fields.IsChanged("Site") && this.Site != null)
     {
         foreach (AdSiteIdParameter adSiteIdParameter in this.Site)
         {
             ADSite item3 = (ADSite)base.GetDataObject <ADSite>(adSiteIdParameter, base.RootOrgGlobalConfigSession, null, new LocalizedString?(Strings.ErrorSiteNotFound(adSiteIdParameter.ToString())), new LocalizedString?(Strings.ErrorSiteNotUnique(adSiteIdParameter.ToString())));
             if (!this.sites.Contains(item3))
             {
                 this.sites.Add(item3);
             }
         }
     }
 }
示例#30
0
        protected string DiscoverServerToQuery(ServerIdParameter serverToContactParam, DatabaseAvailabilityGroup dag)
        {
            string fqdn;

            if (serverToContactParam == null)
            {
                AmServerName primaryActiveManager = this.GetPrimaryActiveManager(dag);
                fqdn = primaryActiveManager.Fqdn;
            }
            else
            {
                Server     server = this.LookupServer(serverToContactParam);
                ADObjectId databaseAvailabilityGroup = server.DatabaseAvailabilityGroup;
                if (databaseAvailabilityGroup == null)
                {
                    base.WriteError(new ServerMustBeInDagException(server.Fqdn), ErrorCategory.InvalidData, serverToContactParam);
                    return(null);
                }
                if (!databaseAvailabilityGroup.Equals(dag.Id))
                {
                    base.WriteError(new ServerToContactMustBeInSameDagException(server.Name, dag.Name, databaseAvailabilityGroup.Name), ErrorCategory.InvalidData, serverToContactParam);
                    return(null);
                }
                fqdn = server.Fqdn;
            }
            return(fqdn);
        }