internal static ADObjectId FindClosestPublicFolderDatabase(IConfigDataProvider scSession, ADObjectId sourceServerId) { PublicFolderDatabase publicFolderDatabase = PublicFolderDatabase.FindClosestPublicFolderDatabase(scSession, sourceServerId, null); if (publicFolderDatabase == null) { return(null); } return((ADObjectId)publicFolderDatabase.Identity); }
internal static PublicFolderDatabase FindClosestPublicFolderDatabase(IConfigDataProvider scSession, ADObjectId sourceServerId, Func <PublicFolderDatabase, bool> candidateMatcher) { if (scSession == null) { throw new ArgumentNullException("scSession"); } PublicFolderDatabase result = null; PublicFolderDatabase[] array = (PublicFolderDatabase[])scSession.Find <PublicFolderDatabase>(null, null, true, null); if (candidateMatcher != null && 0 < array.Length) { array = array.Where(candidateMatcher).ToArray <PublicFolderDatabase>(); } if (1 == array.Length) { result = array[0]; } else if (array.Length > 1) { ExchangeTopology exchangeTopology = ExchangeTopology.Discover(null, ExchangeTopologyScope.ADAndExchangeServerAndSiteTopology); TopologySite topologySite = null; TopologySite topologySite2 = null; if (sourceServerId == null) { topologySite = exchangeTopology.LocalSite; } else { string text = null; Server server = (Server)scSession.Read <Server>(sourceServerId); if (server != null) { text = server.Fqdn; } if (!string.IsNullOrEmpty(text)) { topologySite = exchangeTopology.SiteFromADServer(text); } } if (topologySite != null) { ReadOnlyCollection <TopologySite> allTopologySites = exchangeTopology.AllTopologySites; ReadOnlyCollection <TopologySiteLink> allTopologySiteLinks = exchangeTopology.AllTopologySiteLinks; ReadOnlyCollection <TopologyServer> allTopologyServers = exchangeTopology.AllTopologyServers; Dictionary <TopologyServer, TopologySite> dictionary = new Dictionary <TopologyServer, TopologySite>(); foreach (TopologyServer topologyServer in allTopologyServers) { if (topologyServer.TopologySite != null) { foreach (TopologySite topologySite3 in allTopologySites) { if (topologySite3.DistinguishedName.Equals(topologyServer.TopologySite.DistinguishedName, StringComparison.OrdinalIgnoreCase)) { dictionary[topologyServer] = topologySite3; break; } } } } Dictionary <TopologySite, PublicFolderDatabase> dictionary2 = new Dictionary <TopologySite, PublicFolderDatabase>(); List <TopologySite> list = new List <TopologySite>(); foreach (PublicFolderDatabase publicFolderDatabase in array) { foreach (KeyValuePair <TopologyServer, TopologySite> keyValuePair in dictionary) { if (keyValuePair.Key.DistinguishedName.Equals(publicFolderDatabase.Server.DistinguishedName, StringComparison.OrdinalIgnoreCase)) { if (!dictionary2.ContainsKey(keyValuePair.Value)) { dictionary2[keyValuePair.Value] = publicFolderDatabase; list.Add(keyValuePair.Value); break; } if (keyValuePair.Key.IsExchange2007OrLater) { dictionary2[keyValuePair.Value] = publicFolderDatabase; break; } break; } } } topologySite2 = exchangeTopology.FindClosestDestinationSite(topologySite, list); if (topologySite2 != null) { result = dictionary2[topologySite2]; } } if (topologySite2 == null) { result = array[0]; } } return(result); }