Ejemplo n.º 1
0
        private bool TryGetReportForRecipientOrganization(DirectoryContext directoryContext, LogCache logCache, ReportConstraints constraints, IList <CultureInfo> userLanguages, out MessageTrackingReport report)
        {
            report = null;
            SearchMessageTrackingReportImpl searchMessageTrackingReportImpl = new SearchMessageTrackingReportImpl(directoryContext, SearchScope.Organization, null, null, null, new TrackedUser[]
            {
                this.trackedUser
            }, logCache, null, this.Identity.MessageId, this.ResultSize, false, true, true, false);
            List <MessageTrackingSearchResult> messages = searchMessageTrackingReportImpl.Execute();
            List <MessageTrackingSearchResult> list     = searchMessageTrackingReportImpl.FilterResultsBySubjectAndRecipients(messages, userLanguages);

            if (list != null && list.Count > 0)
            {
                MessageTrackingReportId messageTrackingReportId = list[0].MessageTrackingReportId;
                Guid exchangeGuid = this.trackedUser.ADUser.ExchangeGuid;
                MessageTrackingReportId      messageTrackingReportId2     = new MessageTrackingReportId(messageTrackingReportId.MessageId, messageTrackingReportId.Server, messageTrackingReportId.InternalMessageId, exchangeGuid, messageTrackingReportId.Domain, false);
                GetMessageTrackingReportImpl getMessageTrackingReportImpl = new GetMessageTrackingReportImpl(directoryContext, SearchScope.Organization, messageTrackingReportId2, logCache, constraints);
                report = getMessageTrackingReportImpl.Execute();
                return(true);
            }
            return(false);
        }
