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); } }
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])); }