Пример #1
0
        // Token: 0x06000E91 RID: 3729 RVA: 0x000574B4 File Offset: 0x000556B4
        private void StartInvoke()
        {
            if (this.splitState.ProgressState != this.startState)
            {
                this.splitState.ProgressState      = this.startState;
                this.splitOperationState.StartTime = DateTime.UtcNow;
            }
            ISplitOperationState splitOperationState = this.splitOperationState;

            splitOperationState.RetryCount       += 1;
            this.splitOperationState.Error        = null;
            this.splitOperationState.ErrorDetails = null;
            this.splitOperationState.PartialStep  = false;
        }
Пример #2
0
        // Token: 0x06000E92 RID: 3730 RVA: 0x00057530 File Offset: 0x00055730
        private void EndInvoke()
        {
            bool flag = false;

            if (this.splitOperationState.PartialStep)
            {
                ISplitOperationState splitOperationState = this.splitOperationState;
                splitOperationState.PartialStepCount += 1;
            }
            if (this.splitOperationState.Error == null)
            {
                if (this.splitOperationState.PartialStep)
                {
                    this.splitOperationState.RetryCount = 0;
                    this.logger.LogEvent(LogEventType.Verbose, string.Format("SplitOperationBase::{0}::EndInvoke - Operation {1} successfully executed partial step number {2}.", this.GetHashCode(), this.name, this.splitOperationState.PartialStepCount));
                }
                else
                {
                    flag = true;
                    this.logger.LogEvent(LogEventType.Verbose, string.Format("SplitOperationBase::{0}::EndInvoke - Operation {1} successfully completed.", this.GetHashCode(), this.name));
                }
            }
            else if (this.splitOperationState.Error is TransientException)
            {
                if ((int)this.splitOperationState.RetryCount < this.MaxRetryCount)
                {
                    this.logger.LogEvent(LogEventType.Verbose, string.Format("SplitOperationBase::{0}::EndInvoke - Operation {1} executed with retryable transient error {2}. OptionalErrorDetails: {3}", new object[]
                    {
                        this.GetHashCode(),
                        this.name,
                        this.splitOperationState.Error,
                        this.splitOperationState.ErrorDetails
                    }));
                }
                else
                {
                    flag = true;
                    this.logger.LogEvent(LogEventType.Verbose, string.Format("SplitOperationBase::{0}::EndInvoke - Operation {1} completed all retries for transient error {2}. OptionalErrorDetails: {3}", new object[]
                    {
                        this.GetHashCode(),
                        this.name,
                        this.splitOperationState.Error,
                        this.splitOperationState.ErrorDetails
                    }));
                }
            }
            else
            {
                flag = true;
                this.logger.LogEvent(LogEventType.Verbose, string.Format("SplitOperationBase::{0}::EndInvoke - Operation {1} completed with permanent failure {2}. OptionalErrorDetails: {3}", new object[]
                {
                    this.GetHashCode(),
                    this.name,
                    this.splitOperationState.Error,
                    this.splitOperationState.ErrorDetails
                }));
            }
            if (flag)
            {
                this.splitOperationState.CompletedTime = DateTime.UtcNow;
                this.splitState.ProgressState          = this.completionState;
            }
        }
Пример #3
0
 // Token: 0x06000E8B RID: 3723 RVA: 0x00057438 File Offset: 0x00055638
 internal SplitOperationBase(string name, IPublicFolderSession publicFolderSession, IPublicFolderSplitState splitState, IPublicFolderMailboxLoggerBase logger, IAssistantRunspaceFactory powershellFactory, ISplitOperationState splitOperationState, SplitProgressState startState, SplitProgressState completionState)
 {
     this.name = name;
     this.publicFolderSession = publicFolderSession;
     this.splitState          = splitState;
     this.logger              = logger;
     this.powershellFactory   = powershellFactory;
     this.startState          = startState;
     this.completionState     = completionState;
     this.splitOperationState = splitOperationState;
 }
