public static TargetForestConfiguration FindByDomain(OrganizationId organizationId, string domainName)
 {
     if (!VariantConfiguration.GetSnapshot(MachineSettingsContext.Local, null, null).Global.MultiTenancy.Enabled)
     {
         TargetForestConfiguration result;
         if (!TargetForestConfigurationCache.cache.TryGetValue(domainName, out result))
         {
             TargetForestConfigurationCache.ConfigurationTracer.TraceError <object, string>(0L, "{0}: TargetForestConfiguration for domain {1} could not be found in cache", TraceContext.Get(), domainName);
             throw new AddressSpaceNotFoundException(Strings.descConfigurationInformationNotFound(domainName), 51004U);
         }
         return(result);
     }
     else
     {
         if (organizationId == null)
         {
             OrganizationId forestWideOrgId = OrganizationId.ForestWideOrgId;
         }
         OrganizationIdCacheValue organizationIdCacheValue = OrganizationIdCache.Singleton.Get(organizationId);
         if (organizationIdCacheValue == null)
         {
             TargetForestConfigurationCache.ConfigurationTracer.TraceError <object, OrganizationId>(0L, "{0}: Unable to find organization {1} in the OrgId cache", TraceContext.Get(), organizationId);
             throw new AddressSpaceNotFoundException(Strings.descConfigurationInformationNotFound(domainName), 64316U);
         }
         AvailabilityAddressSpace availabilityAddressSpace = organizationIdCacheValue.GetAvailabilityAddressSpace(domainName);
         if (availabilityAddressSpace != null)
         {
             TargetForestConfiguration result = TargetForestConfigurationCache.ConstructTargetForestConfiguration(availabilityAddressSpace, null);
             return(result);
         }
         TargetForestConfigurationCache.ConfigurationTracer.TraceError <object, string, OrganizationId>(0L, "{0}: TargetForestConfiguration for domain {1} could not be found in cache for organization {2}", TraceContext.Get(), domainName, organizationId);
         throw new AddressSpaceNotFoundException(Strings.descConfigurationInformationNotFound(domainName), 47932U);
     }
 }
