public IEnumerable <T> GetObjects <T>(ObjectId rootId, IConfigDataProvider session, OptionalIdentityData optionalData, out LocalizedString?notFoundReason) where T : IConfigurable, new() { MailboxDataProvider mailboxDataProvider = (MailboxDataProvider)session; if (mailboxDataProvider == null) { throw new ArgumentNullException("session"); } if (this.objectIdentifier == null) { QueryFilter queryFilter = new TextFilter(SearchObjectBaseSchema.Name, this.identifier, this.IsFullyQualified ? MatchOptions.FullString : MatchOptions.Prefix, MatchFlags.IgnoreCase); if (this.IsFullyQualified) { notFoundReason = new LocalizedString?(Strings.ErrorManagementObjectNotFound(this.ToString())); } else { notFoundReason = null; } if (optionalData != null && optionalData.AdditionalFilter != null) { queryFilter = QueryFilter.AndTogether(new QueryFilter[] { queryFilter, optionalData.AdditionalFilter }); } return(mailboxDataProvider.FindPaged <T>(queryFilter, rootId, false, null, 0)); } notFoundReason = new LocalizedString?(Strings.ErrorManagementObjectNotFound(this.ToString())); SearchObjectId identity = this.objectIdentifier; if (optionalData != null && optionalData.AdditionalFilter != null) { throw new NotSupportedException("Supplying Additional Filters and an ObjectIdentifier is not currently supported by this IdParameter."); } int num = this.identifier.IndexOf('\\'); if (num == -1 || string.IsNullOrEmpty(this.identifier.Substring(0, num))) { SearchObjectBase searchObjectBase = ((default(T) == null) ? Activator.CreateInstance <T>() : default(T)) as SearchObjectBase; if (searchObjectBase == null) { throw new ArgumentException("The generic type must be a SearchObjectBase"); } identity = new SearchObjectId(identity, searchObjectBase.ObjectType); } T t = (T)((object)mailboxDataProvider.Read <T>(identity)); if (t != null) { return(new T[] { t }); } return(new T[0]); }
internal static void CheckDiscoveryBudget(ADUser arbitrationMailbox, IRecipientSession recipientSession) { uint discoveryMaxConcurrency = SearchUtils.GetDiscoveryMaxConcurrency(recipientSession); if (discoveryMaxConcurrency == 0U) { throw new SearchDisabledException(); } MailboxDataProvider mailboxDataProvider = new MailboxDataProvider(arbitrationMailbox, recipientSession); IEnumerable <SearchObject> enumerable = mailboxDataProvider.FindPaged <SearchObject>(null, null, false, null, 0); if (enumerable != null) { Dictionary <ADObjectId, ADUser> dictionary = new Dictionary <ADObjectId, ADUser>(); Dictionary <ADObjectId, string> dictionary2 = new Dictionary <ADObjectId, string>(); ADUser aduser = null; string text = null; SearchStatus searchStatus = null; uint num = 0U; try { foreach (SearchObject searchObject in from so in enumerable where (so.SearchStatus != null && so.SearchStatus.Status == SearchState.InProgress) || (so.SearchStatus != null && so.SearchStatus.Status == SearchState.EstimateInProgress) select so) { if (!dictionary.TryGetValue(searchObject.TargetMailbox, out aduser)) { aduser = (ADUser)recipientSession.Read(searchObject.TargetMailbox); if (aduser != null) { dictionary.Add(searchObject.TargetMailbox, aduser); } } if (aduser != null && !dictionary2.TryGetValue(searchObject.TargetMailbox, out text)) { text = ExchangePrincipal.FromADUser(recipientSession.SessionSettings, aduser, RemotingOptions.AllowCrossSite).MailboxInfo.Location.ServerFqdn; if (!string.IsNullOrEmpty(text)) { dictionary2.Add(searchObject.TargetMailbox, text); } } if (aduser != null && !string.IsNullOrEmpty(text)) { SearchId searchId = new SearchId(mailboxDataProvider.ADUser.Id.DistinguishedName, mailboxDataProvider.ADUser.Id.ObjectGuid, searchObject.Id.Guid.ToString()); try { using (MailboxSearchClient mailboxSearchClient = new MailboxSearchClient(text)) { searchStatus = mailboxSearchClient.GetStatus(searchId); } } catch (RpcConnectionException arg) { SearchUtils.Tracer.TraceError <RpcConnectionException>(0L, "SearchUtils.CheckDiscoveryBudget error querying for status: {0}", arg); continue; } catch (RpcException arg2) { SearchUtils.Tracer.TraceError <RpcException>(0L, "SearchUtils.CheckDiscoveryBudget error querying for status: {0}", arg2); continue; } catch (SearchServerException arg3) { SearchUtils.Tracer.TraceError <SearchServerException>(0L, "SearchUtils.CheckDiscoveryBudget error querying for status: {0}", arg3); continue; } if (searchStatus != null && (searchStatus.Status == 0 || searchStatus.Status == 6)) { num += 1U; } } if (num >= discoveryMaxConcurrency) { throw new SearchOverBudgetException((int)discoveryMaxConcurrency); } } } finally { dictionary.Clear(); dictionary2.Clear(); } } }
protected override void InternalProcessRecord() { if (this.InPlaceHoldIdentity != null) { MailboxDiscoverySearch mailboxDiscoverySearch = ((DiscoverySearchDataProvider)base.DataSession).FindByInPlaceHoldIdentity(this.InPlaceHoldIdentity); if (mailboxDiscoverySearch == null) { base.WriteError(new ManagementObjectNotFoundException(Strings.MailboxSearchObjectWithHoldIdentityNotFound(this.InPlaceHoldIdentity)), ExchangeErrorCategory.Context, null); } this.WriteResult(mailboxDiscoverySearch); return; } if (this.Identity != null) { string text = this.Identity.ToString(); MailboxDataProvider mailboxDataProvider = Utils.GetMailboxDataProvider(base.RootOrgContainerId, base.CurrentOrganizationId, base.ExecutingUserOrganizationId, new Task.TaskErrorLoggingDelegate(base.WriteError)); if (Utils.IsLegacySearchObjectIdentity(text)) { MailboxDiscoverySearch mailboxDiscoverySearch2 = ((DiscoverySearchDataProvider)base.DataSession).FindByLegacySearchObjectIdentity(text); if (mailboxDiscoverySearch2 != null) { this.WriteResult(mailboxDiscoverySearch2); return; } LocalizedString? localizedString; IEnumerable <SearchObject> dataObjects = base.GetDataObjects <SearchObject>(new SearchObjectIdParameter(text), mailboxDataProvider, this.RootId, base.OptionalIdentityData, out localizedString); foreach (SearchObject searchObject in dataObjects) { base.WriteResult(new MailboxSearchObject(searchObject, searchObject.SearchStatus ?? new SearchStatus())); } if (!base.HasErrors && base.WriteObjectCount == 0U) { base.WriteError(new ManagementObjectNotFoundException(localizedString ?? base.GetErrorMessageObjectNotFound(text, null, null)), (ErrorCategory)1003, null); return; } } else { SearchObject e14SearchObjectByName = Utils.GetE14SearchObjectByName(this.Identity.ToString(), mailboxDataProvider); if (e14SearchObjectByName == null) { base.InternalProcessRecord(); return; } base.WriteResult(new MailboxSearchObject(e14SearchObjectByName, e14SearchObjectByName.SearchStatus ?? new SearchStatus())); return; } } else { base.InternalProcessRecord(); MailboxDataProvider mailboxDataProvider2 = Utils.GetMailboxDataProvider(base.RootOrgContainerId, base.CurrentOrganizationId, base.ExecutingUserOrganizationId, new Task.TaskErrorLoggingDelegate(base.WriteError)); try { foreach (SearchObject searchObject2 in mailboxDataProvider2.FindPaged <SearchObject>(null, null, true, null, (int)(this.ResultSize.IsUnlimited ? 0U : (this.ResultSize.Value - base.WriteObjectCount)))) { base.WriteResult(new MailboxSearchObject(searchObject2, searchObject2.SearchStatus ?? new SearchStatus())); } } catch (TenantAccessBlockedException exception) { base.WriteError(exception, (ErrorCategory)1003, null); } } }