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(); } } }
internal static MailboxDiscoverySearch UpgradeLegacySearchObject(SearchObject searchObject, MailboxDataProvider e14DataProvider, DiscoverySearchDataProvider e15DataProvider, Task.TaskErrorLoggingDelegate writeErrorDelegate, Action <LocalizedString> writeWarningDelegate) { MailboxDiscoverySearch mailboxDiscoverySearch = new MailboxDiscoverySearch(); if (e15DataProvider.Find <MailboxDiscoverySearch>(searchObject.Name) != null) { mailboxDiscoverySearch.Name = searchObject.Name + Guid.NewGuid().ToString(); } else { mailboxDiscoverySearch.Name = searchObject.Name; } mailboxDiscoverySearch.Senders = searchObject.Senders; mailboxDiscoverySearch.CreatedBy = searchObject.CreatedByEx; mailboxDiscoverySearch.Description = Strings.UpgradedSearchObjectDescription; mailboxDiscoverySearch.EndDate = searchObject.EndDate; mailboxDiscoverySearch.StartDate = searchObject.StartDate; mailboxDiscoverySearch.ExcludeDuplicateMessages = searchObject.ExcludeDuplicateMessages; mailboxDiscoverySearch.StatisticsOnly = searchObject.EstimateOnly; mailboxDiscoverySearch.IncludeUnsearchableItems = searchObject.IncludeUnsearchableItems; mailboxDiscoverySearch.IncludeKeywordStatistics = searchObject.IncludeKeywordStatistics; mailboxDiscoverySearch.Language = searchObject.Language.ToString(); mailboxDiscoverySearch.LogLevel = searchObject.LogLevel; mailboxDiscoverySearch.ManagedBy = searchObject.ManagedBy; mailboxDiscoverySearch.MessageTypes = searchObject.MessageTypes; mailboxDiscoverySearch.Query = Utils.ConvertAqsToKql(searchObject.SearchQuery, searchObject.Language); mailboxDiscoverySearch.Recipients = searchObject.Recipients; mailboxDiscoverySearch.StatusMailRecipients = searchObject.StatusMailRecipients; mailboxDiscoverySearch.ManagedByOrganization = e15DataProvider.OrganizationId.ToString(); mailboxDiscoverySearch.LegacySearchObjectIdentity = searchObject.Identity.ToString(); if (searchObject.SourceMailboxes != null && searchObject.SourceMailboxes.Count > 0) { MultiValuedProperty <string> multiValuedProperty = new MultiValuedProperty <string>(); Result <ADRawEntry>[] first = e14DataProvider.RecipientSession.ReadMultiple(searchObject.SourceMailboxes.ToArray(), new PropertyDefinition[] { ADRecipientSchema.DisplayName, ADRecipientSchema.LegacyExchangeDN, ADObjectSchema.ExchangeVersion }); foreach (ADRawEntry adrawEntry in from x in first select x.Data) { if (adrawEntry != null) { if (((ExchangeObjectVersion)adrawEntry[ADObjectSchema.ExchangeVersion]).IsOlderThan(ExchangeObjectVersion.Exchange2012)) { writeErrorDelegate(new MailboxSearchTaskException(Strings.SourceMailboxMustBeE15OrLater((string)adrawEntry[ADRecipientSchema.DisplayName])), ErrorCategory.InvalidArgument, null); } else { multiValuedProperty.Add((string)adrawEntry[ADRecipientSchema.LegacyExchangeDN]); } } } if (multiValuedProperty.Count > 0) { mailboxDiscoverySearch.Sources = multiValuedProperty; } } ADUser aduser = null; if (searchObject.TargetMailbox != null) { aduser = (ADUser)e14DataProvider.RecipientSession.Read(searchObject.TargetMailbox); if (aduser != null) { mailboxDiscoverySearch.Target = aduser.LegacyExchangeDN; } } e15DataProvider.CreateOrUpdate <MailboxDiscoverySearch>(mailboxDiscoverySearch); Exception ex = null; try { if (searchObject.SearchStatus != null) { if (!string.IsNullOrEmpty(searchObject.SearchStatus.ResultsPath) && aduser != null) { string serverFqdn = ExchangePrincipal.FromADUser(e14DataProvider.RecipientSession.SessionSettings, aduser, RemotingOptions.AllowCrossSite).MailboxInfo.Location.ServerFqdn; if (!string.IsNullOrEmpty(serverFqdn)) { goto IL_395; } Utils.< > c__DisplayClassc CS$ < > 8__locals1 = new Utils.< > c__DisplayClassc(); CS$ < > 8__locals1.searchId = new SearchId(e14DataProvider.ADUser.Id.DistinguishedName, e14DataProvider.ADUser.Id.ObjectGuid, searchObject.Id.Guid.ToString()); using (MailboxSearchClient client = new MailboxSearchClient(serverFqdn)) { Utils.RpcCallWithRetry(delegate() { client.Remove(CS$ < > 8__locals1.searchId, true); }); goto IL_395; } } e14DataProvider.Delete(searchObject.SearchStatus); } IL_395: e14DataProvider.Delete(searchObject); } catch (RpcConnectionException ex2) { ex = ex2; } catch (RpcException ex3) { ex = ex3; } catch (StoragePermanentException ex4) { ex = ex4; } catch (StorageTransientException ex5) { ex = ex5; } if (ex != null) { writeWarningDelegate(Strings.FailedToDeleteE14SearchObjectWhenUpgrade(searchObject.Name, ex.Message)); } return(e15DataProvider.FindByAlternativeId <MailboxDiscoverySearch>(searchObject.Name)); }
protected override void InternalProcessRecord() { if (base.ExchangeRunspaceConfig == null) { base.WriteError(new MailboxSearchTaskException(Strings.UnableToDetermineExecutingUser), ErrorCategory.InvalidOperation, null); return; } if (base.DataObject == null) { if (this.e14SearchObject != null) { if (this.e14SearchObject.SearchStatus != null) { if (!string.IsNullOrEmpty(this.e14SearchObject.SearchStatus.ResultsPath) && this.e14SearchObject.TargetMailbox != null) { ADUser aduser = (ADUser)this.recipientSession.Read(this.e14SearchObject.TargetMailbox); if (aduser == null) { goto IL_357; } string serverFqdn = ExchangePrincipal.FromADUser(this.recipientSession.SessionSettings, aduser, RemotingOptions.AllowCrossSite).MailboxInfo.Location.ServerFqdn; if (!string.IsNullOrEmpty(serverFqdn)) { goto IL_357; } SearchId searchId = new SearchId(this.e14DataProvider.ADUser.Id.DistinguishedName, this.e14DataProvider.ADUser.Id.ObjectGuid, this.e14SearchObject.Id.Guid.ToString()); try { using (MailboxSearchClient client = new MailboxSearchClient(serverFqdn)) { Utils.RpcCallWithRetry(delegate() { client.Remove(searchId, true); }); } goto IL_357; } catch (SearchServerException ex) { if (ex.ErrorCode == -2147220980) { base.WriteError(new MailboxSearchIsInProgressException(this.e14SearchObject.Name), ErrorCategory.InvalidOperation, base.DataObject); } else { base.WriteError(ex, ErrorCategory.InvalidOperation, null); } goto IL_357; } catch (RpcConnectionException ex2) { base.WriteError(new TaskException(Strings.MailboxSearchServiceUnavailable(serverFqdn, ex2.ErrorCode), ex2), ErrorCategory.InvalidOperation, null); goto IL_357; } catch (RpcException ex3) { base.WriteError(new TaskException(Strings.MailboxSearchRpcCallFailed(serverFqdn, ex3.ErrorCode), ex3), ErrorCategory.InvalidOperation, null); goto IL_357; } } this.e14DataProvider.Delete(this.e14SearchObject.SearchStatus); } IL_357: this.e14DataProvider.Delete(this.e14SearchObject); } return; } ComparisonFilter filter = new ComparisonFilter(ComparisonOperator.Equal, ADRecipientSchema.InPlaceHolds, base.DataObject.InPlaceHoldIdentity); ADRawEntry[] array = this.recipientSession.Find(null, QueryScope.SubTree, filter, null, 1); if (array != null && array.Length > 0) { base.WriteError(new TaskInvalidOperationException(Strings.ErrorCannotRemoveMailboxSearchWithMailboxOnHold(base.DataObject.Name)), ExchangeErrorCategory.Client, base.DataObject); } ExchangePrincipal exchangePrincipal = null; if (base.DataObject.Target != null) { try { exchangePrincipal = ExchangePrincipal.FromLegacyDN(this.recipientSession.SessionSettings, base.DataObject.Target, RemotingOptions.AllowCrossSite); } catch (ObjectNotFoundException) { } if (exchangePrincipal == null) { this.WriteWarning(Strings.ExceptionTargetMailboxNotFound(base.DataObject.Target, base.DataObject.Name)); } } if (exchangePrincipal != null) { Utils.CheckSearchRunningStatus(base.DataObject, new Task.TaskErrorLoggingDelegate(base.WriteError), Strings.MailboxSearchIsInProgress(base.DataObject.Name)); base.DataObject.UpdateState(SearchStateTransition.DeleteSearch); ((DiscoverySearchDataProvider)base.DataSession).CreateOrUpdate <MailboxDiscoverySearch>(base.DataObject); Utils.CreateMailboxDiscoverySearchRequest((DiscoverySearchDataProvider)base.DataSession, base.DataObject.Name, ActionRequestType.Delete, base.ExchangeRunspaceConfig.GetRbacContext().ToString()); SearchEventLogger.Instance.LogDiscoverySearchRemoveRequestedEvent(base.DataObject, base.ExchangeRunspaceConfig.GetRbacContext().ToString()); return; } base.InternalProcessRecord(); }
// Token: 0x06001394 RID: 5012 RVA: 0x000729CC File Offset: 0x00070BCC private void CallSearchService(MailboxSession arbitrationMailbox, string discoverySearchName, Item requestItem, Action <MailboxSearchClient, SearchId> serviceCall) { Exception ex = null; try { SearchId arg = new SearchId(arbitrationMailbox.MailboxOwner.ObjectId.DistinguishedName, arbitrationMailbox.MailboxOwner.ObjectId.ObjectGuid, discoverySearchName); using (MailboxSearchClient mailboxSearchClient = new MailboxSearchClient(arbitrationMailbox.ServerFullyQualifiedDomainName)) { serviceCall(mailboxSearchClient, arg); } } catch (RpcConnectionException ex2) { ex = ex2; } catch (RpcException ex3) { ex = ex3; } catch (SearchServerException ex4) { if (ex4.ErrorCode == 262657 || ex4.ErrorCode == 262658) { DiscoverySearchEventBasedAssistant.Tracer.TraceError <SearchServerException>((long)this.GetHashCode(), "Exception caught but the certain exceptions are still consider operation successful. Exception: '{0}'.", ex4); } else { ex = ex4; } } if (ex != null) { DiscoverySearchEventBasedAssistant.Tracer.TraceError <string, string, Exception>((long)this.GetHashCode(), "Exception happened when calling mailbox search RPC call. Search Name: '{0}'. Mailbox Server: '{1}'. Exception: '{2}'", discoverySearchName, arbitrationMailbox.ServerFullyQualifiedDomainName, ex); SearchEventLogger.Instance.LogDiscoverySearchServerErrorEvent("Exception occured when calling mailbox search RPC call", discoverySearchName, arbitrationMailbox.ServerFullyQualifiedDomainName, ex); if (requestItem != null) { Exception ex5 = null; try { using (Folder folder = Folder.Bind(arbitrationMailbox, requestItem.ParentId)) { QueryFilter queryFilter = new AndFilter(new QueryFilter[] { new ComparisonFilter(ComparisonOperator.Equal, StoreObjectSchema.ItemClass, "IPM.Configuration.MailboxDiscoverySearch"), new ComparisonFilter(ComparisonOperator.Equal, DiscoverySearchEventBasedAssistant.AlternativeId, discoverySearchName) }); using (QueryResult queryResult = folder.ItemQuery(ItemQueryType.None, queryFilter, null, new PropertyDefinition[] { ItemSchema.Id })) { object[][] rows = queryResult.GetRows(1); if (rows != null && rows.Length > 0 && rows[0].Length > 0) { StoreId storeId = rows[0][0] as StoreId; if (storeId != null) { using (Item item = Item.Bind(arbitrationMailbox, storeId)) { StreamAttachment streamAttachment = null; try { foreach (AttachmentHandle handle in item.AttachmentCollection) { StreamAttachment streamAttachment2 = (StreamAttachment)item.AttachmentCollection.Open(handle); if (streamAttachment2.FileName == MailboxDiscoverySearchSchema.Errors.Name) { streamAttachment = streamAttachment2; break; } streamAttachment2.Dispose(); } if (streamAttachment == null) { streamAttachment = (StreamAttachment)item.AttachmentCollection.Create(AttachmentType.Stream); streamAttachment.FileName = MailboxDiscoverySearchSchema.Errors.Name; } using (Stream contentStream = streamAttachment.GetContentStream()) { ExchangeBinaryFormatterFactory.CreateBinaryFormatter(null).Serialize(contentStream, new string[] { ex.Message }); } streamAttachment.Save(); item.SetOrDeleteProperty(DiscoverySearchEventBasedAssistant.Status, SearchState.Failed); item.Save(SaveMode.ResolveConflicts); } finally { if (streamAttachment != null) { streamAttachment.Dispose(); } } } } } } } } catch (StorageTransientException ex6) { ex5 = ex6; } catch (StoragePermanentException ex7) { ex5 = ex7; } if (ex5 != null) { DiscoverySearchEventBasedAssistant.Tracer.TraceError <Exception, Exception>((long)this.GetHashCode(), "Exception when saving error to the discovery object.\n\nThe exception is : {0}.\n\n The error to be saved is : {1}.", ex5, ex); SearchEventLogger.Instance.LogDiscoverySearchServerErrorEvent("Exception occured when saving error to the discovery object", discoverySearchName, arbitrationMailbox.ServerFullyQualifiedDomainName, ex5); } } } }