示例#2
0
        private void ConfigureAvailabilityAddressSpace(ITaskContext taskContext)
        {
            string forestName = taskContext.Parameters.Get <string>("_hybridDomain");
            AvailabilityAddressSpace availabilityAddressSpace = (from x in base.OnPremisesSession.GetAvailabilityAddressSpace()
                                                                 where string.Equals(x.ForestName, forestName, StringComparison.CurrentCultureIgnoreCase)
                                                                 select x).FirstOrDefault <AvailabilityAddressSpace>();

            if (availabilityAddressSpace != null && availabilityAddressSpace.AccessMethod == AvailabilityAccessMethod.InternalProxy && availabilityAddressSpace.UseServiceAccount && availabilityAddressSpace.ProxyUrl != null)
            {
                return;
            }
            Uri uri = (from x in base.OnPremisesSession.GetExchangeServer()
                       where x.AdminDisplayVersion.Major >= 15
                       select base.OnPremisesSession.GetWebServicesVirtualDirectory(x.Identity.Name).FirstOrDefault <ADWebServicesVirtualDirectory>() into x
                       where x != null && x.ExternalUrl != null
                       select x.InternalUrl).FirstOrDefault <Uri>();

            if (uri == null)
            {
                throw new LocalizedException(HybridStrings.ErrorHybridNoCASWithEWSURL);
            }
            if (availabilityAddressSpace != null)
            {
                base.OnPremisesSession.RemoveAvailabilityAddressSpace(availabilityAddressSpace.Identity.ToString());
            }
            base.OnPremisesSession.AddAvailabilityAddressSpace(forestName, AvailabilityAccessMethod.InternalProxy, true, uri);
        }
        private static TargetForestConfiguration ConstructTargetForestConfiguration(AvailabilityAddressSpace addressSpace, ScpSearch localScpSearch)
        {
            TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string>(0L, "Processing AvailabilityAddressSpace name: {0}", addressSpace.ForestName);
            NetworkCredential     networkCredential     = null;
            AutodiscoverUrlSource autodiscoverUrlSource = AutodiscoverUrlSource.Unknown;
            Uri uri = null;

            if (addressSpace.AccessMethod != AvailabilityAccessMethod.OrgWideFB && addressSpace.AccessMethod != AvailabilityAccessMethod.PerUserFB)
            {
                if (addressSpace.AccessMethod != AvailabilityAccessMethod.OrgWideFBBasic)
                {
                    goto IL_1B2;
                }
            }
            try
            {
                networkCredential = TargetForestConfigurationCache.GetCredentials(addressSpace);
            }
            catch (InvalidCrossForestCredentialsException exception)
            {
                return(new TargetForestConfiguration(addressSpace.Id.ToString(), addressSpace.ForestName, exception));
            }
            if (addressSpace.TargetAutodiscoverEpr != null)
            {
                uri = addressSpace.TargetAutodiscoverEpr;
                TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <Uri>(0L, "Retrieved Autodiscover URL {0} from address space.", uri);
                goto IL_1B2;
            }
            TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string>(0L, "Searching for SCP objects for domain {0}", addressSpace.ForestName);
            uri = localScpSearch.FindRemote(addressSpace.ForestName, networkCredential);
            if (uri != null)
            {
                TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string, Uri>(0L, "Found autodiscover URL from SCP objects for domain {0}. Url is: {1}", addressSpace.ForestName, uri);
                autodiscoverUrlSource = AutodiscoverUrlSource.SCP;
                goto IL_1B2;
            }
            TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string>(0L, "Found no suitable autodiscover URL from SCP objects for domain {0}. Trying well-known endpoints.", addressSpace.ForestName);
            uri = TargetForestConfigurationCache.DiscoverFromWellKnown(addressSpace.ForestName, networkCredential);
            if (uri != null)
            {
                TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string, Uri>(0L, "Found autodiscover URL from well-known endpoints for domain {0}. Url is: {1}", addressSpace.ForestName, uri);
                autodiscoverUrlSource = AutodiscoverUrlSource.WellKnown;
                goto IL_1B2;
            }
            TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string>(0L, "Found no suitable autodiscover URL from well-known endpoints for domain {0}. Trying SRV records from DNS.", addressSpace.ForestName);
            uri = AutoDiscoverDnsReader.Query(addressSpace.ForestName);
            if (uri != null)
            {
                TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string, Uri>(0L, "Found autodiscover URL from SRV records from DNS for domain {0}. Url is: {1}", addressSpace.ForestName, uri);
                autodiscoverUrlSource = AutodiscoverUrlSource.SRV;
                goto IL_1B2;
            }
            TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <string>(0L, "Found no suitable autodiscover URL from well-known endpoint lookup for domain {0}.", addressSpace.ForestName);
            return(new TargetForestConfiguration(addressSpace.Id.ToString(), addressSpace.ForestName, new AutoDiscoverFailedException(Strings.descAvailabilityAddressSpaceFailed(addressSpace.Id.ToString()))));

IL_1B2:
            return(new TargetForestConfiguration(addressSpace.Id.ToString(), addressSpace.ForestName, addressSpace.AccessMethod, networkCredential, uri, autodiscoverUrlSource));
        }
 private static NetworkCredential GetCredentials(AvailabilityAddressSpace addressSpace)
 {
     if (addressSpace.UseServiceAccount)
     {
         TargetForestConfigurationCache.ConfigurationTracer.TraceDebug <ADObjectId>(0L, "AvailabilityAddressSpace {0} has been configured with UserServiceAccount. Returning default service account credentials.", addressSpace.Id);
         return(null);
     }
     if (string.IsNullOrEmpty(addressSpace.UserName))
     {
         TargetForestConfigurationCache.ConfigurationTracer.TraceError <ADObjectId>(0L, "AvailabilityAddressSpace {0} has UseServiceAccount is false but username is null or empty.", addressSpace.Id);
         Globals.AvailabilityLogger.LogEvent(InfoWorkerEventLogConstants.Tuple_InvalidCredentialsForCrossForestProxying, null, new object[]
         {
             Globals.ProcessId,
             addressSpace.ForestName,
             Strings.descNullUserName
         });
         throw new InvalidCrossForestCredentialsException(Strings.descNullUserName);
     }
     if (SmtpAddress.IsValidSmtpAddress(addressSpace.UserName))
     {
         SmtpAddress smtpAddress = new SmtpAddress(addressSpace.UserName);
         return(new NetworkCredential(addressSpace.UserName, addressSpace[AvailabilityAddressSpaceSchema.Password] as string, smtpAddress.Domain));
     }
     string[] array = addressSpace.UserName.Split(new char[]
     {
         '\\'
     });
     if (array == null || array.Length != 2)
     {
         TargetForestConfigurationCache.ConfigurationTracer.TraceError <ADObjectId>(0L, "AvailabilityAddressSpace {0} has invalid credentials for cross forest authentication.", addressSpace.Id);
         Globals.AvailabilityLogger.LogEvent(InfoWorkerEventLogConstants.Tuple_InvalidCredentialsForCrossForestProxying, null, new object[]
         {
             Globals.ProcessId,
             addressSpace.ForestName,
             Strings.descInvalidCredentials
         });
         throw new InvalidCrossForestCredentialsException(Strings.descInvalidCredentials);
     }
     return(new NetworkCredential(array[1], addressSpace[AvailabilityAddressSpaceSchema.Password] as string, array[0]));
 }