internal static List <ADObjectId> GetOrderedServerIdsForDatabase(IFindAdObject <IADDatabaseAvailabilityGroup> dagLookup, IADDatabase database, out Exception exception) { List <ADObjectId> masterServerIdsForDatabase = ActiveManagerUtil.GetMasterServerIdsForDatabase(dagLookup, database, out exception); if (exception != null) { return(masterServerIdsForDatabase); } if (masterServerIdsForDatabase == null || masterServerIdsForDatabase.Count == 0) { ExTraceGlobals.ActiveManagerClientTracer.TraceError <string>(0L, "Database {0} master is pointing to a non-existent/deleted server or DAG, the database has been deleted, or the database object is corrupted in the AD.", database.Name); exception = new AmDatabaseMasterIsInvalid(database.Name); return(masterServerIdsForDatabase); } int num = -1; string local = MachineName.Local; for (int i = 0; i < masterServerIdsForDatabase.Count; i++) { if (string.Equals(masterServerIdsForDatabase[i].Name, local, StringComparison.OrdinalIgnoreCase)) { num = i; break; } } if (num > 0) { ADObjectId value = masterServerIdsForDatabase[num]; masterServerIdsForDatabase[num] = masterServerIdsForDatabase[0]; masterServerIdsForDatabase[0] = value; } return(masterServerIdsForDatabase); }
private bool GetDbLocationInfoByRegistry(Guid databaseId, out DatabaseLocationInfo databaseLocationInfo) { databaseLocationInfo = null; if (this.m_key == null) { this.m_key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\ExchangeServer\\v15\\ActiveManager\\TestOverride", RegistryKeyPermissionCheck.ReadSubTree); if (this.m_key == null) { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug((long)this.GetHashCode(), "GetServerForDatabase failed opening the registry override key!"); return(false); } ExTraceGlobals.ActiveManagerClientTracer.TraceDebug((long)this.GetHashCode(), "Found registry override entry"); } object value = this.m_key.GetValue(databaseId.ToString()); if (value == null) { return(false); } string text = value as string; if (text == null) { throw new ArgumentException("Registry override for active server should be a string-typed value", "regValue"); } string[] array = text.Split(new char[] { '|' }); int num = array.Length; if (num == 3) { databaseLocationInfo = new DatabaseLocationInfo(array[0], array[1], ActiveManagerUtil.GetServerSiteFromServer(LocalServer.GetServer()), new ServerVersion(int.Parse(array[2], CultureInfo.InvariantCulture)), false); return(true); } if (num != 9) { throw new ArgumentException("Registry override for active server should be in a \"<fqdn>|<legacyDN>|<version>|<lastMountedServerFqdn>|<lastMountedServerLegacyDN>|<databaseLegacyDN>|<mountedTime>|<serverVersion>|<isHA>\" format", "databaseId"); } databaseLocationInfo = new DatabaseLocationInfo(array[0], array[1], array[2], array[3], array[4], array[1], string.Empty, false, false, string.IsNullOrEmpty(array[5]) ? Guid.Empty : new Guid(array[5]), DateTime.Parse(array[6]), null, ActiveManagerUtil.GetServerSiteFromServer(LocalServer.GetServer()), new ServerVersion(int.Parse(array[7], CultureInfo.InvariantCulture)), MailboxRelease.None, DatabaseLocationInfoResult.Success, bool.Parse(array[8])); return(true); }
internal DatabaseLocationInfo(Server server, bool isDatabaseHighlyAvailable) : this(server.Fqdn, server.ExchangeLegacyDN, ActiveManagerUtil.GetServerSiteFromServer(server), server.AdminDisplayVersion, isDatabaseHighlyAvailable) { this.serverGuid = new Guid?(server.Guid); }
internal static void GetServerInformationForDatabaseInternal(IADDatabase database, DatabaseLocationInfo minimalLocationInfo, IFindMiniServer findMiniServer) { Guid guid = database.Guid; string lastMountedServerFqdn = minimalLocationInfo.LastMountedServerFqdn; IADServer iadserver = null; ADObjectId adobjectId = null; string serverFqdn = minimalLocationInfo.ServerFqdn; if (serverFqdn != null) { iadserver = findMiniServer.FindMiniServerByFqdn(serverFqdn); } else { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <string>(0L, "GetServerInformationForDatabaseInternal({0}) is falling back to database.Server from AD, which may be stale.", database.Name); iadserver = findMiniServer.ReadMiniServerByObjectId(database.Server); } if (iadserver == null) { throw new UnableToFindServerForDatabaseException(database.Name, guid.ToString()); } ADObjectId serverSiteFromMiniServer = ActiveManagerUtil.GetServerSiteFromMiniServer(iadserver); string fqdn = iadserver.Fqdn; if (iadserver.IsExchange2007OrLater && (serverSiteFromMiniServer == null || string.IsNullOrEmpty(fqdn) || (iadserver.IsExchange2007OrLater && !iadserver.IsMailboxServer))) { throw new UnableToFindServerForDatabaseException(database.Name, guid.ToString()); } if (string.Equals(lastMountedServerFqdn, serverFqdn, StringComparison.OrdinalIgnoreCase)) { adobjectId = iadserver.Id; } else { adobjectId = ActiveManagerImplementation.TryGetServerIdByFqdn(findMiniServer, lastMountedServerFqdn); } if (adobjectId == null) { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <ADObjectId>(0L, "lastMountedServer was null. Setting to the current server ({0}).", iadserver.Id); adobjectId = iadserver.Id; } DatabaseLocationInfoResult requestResult = DatabaseLocationInfoResult.Success; IADServer iadserver2 = null; if (iadserver.Id.Equals(adobjectId)) { iadserver2 = iadserver; } else { try { iadserver2 = findMiniServer.ReadMiniServerByObjectId(adobjectId); } catch (ADTransientException arg) { ActiveManagerImplementation.Tracer.TraceDebug <ADTransientException>(0L, "ReadMiniServer() threw an ADTransientException: {0}", arg); } } IADToplogyConfigurationSession adSession = findMiniServer.AdSession; IADSite iadsite = ActiveManagerImplementation.RetrieveLocalSite(adSession); if (iadsite == null) { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug(0L, "GetServerForDatabase detected an Unknown state! adSession.GetLocalSite() is null."); requestResult = DatabaseLocationInfoResult.Unknown; } else if (iadserver2 == null) { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <ADObjectId>(0L, "GetServerForDatabase detected an Unknown state! lastMountedServerId ({0}) could not be resolved.", adobjectId); requestResult = DatabaseLocationInfoResult.Unknown; } else if (!iadserver.Id.Equals(adobjectId)) { ADObjectId serverSiteFromMiniServer2 = ActiveManagerUtil.GetServerSiteFromMiniServer(iadserver2); if (serverSiteFromMiniServer == serverSiteFromMiniServer2 || (serverSiteFromMiniServer != null && serverSiteFromMiniServer.Equals(serverSiteFromMiniServer2))) { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug(0L, "GetServerForDatabase detected InTransitSameSite! masterServer (name={0},site={1}), lastMountedServer (name={2},site={3}.", new object[] { iadserver.Id, serverSiteFromMiniServer, adobjectId, serverSiteFromMiniServer2 }); requestResult = DatabaseLocationInfoResult.InTransitSameSite; } else { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug(0L, "GetServerForDatabase detected InTransitCrossSite! masterServer (name={0},site={1}), lastMountedServer (name={2},site={3}.", new object[] { iadserver.Id, serverSiteFromMiniServer, adobjectId, serverSiteFromMiniServer2 }); requestResult = DatabaseLocationInfoResult.InTransitCrossSite; } } else if (!iadsite.Id.Equals(serverSiteFromMiniServer)) { ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <ADObjectId, ADObjectId>(0L, "GetServerForDatabase detected a SiteViolation! GetLocalSite().Id != serverSiteId ({0} != {1}).", iadsite.Id, serverSiteFromMiniServer); requestResult = DatabaseLocationInfoResult.SiteViolation; } string exchangeLegacyDN = iadserver.ExchangeLegacyDN; ServerVersion adminDisplayVersion = iadserver.AdminDisplayVersion; Guid objectGuid = iadserver.Id.ObjectGuid; string exchangeLegacyDN2 = iadserver2.ExchangeLegacyDN; iadserver2 = null; ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <Guid>(0L, "GetServerInformationForDatabaseInternal: Updating the location information for {0} in place.", guid); ADObjectId mailboxPublicFolderDatabase = database.MailboxPublicFolderDatabase; minimalLocationInfo.UpdateInPlace(fqdn, exchangeLegacyDN, minimalLocationInfo.LastMountedServerFqdn, exchangeLegacyDN2, database.ExchangeLegacyDN, database.RpcClientAccessServerLegacyDN, database.Name, database.IsPublicFolderDatabase, database.Recovery, (mailboxPublicFolderDatabase != null) ? mailboxPublicFolderDatabase.ObjectGuid : Guid.Empty, minimalLocationInfo.MountedTime, new Guid?(objectGuid), serverSiteFromMiniServer, adminDisplayVersion, iadserver.MailboxRelease, requestResult, minimalLocationInfo.IsDatabaseHighlyAvailable); }