Пример #4
0
        // Token: 0x06000F17 RID: 3863 RVA: 0x0005A154 File Offset: 0x00058354
        public static Unlimited <ByteQuantifiedSize> GetMailboxQuota(IPublicFolderMailboxLoggerBase logger, IAssistantRunspaceFactory powershellFactory, Guid mailboxGuid, OrganizationId organizationId, ISplitOperationState splitOperationState)
        {
            ADObjectId mailboxDatabase                  = null;
            bool       useDatabaseQuotaDefaults         = false;
            Unlimited <ByteQuantifiedSize> mailboxQuota = Unlimited <ByteQuantifiedSize> .UnlimitedValue;
            string    value     = string.Format("{0}\\{1}", organizationId.OrganizationalUnit.Name, mailboxGuid.ToString());
            PSCommand psCommand = new PSCommand();

            psCommand.AddCommand("Get-Mailbox");
            psCommand.AddParameter("PublicFolder");
            psCommand.AddParameter("Identity", value);
            Mailbox publicFolderMailbox = null;

            PublicFolderSplitHelper.PowerShellExceptionHandler(delegate(out string originOfException, out ErrorRecord error)
            {
                error             = null;
                originOfException = "GetMailboxQuota - RunPSCommand: Get-Mailbox -PublicFolder";
                IAssistantRunspaceProxy assistantRunspaceProxy = powershellFactory.CreateRunspaceForDatacenterAdmin(organizationId);
                publicFolderMailbox = assistantRunspaceProxy.RunPSCommand <Mailbox>(psCommand, out error, logger);
                if (error == null)
                {
                    mailboxQuota                    = publicFolderMailbox.ProhibitSendQuota;
                    useDatabaseQuotaDefaults        = (publicFolderMailbox.UseDatabaseQuotaDefaults ?? false);
                    MailboxDatabase mailboxDatabase = publicFolderMailbox.Database;
                    if (useDatabaseQuotaDefaults && mailboxDatabase != null)
                    {
                        psCommand.Clear();
                        psCommand.AddCommand("Get-MailboxDatabase");
                        psCommand.AddParameter("Identity", mailboxDatabase.Name);
                        originOfException = "GetMailboxQuota - RunPSCommand: Get-MailboxDatabase";
                        mailboxDatabase   = assistantRunspaceProxy.RunPSCommand <MailboxDatabase>(psCommand, out error, logger);
                        if (error == null)
                        {
                            mailboxQuota = mailboxDatabase.ProhibitSendQuota;
                        }
                    }
                }
            }, splitOperationState);
            return(mailboxQuota);
        }
Пример #5
0
        // Token: 0x06000F16 RID: 3862 RVA: 0x00059F68 File Offset: 0x00058168
        public static Unlimited <ByteQuantifiedSize> GetActualItemSize(IPublicFolderMailboxLoggerBase logger, IAssistantRunspaceFactory powershellFactory, Guid mailboxGuid, OrganizationId organizationId, ISplitOperationState splitOperationState)
        {
            Unlimited <ByteQuantifiedSize> actualItemSize  = ByteQuantifiedSize.Zero;
            Collection <PSObject>          output          = null;
            Collection <ErrorRecord>       errors          = null;
            Dictionary <string, string>    paramDictionary = new Dictionary <string, string>
            {
                {
                    "Mailbox",
                    mailboxGuid.ToString()
                },
                {
                    "Organization",
                    organizationId.OrganizationalUnit.Name
                }
            };
            string text = Path.Combine(ExchangeSetupContext.InstallPath, "Scripts");

            if (string.IsNullOrEmpty(text))
            {
                throw new SplitProcessorException("PublicFolderSplitHelper::GetActualItemSize - GetExchangeScriptsPath", new Exception("ExchangeScriptsPath is null or empty"));
            }
            string scriptFullPath = Path.Combine(text, "Get-PublicFolderMailboxSize.ps1");

            PublicFolderSplitHelper.PowerShellExceptionHandler(delegate(out string originOfException, out ErrorRecord error)
            {
                error             = null;
                originOfException = "GetActualItemSize - RunPowershellScript Get-PublicFolderMailboxSize.ps1";
                IAssistantRunspaceProxy assistantRunspaceProxy = powershellFactory.CreateRunspaceForDatacenterAdmin(organizationId);
                output = assistantRunspaceProxy.RunPowershellScript(scriptFullPath, paramDictionary, out errors, logger);
                if (errors == null && output != null && output.Count > 0)
                {
                    actualItemSize = (ByteQuantifiedSize)output[0].BaseObject;
                    return;
                }
                error = errors[0];
            }, splitOperationState);
            return(actualItemSize);
        }
