Пример #1
0
        internal static ADObjectId FindClosestPublicFolderDatabase(IConfigDataProvider scSession, ADObjectId sourceServerId)
        {
            PublicFolderDatabase publicFolderDatabase = PublicFolderDatabase.FindClosestPublicFolderDatabase(scSession, sourceServerId, null);

            if (publicFolderDatabase == null)
            {
                return(null);
            }
            return((ADObjectId)publicFolderDatabase.Identity);
        }
Пример #2
0
        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);
        }