Ejemplo n.º 2
0
        protected override void InternalProcessRecord()
        {
            bool flag;

            if ("Exchange Control Panel".Equals(base.Host.Name, StringComparison.OrdinalIgnoreCase))
            {
                flag = ServerCache.Instance.InitializeIfNeeded(HostId.ECPApplicationPool);
            }
            else
            {
                flag = ServerCache.Instance.InitializeIfNeeded(HostId.PowershellApplicationPool);
            }
            if (!flag)
            {
                Utils.HandleError(this, "Cannot initialize AD configuration", CoreStrings.TrackingErrorFailedToInitialize, this.BypassDelegateChecking, false, ErrorCategory.ObjectNotFound, null);
            }
            DirectoryContext directoryContext = null;
            int num = 0;
            MessageTrackingReport messageTrackingReport = null;
            TrackingEventBudget   trackingEventBudget   = null;

            try
            {
                TrackingEventBudget.AcquireThread();
                if (this.TraceLevel == TraceLevel.High)
                {
                    CommonDiagnosticsLogTracer traceWriter = new CommonDiagnosticsLogTracer();
                    TraceWrapper.SearchLibraryTracer.Register(traceWriter);
                    BaseTrace.CurrentThreadSettings.EnableTracing();
                }
                if (base.ExchangeRunspaceConfig == null)
                {
                    ExTraceGlobals.TaskTracer.TraceError((long)this.GetHashCode(), "Get-MessageTrackingReport permissions cannot be retrieved because the ExchangeRunspaceConfiguration is null");
                    base.WriteError(new TrackingSearchException(CoreStrings.TrackingSearchNotAuthorized), ErrorCategory.InvalidOperation, this.Identity);
                }
                ReportConstraints reportConstraints   = new ReportConstraints();
                SmtpAddress[]     recipientPathFilter = null;
                if (base.Fields.Contains("RecipientPathFilter"))
                {
                    recipientPathFilter = new SmtpAddress[]
                    {
                        this.RecipientPathFilter
                    };
                }
                reportConstraints.BypassDelegateChecking = this.BypassDelegateChecking;
                reportConstraints.DetailLevel            = this.DetailLevel;
                reportConstraints.DoNotResolve           = this.DoNotResolve;
                reportConstraints.RecipientPathFilter    = recipientPathFilter;
                reportConstraints.Recipients             = this.Recipients;
                reportConstraints.ReportTemplate         = this.ReportTemplate;
                reportConstraints.ResultSize             = this.ResultSize;
                reportConstraints.TrackingAsSender       = this.Identity.IsSender;
                reportConstraints.Sender = SmtpAddress.Empty;
                ReportConstraints reportConstraints2 = reportConstraints;
                _DeliveryStatus?  deliveryStatus     = this.status;
                int?num2 = (deliveryStatus != null) ? new int?((int)deliveryStatus.GetValueOrDefault()) : null;
                reportConstraints2.Status           = ((num2 != null) ? new DeliveryStatus?((DeliveryStatus)num2.GetValueOrDefault()) : null);
                reportConstraints.ReturnQueueEvents = this.ShouldReturnQueueEvents();
                if (this.Identity.IsSender)
                {
                    ADRecipient adrecipient = base.TenantGlobalCatalogSession.FindByExchangeGuid(this.Identity.UserGuid);
                    if (adrecipient != null)
                    {
                        reportConstraints.Sender = adrecipient.PrimarySmtpAddress;
                    }
                }
                MultiValuedProperty <CultureInfo> executingUserLanguages = base.ExchangeRunspaceConfig.ExecutingUserLanguages;
                CultureInfo           clientCulture         = (executingUserLanguages != null && executingUserLanguages.Count > 0) ? executingUserLanguages[0] : CultureInfo.InvariantCulture;
                ClientContext         clientContext         = null;
                ClientSecurityContext clientSecurityContext = null;
                bool flag2 = false;
                try
                {
                    clientSecurityContext = Utils.GetSecurityContextForUser(base.ExchangeRunspaceConfig.SecurityAccessToken, base.ExchangeRunspaceConfig.DelegatedPrincipal, this.trackedUser.ADUser);
                    clientContext         = ClientContext.Create(clientSecurityContext, base.CurrentOrganizationId, null, null, clientCulture, null);
                    OrganizationId          currentOrganizationId = base.TenantGlobalCatalogSession.SessionSettings.CurrentOrganizationId;
                    TrackingErrorCollection errors = new TrackingErrorCollection();
                    TimeSpan timeout = Utils.GetTimeout(this.BypassDelegateChecking);
                    trackingEventBudget = new TrackingEventBudget(errors, timeout);
                    directoryContext    = new DirectoryContext(clientContext, currentOrganizationId, base.GlobalConfigSession, this.ConfigurationSession, base.TenantGlobalCatalogSession, trackingEventBudget, SearchMessageTrackingReport.GetDiagnosticsLevel(this.TraceLevel, base.Fields.IsModified("TraceLevel")), errors, false);
                    directoryContext.Acquire();
                    flag2 = true;
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Task, Names <DeliveryReportsTask> .Map[1]);
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[0]);
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Mid, this.Identity.ToString());
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Data1, Names <ReportTemplate> .Map[(int)this.ReportTemplate]);
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Usr, this.trackedUser.SmtpAddress.ToString());
                    if (this.BypassDelegateChecking)
                    {
                        ADObjectId adobjectId;
                        if (base.TryGetExecutingUserId(out adobjectId))
                        {
                            directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.ExUser, adobjectId.Name);
                        }
                        else
                        {
                            ExTraceGlobals.TaskTracer.TraceDebug((long)this.GetHashCode(), "ExecutingUserId is null.");
                        }
                    }
                    directoryContext.DiagnosticsContext.WriteEvent();
                    LogCache logCache = new LogCache(DateTime.MinValue, DateTime.MaxValue, directoryContext.TrackingBudget);
                    this.getMessageTrackingReport = new GetMessageTrackingReportImpl(directoryContext, SearchScope.World, this.Identity.InternalMessageTrackingReportId, logCache, reportConstraints);
                    MessageTrackingReport             messageTrackingReport2 = this.getMessageTrackingReport.Execute();
                    MultiValuedProperty <CultureInfo> userLanguages;
                    if (this.executingUser != null)
                    {
                        userLanguages = (this.executingUser[ADUserSchema.Languages] as MultiValuedProperty <CultureInfo>);
                    }
                    else
                    {
                        userLanguages = new MultiValuedProperty <CultureInfo>(Thread.CurrentThread.CurrentUICulture);
                    }
                    bool flag3 = false;
                    if (messageTrackingReport2 == null)
                    {
                        base.WriteError(new TrackingExceptionNoResultsDueToLogsExpired(), ErrorCategory.ObjectNotFound, this.Identity);
                    }
                    else
                    {
                        if (messageTrackingReport2.HasHandedOffPaths && !this.Identity.IsSender)
                        {
                            flag3 = true;
                            bool flag4 = this.TryGetReportForRecipientOrganization(directoryContext, logCache, reportConstraints, userLanguages, out messageTrackingReport2);
                            if (flag4 && messageTrackingReport2 == null)
                            {
                                base.WriteError(new TrackingExceptionNoResultsDueToUntrackableMessagePath(), ErrorCategory.ObjectNotFound, this.Identity);
                            }
                            else if (!flag4)
                            {
                                base.WriteError(new TrackingExceptionNoResultsDueToLogsNotFound(), ErrorCategory.ObjectNotFound, this.Identity);
                            }
                        }
                        messageTrackingReport = MessageTrackingReport.Create(this.ConfigurationSession, base.TenantGlobalCatalogSession, userLanguages, this.ReportTemplate == ReportTemplate.Summary, this.DetailLevel == MessageTrackingDetailLevel.Verbose, this.Identity.IsSender, messageTrackingReport2, this.DoNotResolve, this.getMessageTrackingReport.Errors.Errors.Count == 0);
                        if (messageTrackingReport == null)
                        {
                            ExTraceGlobals.TaskTracer.TraceDebug <int>((long)this.GetHashCode(), "Report is null while internalReport is not null and has {0} events", (messageTrackingReport2.RecipientTrackingEvents == null) ? 0 : messageTrackingReport2.RecipientTrackingEvents.Length);
                            base.WriteError(new TrackingExceptionNoResultsDueToLogsNotFound(), ErrorCategory.ObjectNotFound, this.Identity);
                        }
                        else
                        {
                            num = ((messageTrackingReport.RecipientTrackingEvents == null) ? 0 : messageTrackingReport.RecipientTrackingEvents.Length);
                            messageTrackingReport = this.FilterReport(messageTrackingReport);
                            if (messageTrackingReport == null && !flag3 && !this.Identity.IsSender)
                            {
                                bool flag5 = this.TryGetReportForRecipientOrganization(directoryContext, logCache, reportConstraints, executingUserLanguages, out messageTrackingReport2);
                                if (!flag5)
                                {
                                    base.WriteError(new TrackingExceptionNoResultsDueToLogsNotFound(), ErrorCategory.ObjectNotFound, this.Identity);
                                }
                                else if (flag5 && messageTrackingReport2 == null)
                                {
                                    base.WriteError(new TrackingExceptionNoResultsDueToUntrackableMessagePath(), ErrorCategory.ObjectNotFound, this.Identity);
                                }
                                else
                                {
                                    messageTrackingReport = MessageTrackingReport.Create(this.ConfigurationSession, base.TenantGlobalCatalogSession, userLanguages, this.ReportTemplate == ReportTemplate.Summary, this.DetailLevel == MessageTrackingDetailLevel.Verbose, this.Identity.IsSender, messageTrackingReport2, this.DoNotResolve, this.getMessageTrackingReport.Errors.Errors.Count == 0);
                                    messageTrackingReport = this.FilterReport(messageTrackingReport);
                                    if (messageTrackingReport == null)
                                    {
                                        base.WriteError(new TrackingExceptionNoResultsDueToUntrackableMessagePath(), ErrorCategory.ObjectNotFound, this.Identity);
                                    }
                                }
                            }
                            if (messageTrackingReport != null)
                            {
                                if (base.NeedSuppressingPiiData)
                                {
                                    Utils.RedactRecipientTrackingEvents(messageTrackingReport.RecipientTrackingEvents, this);
                                }
                                this.WriteResult(messageTrackingReport);
                            }
                        }
                    }
                }
                catch (AuthzException)
                {
                    base.WriteError(new TrackingSearchException(CoreStrings.TrackingSearchNotAuthorized), ErrorCategory.InvalidOperation, this.Identity);
                }
                finally
                {
                    if (directoryContext != null && flag2)
                    {
                        directoryContext.Yield();
                    }
                    if (clientContext != null)
                    {
                        clientContext.Dispose();
                    }
                    if (clientSecurityContext != null)
                    {
                        clientSecurityContext.Dispose();
                    }
                }
            }
            catch (TrackingTransientException ex)
            {
                Utils.HandleTrackingException(directoryContext, ex, this, false, this.BypassDelegateChecking);
            }
            catch (TrackingFatalException ex2)
            {
                Utils.HandleTrackingException(directoryContext, ex2, this, false, this.BypassDelegateChecking);
            }
            catch (DataSourceOperationException ex3)
            {
                Utils.HandleError(this, ex3.ToString(), ex3.LocalizedString, this.BypassDelegateChecking, false, ErrorCategory.InvalidData, null);
            }
            catch (DataValidationException ex4)
            {
                Utils.HandleError(this, ex4.ToString(), ex4.LocalizedString, this.BypassDelegateChecking, false, ErrorCategory.InvalidData, null);
            }
            catch (TransientException ex5)
            {
                Utils.HandleError(this, ex5.ToString(), ex5.LocalizedString, this.BypassDelegateChecking, true, ErrorCategory.InvalidData, null);
            }
            finally
            {
                if ((this.BypassDelegateChecking || this.ReportTemplate == ReportTemplate.RecipientPath || messageTrackingReport == null || messageTrackingReport.RecipientTrackingEvents == null || messageTrackingReport.RecipientTrackingEvents.Length == 0) && this.getMessageTrackingReport != null)
                {
                    Utils.WriteWarnings(this, directoryContext, this.BypassDelegateChecking, this.getMessageTrackingReport.Errors.Errors);
                }
                if (trackingEventBudget != null)
                {
                    trackingEventBudget.Dispose();
                }
                if (directoryContext != null)
                {
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Task, Names <DeliveryReportsTask> .Map[1]);
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[1]);
                    directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Cnt, num);
                    directoryContext.DiagnosticsContext.WriteEvent();
                    Utils.WriteDiagnostics(this, directoryContext.DiagnosticsContext, base.NeedSuppressingPiiData);
                }
                if (this.TraceLevel == TraceLevel.High)
                {
                    TraceWrapper.SearchLibraryTracer.Unregister();
                    BaseTrace.CurrentThreadSettings.DisableTracing();
                }
                TrackingEventBudget.ReleaseThread();
                if (directoryContext == null || Utils.AreAnyErrorsLocalToThisForest(directoryContext.Errors.Errors))
                {
                    PerfCounterData.ResultCounter.AddFailure();
                }
                else
                {
                    PerfCounterData.ResultCounter.AddSuccess();
                }
                if (ServerCache.Instance.HostId == HostId.ECPApplicationPool)
                {
                    InfoWorkerMessageTrackingPerformanceCounters.MessageTrackingFailureRateTask.RawValue = (long)PerfCounterData.ResultCounter.FailurePercentage;
                }
            }
        }