Пример #6
0
        // Token: 0x06000F15 RID: 3861 RVA: 0x00059E04 File Offset: 0x00058004
        public static Unlimited <ByteQuantifiedSize> GetTotalItemSize(IPublicFolderMailboxLoggerBase logger, IAssistantRunspaceFactory powershellFactory, Guid mailboxGuid, OrganizationId organizationId, ISplitOperationState splitOperationState)
        {
            Unlimited <ByteQuantifiedSize> totalItemSize = ByteQuantifiedSize.Zero;
            string    value = string.Format("{0}\\{1}", organizationId.OrganizationalUnit.Name, mailboxGuid.ToString());
            PSCommand cmd   = new PSCommand();

            cmd.AddCommand("Get-MailboxStatistics");
            cmd.AddParameter("NoADLookup");
            cmd.AddParameter("Identity", value);
            MailboxStatistics publicFolderMailboxStatistics = null;

            PublicFolderSplitHelper.PowerShellExceptionHandler(delegate(out string originOfException, out ErrorRecord error)
            {
                error             = null;
                originOfException = "GetTotalItemSize - RunPSCommand Get-MailboxStatistics";
                IAssistantRunspaceProxy assistantRunspaceProxy = powershellFactory.CreateRunspaceForDatacenterAdmin(organizationId);
                publicFolderMailboxStatistics = assistantRunspaceProxy.RunPSCommand <MailboxStatistics>(cmd, out error, logger);
                if (error == null && publicFolderMailboxStatistics != null)
                {
                    totalItemSize = publicFolderMailboxStatistics.TotalItemSize;
                }
            }, splitOperationState);
            return(totalItemSize);
        }
Пример #7
0
        // Token: 0x06000F1C RID: 3868 RVA: 0x0005A544 File Offset: 0x00058744
        public static void PowerShellExceptionHandler(PublicFolderSplitHelper.PowerShellMethod method, ISplitOperationState splitOperationState)
        {
            if (splitOperationState == null)
            {
                PublicFolderSplitHelper.PowerShellExceptionHandler(method);
                return;
            }
            ErrorRecord errorRecord  = null;
            string      errorDetails = null;

            try
            {
                method(out errorDetails, out errorRecord);
            }
            catch (ParameterBindingException error)
            {
                splitOperationState.Error        = error;
                splitOperationState.ErrorDetails = errorDetails;
            }
            catch (CmdletInvocationException error2)
            {
                splitOperationState.Error        = error2;
                splitOperationState.ErrorDetails = errorDetails;
            }
            if (errorRecord != null)
            {
                splitOperationState.Error        = errorRecord.Exception;
                splitOperationState.ErrorDetails = errorDetails;
            }
        }
Пример #8
0
        // Token: 0x06000F19 RID: 3865 RVA: 0x0005A248 File Offset: 0x00058448
        public static void SyncAndWaitForCompletion(Guid mailboxGuid, OrganizationId organizationId, IXSOFactory xsoFactory, IPublicFolderMailboxLoggerBase logger, ISplitOperationState splitOperationState)
        {
            ExchangePrincipal contentMailboxPrincipal;

            if (!PublicFolderSession.TryGetPublicFolderMailboxPrincipal(organizationId, mailboxGuid, false, out contentMailboxPrincipal))
            {
                throw new ObjectNotFoundException(ServerStrings.PublicFolderMailboxNotFound);
            }
            PublicFolderSyncJobState publicFolderSyncJobState = PublicFolderSyncJobRpc.StartSyncHierarchy(contentMailboxPrincipal, true);
            int num = 0;

            while (publicFolderSyncJobState.JobStatus != PublicFolderSyncJobState.Status.Completed && publicFolderSyncJobState.LastError == null && (double)num++ < PublicFolderSplitConfig.Instance.TimeoutForSynchronousOperation.TotalMilliseconds / PublicFolderSplitConfig.Instance.QuerySyncStatusInterval.TotalMilliseconds)
            {
                Thread.Sleep(PublicFolderSplitConfig.Instance.QuerySyncStatusInterval.Milliseconds);
                publicFolderSyncJobState = PublicFolderSyncJobRpc.QueryStatusSyncHierarchy(contentMailboxPrincipal);
            }
            bool flag;

            if (publicFolderSyncJobState.JobStatus != PublicFolderSyncJobState.Status.Completed || PublicFolderSplitHelper.IsSyncRequired(mailboxGuid, organizationId, out flag, xsoFactory, logger))
            {
                splitOperationState.Error = new SyncInProgressException(organizationId.OrganizationalUnit.Name, mailboxGuid.ToString());
                return;
            }
            if (PublicFolderSplitHelper.HasSyncFailure(publicFolderSyncJobState))
            {
                splitOperationState.Error = publicFolderSyncJobState.LastError;
            }
        }