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]);
        }
示例#2
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();
                }
            }
        }
示例#3
0
 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);
         }
     }
 }