Пример #1
0
        private void InternalConfigureProviders(bool continueAfterConfiguringProviders)
        {
            RequestStatisticsBase cachedRequestJob = base.CachedRequestJob;
            bool flag = cachedRequestJob.RequestStyle == RequestStyle.CrossOrg;
            LocalMailboxFlags localMailboxFlags = LocalMailboxFlags.LegacyPublicFolders | LocalMailboxFlags.ParallelPublicFolderMigration;

            if (flag)
            {
                localMailboxFlags |= LocalMailboxFlags.PureMAPI;
            }
            this.sourceDatabases = new MapiSourceMailbox(localMailboxFlags);
            if (flag)
            {
                this.sourceDatabases.ConfigRPCHTTP(cachedRequestJob.RemoteMailboxLegacyDN, null, cachedRequestJob.RemoteMailboxServerLegacyDN, cachedRequestJob.OutlookAnywhereHostName, cachedRequestJob.RemoteCredential, true, cachedRequestJob.AuthenticationMethod != null && cachedRequestJob.AuthenticationMethod.Value == AuthenticationMethod.Ntlm);
            }
            else
            {
                ((IMailbox)this.sourceDatabases).Config(base.GetReservation(cachedRequestJob.SourceDatabase.ObjectGuid, ReservationFlags.Read), cachedRequestJob.SourceDatabase.ObjectGuid, cachedRequestJob.SourceDatabase.ObjectGuid, CommonUtils.GetPartitionHint(cachedRequestJob.OrganizationId), cachedRequestJob.SourceDatabase.ObjectGuid, MailboxType.SourceMailbox, null);
            }
            LocalizedString tracingId = flag ? MrsStrings.RPCHTTPPublicFoldersId(cachedRequestJob.RemoteMailboxLegacyDN) : MrsStrings.PublicFoldersId(cachedRequestJob.OrganizationId.ToString());

            this.sourceDatabases.ConfigPublicFolders(cachedRequestJob.SourceDatabase);
            this.SourceDatabasesWrapper = new SourceMailboxWrapper(this.sourceDatabases, MailboxWrapperFlags.Source, tracingId);
            this.publicFolderMailboxMigrator.SetSourceDatabasesWrapper(this.SourceDatabasesWrapper);
            base.ConfigureProviders(continueAfterConfiguringProviders);
            if (flag)
            {
                this.publicFolderMailboxMigrator.ConfigTranslators(new PrincipalTranslator(this.SourceDatabasesWrapper.PrincipalMapper, this.publicFolderMailboxMigrator.DestMailboxWrapper.PrincipalMapper), null);
            }
        }
Пример #2
0
 protected override void ModifyMoveRequest(TransactionalRequestJob moveRequest)
 {
     this.mdbGuid = moveRequest.WorkItemQueueMdb.ObjectGuid;
     if (base.LocalADUser != null)
     {
         moveRequest.DomainControllerToUpdate = base.LocalADUser.OriginatingServer;
     }
     moveRequest.PoisonCount = 0;
     if (moveRequest.Suspend)
     {
         moveRequest.Suspend = false;
         moveRequest.Message = LocalizedString.Empty;
         DateTime?timestamp = moveRequest.TimeTracker.GetTimestamp(RequestJobTimestamp.StartAfter);
         moveRequest.TimeTracker.SetTimestamp(RequestJobTimestamp.DoNotPickUntil, timestamp);
         moveRequest.TotalRetryCount = 0;
         LocalizedString msg;
         if (this.SuspendWhenReadyToComplete)
         {
             moveRequest.SuspendWhenReadyToComplete = true;
             msg = MrsStrings.ReportRequestResumedWithSuspendWhenReadyToComplete(base.ExecutingUserIdentity);
         }
         else
         {
             msg = MrsStrings.ReportMoveRequestResumed(base.ExecutingUserIdentity);
         }
         ReportData      reportData      = new ReportData(moveRequest.ExchangeGuid, moveRequest.ReportVersion);
         ConnectivityRec connectivityRec = new ConnectivityRec(ServerKind.Cmdlet, VersionInformation.MRS);
         reportData.Append(msg, connectivityRec);
         reportData.Flush(base.MRProvider.SystemMailbox);
     }
 }
Пример #3
0
 internal static void ValidateRequestJob(RequestJobBase requestJob)
 {
     if (requestJob.IsFake || requestJob.WorkItemQueueMdb == null)
     {
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMissing);
         requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestNotDeserialized;
         return;
     }
     if (requestJob.OriginatingMDBGuid != Guid.Empty && requestJob.OriginatingMDBGuid != requestJob.WorkItemQueueMdb.ObjectGuid)
     {
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Orphaned);
         requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestInWrongMDB(requestJob.OriginatingMDBGuid, requestJob.WorkItemQueueMdb.ObjectGuid);
         return;
     }
     if (requestJob.CancelRequest)
     {
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
         requestJob.ValidationMessage = LocalizedString.Empty;
         return;
     }
     if (!requestJob.SourceIsLocal && !requestJob.ValidateOutlookAnywhereParams())
     {
         return;
     }
     if (!requestJob.TargetIsLocal && !requestJob.ValidateOutlookAnywhereParams())
     {
         return;
     }
     if (!requestJob.ValidateRequestIndexEntries())
     {
         return;
     }
     requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
     requestJob.ValidationMessage = LocalizedString.Empty;
 }
Пример #4
0
        private void AddX500ProxyAddressIfNeeded(List <PropertyUpdateXML> updates, ADUser user, string legacyDN, string userCorrespondingToLegDn)
        {
            Exception ex = null;

            try
            {
                CustomProxyAddress customProxyAddress = new CustomProxyAddress((CustomProxyAddressPrefix)ProxyAddressPrefix.X500, legacyDN, false);
                if (!user.EmailAddresses.Contains(customProxyAddress))
                {
                    PropertyUpdateXML.Add(updates, ADRecipientSchema.EmailAddresses, customProxyAddress.ToString(), PropertyUpdateOperation.AddValues);
                }
            }
            catch (ArgumentException ex2)
            {
                ex = ex2;
            }
            catch (LocalizedException ex3)
            {
                ex = ex3;
            }
            if (ex != null)
            {
                LocalizedString localizedString = MrsStrings.RecipientInvalidLegDN(userCorrespondingToLegDn, legacyDN ?? "<empty>");
                base.Report.Append(localizedString, ex, ReportEntryFlags.None);
                base.Warnings.Add(localizedString);
            }
        }
Пример #5
0
 protected override void ModifyRequest(TransactionalRequestJob requestJob)
 {
     this.mdbGuid = requestJob.WorkItemQueueMdb.ObjectGuid;
     if (requestJob.TargetUser != null)
     {
         requestJob.DomainControllerToUpdate = requestJob.TargetUser.OriginatingServer;
     }
     else if (requestJob.SourceUser != null)
     {
         requestJob.DomainControllerToUpdate = requestJob.SourceUser.OriginatingServer;
     }
     requestJob.PoisonCount = 0;
     if (requestJob.Suspend)
     {
         requestJob.Suspend         = false;
         requestJob.Message         = LocalizedString.Empty;
         requestJob.TotalRetryCount = 0;
         LocalizedString msg;
         if (this.SuspendWhenReadyToComplete)
         {
             requestJob.SuspendWhenReadyToComplete = true;
             msg = MrsStrings.ReportRequestResumedWithSuspendWhenReadyToComplete(base.ExecutingUserIdentity);
         }
         else
         {
             msg = MrsStrings.ReportRequestResumed(base.ExecutingUserIdentity);
         }
         ReportData      reportData      = new ReportData(requestJob.RequestGuid, requestJob.ReportVersion);
         ConnectivityRec connectivityRec = new ConnectivityRec(ServerKind.Cmdlet, VersionInformation.MRS);
         reportData.Append(msg, connectivityRec);
         reportData.Flush(base.RJProvider.SystemMailbox);
     }
 }
 internal static void ValidateRequestJob(RequestJobBase requestJob)
 {
     if (requestJob.IsFake || requestJob.WorkItemQueueMdb == null)
     {
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMissing);
         requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestNotDeserialized;
         return;
     }
     if (requestJob.OriginatingMDBGuid != Guid.Empty && requestJob.OriginatingMDBGuid != requestJob.WorkItemQueueMdb.ObjectGuid)
     {
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Orphaned);
         requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestInWrongMDB(requestJob.OriginatingMDBGuid, requestJob.WorkItemQueueMdb.ObjectGuid);
         return;
     }
     if (requestJob.CancelRequest)
     {
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
         requestJob.ValidationMessage = LocalizedString.Empty;
         return;
     }
     if (requestJob.Status == RequestStatus.Completed || requestJob.Status == RequestStatus.CompletedWithWarning)
     {
         SyncRequestStatistics.LoadAdditionalPropertiesFromUser(requestJob);
         requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
         requestJob.ValidationMessage = LocalizedString.Empty;
         return;
     }
     SyncRequestStatistics.LoadAdditionalPropertiesFromUser(requestJob);
     if (!requestJob.ValidateRequestIndexEntries())
     {
         return;
     }
     requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
     requestJob.ValidationMessage = LocalizedString.Empty;
 }
Пример #7
0
        public override void Initialize(TransactionalRequestJob syncRequest)
        {
            base.Initialize(syncRequest);
            base.RequestJobIdentity      = syncRequest.Identity.ToString();
            base.IncrementalSyncInterval = syncRequest.IncrementalSyncInterval;
            Guid targetExchangeGuid = syncRequest.TargetExchangeGuid;
            MailboxCopierFlags mailboxCopierFlags = MailboxCopierFlags.None;
            LocalizedString    sourceTracingID    = LocalizedString.Empty;

            switch (syncRequest.SyncProtocol)
            {
            case SyncProtocol.Imap:
                mailboxCopierFlags |= MailboxCopierFlags.Imap;
                sourceTracingID     = MrsStrings.ImapTracingId(syncRequest.EmailAddress.ToString());
                break;

            case SyncProtocol.Eas:
                mailboxCopierFlags |= MailboxCopierFlags.Eas;
                sourceTracingID     = MrsStrings.EasTracingId(syncRequest.EmailAddress.ToString());
                break;

            case SyncProtocol.Pop:
                mailboxCopierFlags |= MailboxCopierFlags.Pop;
                sourceTracingID     = MrsStrings.PopTracingId(syncRequest.EmailAddress.ToString());
                break;
            }
            string orgID = (syncRequest.OrganizationId != null && syncRequest.OrganizationId.OrganizationalUnit != null) ? (syncRequest.OrganizationId.OrganizationalUnit.Name + "\\") : string.Empty;

            base.MailboxMerger = new MailboxMerger(Guid.Empty, targetExchangeGuid, syncRequest, this, mailboxCopierFlags, sourceTracingID, MrsStrings.PrimaryMailboxTracingId(orgID, targetExchangeGuid));
        }
Пример #8
0
        private void AutoSuspendJob()
        {
            DateTime?timestamp  = base.TimeTracker.GetTimestamp(RequestJobTimestamp.CompleteAfter);
            DateTime?timestamp2 = base.TimeTracker.GetTimestamp(RequestJobTimestamp.StartAfter);
            TimeSpan incrementalSyncInterval = base.CachedRequestJob.IncrementalSyncInterval;
            DateTime?nextSchedule            = BaseJob.GetNextScheduledTime(timestamp2, timestamp, incrementalSyncInterval);

            if (nextSchedule != null)
            {
                base.Report.Append(MrsStrings.ReportSyncedJob(nextSchedule.Value.ToLocalTime()));
                base.SaveState(SaveStateFlags.Regular, delegate(TransactionalRequestJob mergeRequest)
                {
                    mergeRequest.Status           = RequestStatus.Synced;
                    this.TimeTracker.CurrentState = RequestState.AutoSuspended;
                    this.TimeTracker.SetTimestamp(RequestJobTimestamp.DoNotPickUntil, new DateTime?(nextSchedule.Value));
                    mergeRequest.Message = MrsStrings.MoveRequestMessageInformational(MrsStrings.JobHasBeenSynced);
                });
                return;
            }
            base.SaveState(SaveStateFlags.Regular, delegate(TransactionalRequestJob mergeRequest)
            {
                mergeRequest.Status           = RequestStatus.Completed;
                base.TimeTracker.CurrentState = RequestState.Completed;
                mergeRequest.Message          = MrsStrings.MoveRequestMessageInformational(MrsStrings.ReportRequestCompleted);
            });
        }
Пример #9
0
        protected virtual void AutoSuspendJob()
        {
            if (base.CachedRequestJob.SuspendWhenReadyToComplete || base.CachedRequestJob.PreventCompletion)
            {
                base.Report.Append(MrsStrings.ReportAutoSuspendingJob);
                base.TimeTracker.CurrentState = RequestState.AutoSuspended;
                base.TimeTracker.SetTimestamp(RequestJobTimestamp.Suspended, new DateTime?(DateTime.UtcNow));
                base.SaveState(SaveStateFlags.Regular, delegate(TransactionalRequestJob mergeRequest)
                {
                    mergeRequest.Status  = RequestStatus.AutoSuspended;
                    mergeRequest.Suspend = true;
                    mergeRequest.Message = MrsStrings.MoveRequestMessageInformational(MrsStrings.JobHasBeenAutoSuspended);
                });
                return;
            }
            DateTime?timestamp  = base.TimeTracker.GetTimestamp(RequestJobTimestamp.CompleteAfter);
            DateTime?timestamp2 = base.TimeTracker.GetTimestamp(RequestJobTimestamp.StartAfter);
            TimeSpan incrementalSyncInterval = base.CachedRequestJob.IncrementalSyncInterval;
            DateTime utcNow       = DateTime.UtcNow;
            DateTime?nextSchedule = BaseJob.GetNextScheduledTime(timestamp2, timestamp, incrementalSyncInterval);

            base.Report.Append(MrsStrings.ReportSyncedJob(nextSchedule.Value.ToLocalTime()));
            base.SaveState(SaveStateFlags.Regular, delegate(TransactionalRequestJob mergeRequest)
            {
                mergeRequest.Status           = RequestStatus.Synced;
                this.TimeTracker.CurrentState = RequestState.AutoSuspended;
                this.TimeTracker.SetTimestamp(RequestJobTimestamp.DoNotPickUntil, new DateTime?(nextSchedule.Value));
                mergeRequest.Message = MrsStrings.MoveRequestMessageInformational(MrsStrings.JobHasBeenSynced);
            });
        }
Пример #10
0
 protected override void StartMerge()
 {
     MrsTracer.Service.Debug("WorkItem: StartMerge", new object[0]);
     if (base.MailboxMerger.SyncState != null && base.MailboxMerger.ICSSyncState != null)
     {
         MrsTracer.Service.Debug("Recovering an interrupted merge.", new object[0]);
         base.CheckServersHealth();
         base.MailboxMerger.SourceMailbox.SetMailboxSyncState(base.MailboxMerger.ICSSyncState.ProviderState);
         if (base.SyncStage == SyncStage.IncrementalSync || base.SyncStage == SyncStage.FinalIncrementalSync)
         {
             base.OverallProgress = this.CopyEndPercentage;
             base.ScheduleWorkItem(new Action(this.InitializeIncrementalSync), WorkloadType.Unknown);
             base.Report.Append(MrsStrings.ReportRequestContinued(base.SyncStage.ToString()));
             MailboxReplicationService.LogEvent(MRSEventLogConstants.Tuple_RequestContinued, new object[]
             {
                 base.RequestJobIdentity,
                 base.RequestJobGuid.ToString(),
                 base.SyncStage.ToString()
             });
             return;
         }
     }
     base.ScheduleWorkItem(new Action(this.CatchupFolderHierarchy), WorkloadType.Unknown);
     base.StartMerge();
     base.MailboxMerger.ICSSyncState = new MailboxMapiSyncState();
 }
        internal static void ValidateRequestJob(RequestJobBase requestJob)
        {
            if (requestJob.IsFake || requestJob.WorkItemQueueMdb == null)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMissing);
                requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestNotDeserialized;
                return;
            }
            if (requestJob.OriginatingMDBGuid != Guid.Empty && requestJob.OriginatingMDBGuid != requestJob.WorkItemQueueMdb.ObjectGuid)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Orphaned);
                requestJob.ValidationMessage = MrsStrings.ValidationMoveRequestInWrongMDB(requestJob.OriginatingMDBGuid, requestJob.WorkItemQueueMdb.ObjectGuid);
                return;
            }
            if (requestJob.OriginatingMDBGuid == Guid.Empty)
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
                requestJob.ValidationMessage = LocalizedString.Empty;
                return;
            }
            MailboxRelocationRequestStatistics.LoadAdditionalPropertiesFromUser(requestJob);
            if (MailboxRelocationRequestStatistics.IsTerminalState(requestJob))
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
                requestJob.ValidationMessage = LocalizedString.Empty;
                return;
            }
            if (!requestJob.ValidateUser(requestJob.User, requestJob.UserId))
            {
                return;
            }
            Guid guid;
            Guid guid2;

            RequestIndexEntryProvider.GetMoveGuids(requestJob.User, out guid, out guid2);
            if (guid != requestJob.ExchangeGuid)
            {
                MrsTracer.Common.Error("Orphaned RequestJob: mailbox guid does not match between AD {0} and workitem queue {1}.", new object[]
                {
                    requestJob.User.ExchangeGuid,
                    requestJob.ExchangeGuid
                });
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                requestJob.ValidationMessage = MrsStrings.ValidationMailboxGuidsDontMatch(guid, requestJob.ExchangeGuid);
                return;
            }
            if (!MailboxRelocationRequestStatistics.ValidateNoOtherRequests(requestJob))
            {
                return;
            }
            if (CommonUtils.IsImplicitSplit(requestJob.Flags, requestJob.User))
            {
                requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                requestJob.ValidationMessage = MrsStrings.ErrorImplicitSplit;
                return;
            }
            requestJob.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.Valid);
            requestJob.ValidationMessage = LocalizedString.Empty;
        }
Пример #12
0
        private void ReportCleanupFailure(Exception failure)
        {
            LocalizedString localizedString = MrsStrings.SourceMailboxCleanupFailed(CommonUtils.FullExceptionMessage(failure));

            base.Report.Append(localizedString, failure, ReportEntryFlags.Cleanup);
            base.Warnings.Add(localizedString);
            FailureLog.Write(base.RequestJobGuid, failure, false, RequestState.Cleanup, SyncStage.CleanupDeleteSourceMailbox, null, null);
        }
Пример #13
0
        protected SyncContext EnumerateAndApplyIncrementalChanges()
        {
            SyncContext    syncContext    = base.MailboxMerger.CreateSyncContext();
            MailboxChanges mailboxChanges = new MailboxChanges(base.MailboxMerger.EnumerateHierarchyChanges(syncContext));

            base.Report.Append(MrsStrings.ReportIncrementalSyncHierarchyChanges(base.MailboxMerger.SourceTracingID, mailboxChanges.HierarchyChanges.ChangedFolders.Count, mailboxChanges.HierarchyChanges.DeletedFolders.Count));
            base.EnumerateAndApplyIncrementalChanges(base.MailboxMerger, syncContext, mailboxChanges.HierarchyChanges);
            return(syncContext);
        }
        internal override IEnumerable <T> GetObjects <T>(ADObjectId rootId, IDirectorySession session, IDirectorySession subTreeSession, OptionalIdentityData optionalData, out LocalizedString?notFoundReason)
        {
            IEnumerable <T> objects = base.GetObjects <T>(rootId, session, subTreeSession, optionalData, out notFoundReason);

            if (notFoundReason == null)
            {
                notFoundReason = new LocalizedString?(MrsStrings.ErrorCouldNotFindMoveRequest(this.ToString()));
            }
            return(objects);
        }
Пример #15
0
        public override void Initialize(TransactionalRequestJob mergeRequest)
        {
            base.Initialize(mergeRequest);
            if (mergeRequest.RequestType == MRSRequestType.MailboxImport || mergeRequest.RequestType == MRSRequestType.MailboxExport || mergeRequest.RequestType == MRSRequestType.MailboxRestore || mergeRequest.RequestType == MRSRequestType.Sync)
            {
                return;
            }
            base.RequestJobIdentity = mergeRequest.Identity.ToString();
            bool            flag            = mergeRequest.RequestStyle == RequestStyle.CrossOrg && mergeRequest.Direction == RequestDirection.Pull;
            bool            flag2           = mergeRequest.RequestStyle == RequestStyle.CrossOrg && mergeRequest.Direction == RequestDirection.Push;
            LocalizedString sourceTracingID = LocalizedString.Empty;
            LocalizedString targetTracingID = LocalizedString.Empty;
            string          orgID           = (mergeRequest.OrganizationId != null && mergeRequest.OrganizationId.OrganizationalUnit != null) ? (mergeRequest.OrganizationId.OrganizationalUnit.Name + "\\") : string.Empty;
            Guid            guid;

            if (flag)
            {
                guid            = Guid.Empty;
                sourceTracingID = MrsStrings.RPCHTTPMailboxId(mergeRequest.RemoteMailboxLegacyDN);
            }
            else
            {
                guid            = mergeRequest.SourceExchangeGuid;
                sourceTracingID = (mergeRequest.SourceIsArchive ? MrsStrings.ArchiveMailboxTracingId(orgID, guid) : MrsStrings.PrimaryMailboxTracingId(orgID, guid));
            }
            Guid guid2;

            if (flag2)
            {
                guid2           = Guid.Empty;
                targetTracingID = MrsStrings.RPCHTTPMailboxId(mergeRequest.RemoteMailboxLegacyDN);
            }
            else
            {
                guid2           = mergeRequest.TargetExchangeGuid;
                targetTracingID = (mergeRequest.TargetIsArchive ? MrsStrings.ArchiveMailboxTracingId(orgID, guid2) : MrsStrings.PrimaryMailboxTracingId(orgID, guid2));
            }
            MailboxCopierFlags mailboxCopierFlags = MailboxCopierFlags.Merge;

            if (mergeRequest.RequestStyle == RequestStyle.CrossOrg)
            {
                mailboxCopierFlags |= MailboxCopierFlags.CrossOrg;
            }
            if (mergeRequest.SourceIsArchive)
            {
                mailboxCopierFlags |= MailboxCopierFlags.SourceIsArchive;
            }
            if (mergeRequest.TargetIsArchive)
            {
                mailboxCopierFlags |= MailboxCopierFlags.TargetIsArchive;
            }
            this.MailboxMerger = new MailboxMerger(guid, guid2, mergeRequest, this, mailboxCopierFlags, sourceTracingID, targetTracingID);
        }
 public void ReconstructAndThrow(string serverName, VersionInformation serverVersion)
 {
     ExecutionContext.Create(new DataContext[]
     {
         this.DataContext.IsEmpty ? null : new WrappedDataContext(this.DataContext),
         OperationSideDataContext.GetContext(new ExceptionSide?(this.Side)),
         string.IsNullOrEmpty(serverName) ? null : new WrappedDataContext(MrsStrings.RemoteServerName(serverName))
     }).Execute(delegate
     {
         throw this.Reconstruct(serverVersion);
     });
 }
Пример #17
0
        public override void Initialize(TransactionalRequestJob importRequest)
        {
            base.Initialize(importRequest);
            base.RequestJobIdentity = importRequest.Identity.ToString();
            Guid               targetExchangeGuid = importRequest.TargetExchangeGuid;
            string             orgID           = (importRequest.OrganizationId != null && importRequest.OrganizationId.OrganizationalUnit != null) ? (importRequest.OrganizationId.OrganizationalUnit.Name + "\\") : string.Empty;
            LocalizedString    sourceTracingID = MrsStrings.PstTracingId(importRequest.FilePath);
            LocalizedString    targetTracingID = importRequest.TargetIsArchive ? MrsStrings.ArchiveMailboxTracingId(orgID, targetExchangeGuid) : MrsStrings.PrimaryMailboxTracingId(orgID, targetExchangeGuid);
            MailboxCopierFlags flags           = MailboxCopierFlags.Merge | MailboxCopierFlags.SourceIsPST;

            base.MailboxMerger = new MailboxMerger(Guid.Empty, targetExchangeGuid, importRequest, this, flags, sourceTracingID, targetTracingID);
        }
Пример #18
0
 protected void ValidateLegacyDNMatch(string sourceDN, ADUser targetUser, object indicate)
 {
     if (!StringComparer.OrdinalIgnoreCase.Equals(sourceDN, targetUser.LegacyExchangeDN) && !targetUser.EmailAddresses.Contains(new CustomProxyAddress((CustomProxyAddressPrefix)ProxyAddressPrefix.X500, sourceDN, true)))
     {
         if (this.AllowLegacyDNMismatch)
         {
             this.PerRecordReportEntries.Add(new ReportEntry(MrsStrings.ReportRequestAllowedMismatch(this.ExecutingUserIdentity)));
             return;
         }
         base.WriteError(new NonMatchingLegacyDNPermanentException(sourceDN, targetUser.ToString(), "AllowLegacyDNMismatch"), ErrorCategory.InvalidArgument, indicate);
     }
 }
Пример #19
0
 protected MRSRequestIdParameter(string request)
 {
     if (request == null)
     {
         throw new ArgumentNullException("request");
     }
     if (request.Equals(string.Empty))
     {
         throw new ArgumentException(MrsStrings.MustProvideNonEmptyStringForIdentity);
     }
     if (request.Contains("\\"))
     {
         int    num = request.LastIndexOf('\\');
         string g   = request.Substring(num + 1);
         Guid   guid;
         if (GuidHelper.TryParseGuid(g, out guid))
         {
             this.mailboxName      = null;
             this.requestGuid      = guid;
             this.mailboxId        = null;
             this.requestName      = null;
             this.organizationName = request.Substring(0, num);
         }
         else
         {
             this.mailboxName      = request.Substring(0, num);
             this.requestGuid      = Guid.Empty;
             this.mailboxId        = null;
             this.requestName      = g;
             this.organizationName = null;
         }
         this.indexToUse = null;
         this.indexIds   = null;
     }
     else
     {
         Guid guid;
         if (!GuidHelper.TryParseGuid(request, out guid))
         {
             throw new ArgumentException(MrsStrings.IdentityWasNotInValidFormat(request));
         }
         this.requestGuid      = guid;
         this.mailboxName      = null;
         this.mailboxId        = null;
         this.requestName      = null;
         this.indexToUse       = null;
         this.indexIds         = null;
         this.organizationName = null;
     }
     this.organizationId = null;
     this.rawIdentity    = request;
 }
Пример #20
0
        protected override void StartMerge()
        {
            MrsTracer.Service.Debug("WorkItem: StartMerge", new object[0]);
            ADUser aduser = base.MailboxMerger.DestMailbox.GetADUser();

            if (base.SyncStage >= SyncStage.Cleanup || (PrimaryMailboxSourceType)aduser[ConsumerMailboxSchema.PrimaryMailboxSource] == PrimaryMailboxSourceType.Exo)
            {
                base.Report.Append(MrsStrings.ReportMoveAlreadyFinished2(MrsStrings.ReportPrimaryMservEntryPointsToExo));
                base.ScheduleWorkItem <int>(new Action <int>(this.Cleanup), 0, WorkloadType.Unknown);
                return;
            }
            base.StartMerge();
        }
Пример #21
0
        public override void Initialize(TransactionalRequestJob restoreRequest)
        {
            base.Initialize(restoreRequest);
            base.RequestJobIdentity = restoreRequest.Identity.ToString();
            Guid               targetExchangeGuid = restoreRequest.TargetExchangeGuid;
            Guid               sourceExchangeGuid = restoreRequest.SourceExchangeGuid;
            string             orgID           = (restoreRequest.OrganizationId != null && restoreRequest.OrganizationId.OrganizationalUnit != null) ? (restoreRequest.OrganizationId.OrganizationalUnit.Name + "\\") : string.Empty;
            string             dbName          = (restoreRequest.SourceDatabase != null) ? restoreRequest.SourceDatabase.Name : ((restoreRequest.RemoteDatabaseGuid != null) ? restoreRequest.RemoteDatabaseGuid.Value.ToString() : string.Empty);
            LocalizedString    sourceTracingID = MrsStrings.RestoreMailboxTracingId(dbName, restoreRequest.SourceExchangeGuid);
            LocalizedString    targetTracingID = restoreRequest.TargetIsArchive ? MrsStrings.ArchiveMailboxTracingId(orgID, targetExchangeGuid) : MrsStrings.PrimaryMailboxTracingId(orgID, targetExchangeGuid);
            MailboxCopierFlags flags           = MailboxCopierFlags.Merge;

            base.MailboxMerger = new MailboxMerger(sourceExchangeGuid, targetExchangeGuid, restoreRequest, this, flags, sourceTracingID, targetTracingID);
        }
Пример #22
0
 protected override void InternalProcessRecord()
 {
     TaskLogger.LogEnter(new object[]
     {
         this.DataObject
     });
     try
     {
         base.WriteVerbose(Strings.SettingMoveRequest);
         TransactionalRequestJob dataObject = this.DataObject;
         int num = 1;
         for (;;)
         {
             if (dataObject.CheckIfUnderlyingMessageHasChanged())
             {
                 base.WriteVerbose(Strings.ReloadingMoveRequest);
                 dataObject.Refresh();
                 this.ValidateMoveRequest(dataObject);
             }
             this.ModifyMoveRequest(dataObject);
             try
             {
                 base.InternalProcessRecord();
                 RequestJobLog.Write(dataObject);
             }
             catch (MapiExceptionObjectChanged)
             {
                 if (num >= 5 || base.Stopping)
                 {
                     throw;
                 }
                 num++;
                 continue;
             }
             break;
         }
         CommonUtils.CatchKnownExceptions(delegate
         {
             this.PostSaveAction();
         }, delegate(Exception ex)
         {
             this.WriteWarning(MrsStrings.PostSaveActionFailed(CommonUtils.FullExceptionMessage(ex)));
         });
     }
     finally
     {
         TaskLogger.LogExit();
     }
 }
        private void InternalConfigureProviders(bool continueAfterConfiguringProviders)
        {
            if (this.publicFolderConfiguration.GetHierarchyMailboxInformation().Type != PublicFolderInformation.HierarchyType.InTransitMailboxGuid)
            {
                throw new PublicFolderMailboxesNotProvisionedForMigrationException();
            }
            RequestStatisticsBase cachedRequestJob = base.CachedRequestJob;
            bool flag = cachedRequestJob.RequestStyle == RequestStyle.CrossOrg;
            LocalMailboxFlags localMailboxFlags = LocalMailboxFlags.LegacyPublicFolders;

            if (flag)
            {
                localMailboxFlags |= LocalMailboxFlags.PureMAPI;
            }
            this.sourceDatabases = new MapiSourceMailbox(localMailboxFlags);
            if (flag)
            {
                this.sourceDatabases.ConfigRPCHTTP(cachedRequestJob.RemoteMailboxLegacyDN, null, cachedRequestJob.RemoteMailboxServerLegacyDN, cachedRequestJob.OutlookAnywhereHostName, cachedRequestJob.RemoteCredential, true, cachedRequestJob.AuthenticationMethod != null && cachedRequestJob.AuthenticationMethod.Value == AuthenticationMethod.Ntlm);
            }
            else
            {
                ((IMailbox)this.sourceDatabases).Config(base.GetReservation(cachedRequestJob.SourceDatabase.ObjectGuid, ReservationFlags.Read), cachedRequestJob.SourceDatabase.ObjectGuid, cachedRequestJob.SourceDatabase.ObjectGuid, CommonUtils.GetPartitionHint(cachedRequestJob.OrganizationId), cachedRequestJob.SourceDatabase.ObjectGuid, MailboxType.SourceMailbox, null);
            }
            LocalizedString tracingId = flag ? MrsStrings.RPCHTTPPublicFoldersId(cachedRequestJob.RemoteMailboxLegacyDN) : MrsStrings.PublicFoldersId(cachedRequestJob.OrganizationId.ToString());

            this.sourceDatabases.ConfigPublicFolders(cachedRequestJob.SourceDatabase);
            this.SourceDatabasesWrapper = new SourceMailboxWrapper(this.sourceDatabases, MailboxWrapperFlags.Source, tracingId);
            foreach (MailboxCopierBase mailboxCopierBase in this.GetAllCopiers())
            {
                PublicFolderMigrator publicFolderMigrator = (PublicFolderMigrator)mailboxCopierBase;
                publicFolderMigrator.SetSourceDatabasesWrapper(this.SourceDatabasesWrapper);
            }
            base.ConfigureProviders(continueAfterConfiguringProviders);
            MailboxCopierBase rootMailboxContext = base.GetRootMailboxContext();

            foreach (MailboxCopierBase mailboxCopierBase2 in this.GetAllCopiers())
            {
                PublicFolderMigrator publicFolderMigrator2 = (PublicFolderMigrator)mailboxCopierBase2;
                if (!publicFolderMigrator2.IsRoot)
                {
                    publicFolderMigrator2.SetHierarchyMailbox(rootMailboxContext.DestMailbox);
                }
                if (flag)
                {
                    publicFolderMigrator2.ConfigTranslators(new PrincipalTranslator(this.SourceDatabasesWrapper.PrincipalMapper, publicFolderMigrator2.DestMailboxWrapper.PrincipalMapper), null);
                }
            }
        }
        private static bool ValidateNoOtherRequests(RequestJobBase requestJobBase)
        {
            IEnumerable <RequestIndexId> source = from i in requestJobBase.IndexEntries
                                                  select i.RequestIndexId into i
                                                  where i.Location == RequestIndexLocation.Mailbox
                                                  select i;

            if (source.Any((RequestIndexId i) => i.Mailbox.Equals(requestJobBase.UserId)))
            {
                string otherRequests = MailboxRequestIndexEntryHandler.GetOtherRequests(requestJobBase.User, new Guid?(requestJobBase.RequestGuid));
                if (!string.IsNullOrEmpty(otherRequests))
                {
                    requestJobBase.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                    requestJobBase.ValidationMessage = MrsStrings.ValidationObjectInvolvedInMultipleRelocations(MrsStrings.Mailbox, otherRequests);
                    return(false);
                }
            }
            if (requestJobBase.User.UnifiedMailbox != null)
            {
                ADRecipient tempRecipient;
                if (ADRecipient.TryGetFromCrossTenantObjectId(requestJobBase.User.UnifiedMailbox, out tempRecipient).Succeeded&& source.Any((RequestIndexId i) => i.Mailbox.Equals(tempRecipient.Id)))
                {
                    string otherRequests = MailboxRequestIndexEntryHandler.GetOtherRequests((ADUser)tempRecipient, new Guid?(requestJobBase.RequestGuid));
                    if (!string.IsNullOrEmpty(otherRequests))
                    {
                        requestJobBase.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                        requestJobBase.ValidationMessage = MrsStrings.ValidationObjectInvolvedInMultipleRelocations(MrsStrings.SourceContainer, otherRequests);
                        return(false);
                    }
                }
            }
            if (requestJobBase.TargetUnifiedMailboxId != null)
            {
                ADRecipient tempRecipient;
                if (ADRecipient.TryGetFromCrossTenantObjectId(requestJobBase.TargetUnifiedMailboxId, out tempRecipient).Succeeded&& source.Any((RequestIndexId i) => i.Mailbox.Equals(tempRecipient.Id)))
                {
                    string otherRequests = MailboxRequestIndexEntryHandler.GetOtherRequests((ADUser)tempRecipient, new Guid?(requestJobBase.RequestGuid));
                    if (!string.IsNullOrEmpty(otherRequests))
                    {
                        requestJobBase.ValidationResult  = new RequestJobBase.ValidationResultEnum?(RequestJobBase.ValidationResultEnum.DataMismatch);
                        requestJobBase.ValidationMessage = MrsStrings.ValidationObjectInvolvedInMultipleRelocations(MrsStrings.TargetContainer, otherRequests);
                        return(false);
                    }
                }
            }
            return(true);
        }
Пример #25
0
        protected override void UpdateMovedMailbox()
        {
            if (CommonUtils.IsImplicitSplit(base.CachedRequestJob.Flags, base.GetRootMailboxContext().SourceMailbox.GetADUser()))
            {
                throw new ImplicitSplitPermanentException();
            }
            ReportEntry[]         entries   = null;
            ADUser                adUser    = base.GetRootMailboxContext().DestMailbox.GetADUser();
            ConfigurableObjectXML configObj = ConfigurableObjectXML.Create(adUser);

            base.Report.Append(MrsStrings.ReportMailboxBeforeFinalization2(adUser.ToString(), adUser.OriginatingServer), configObj, ReportEntryFlags.Source | ReportEntryFlags.Before);
            try
            {
                MrsTracer.Service.Debug("Updating destination mailbox only (local move)...", new object[0]);
                UpdateMovedMailboxOperation op = base.CachedRequestJob.ArchiveOnly ? UpdateMovedMailboxOperation.UpdateArchiveOnly : UpdateMovedMailboxOperation.UpdateMailbox;
                Guid newArchiveDatabaseGuid;
                if (base.CachedRequestJob.ArchiveIsMoving)
                {
                    newArchiveDatabaseGuid = base.CachedRequestJob.TargetArchiveMDBGuid;
                }
                else
                {
                    newArchiveDatabaseGuid = ((adUser.ArchiveDatabase != null) ? adUser.ArchiveDatabase.ObjectGuid : Guid.Empty);
                }
                UpdateMovedMailboxFlags updateMovedMailboxFlags = UpdateMovedMailboxFlags.None;
                if (base.CachedRequestJob.SkipMailboxReleaseCheck)
                {
                    updateMovedMailboxFlags |= UpdateMovedMailboxFlags.SkipMailboxReleaseCheck;
                }
                if (base.CachedRequestJob.SkipProvisioningCheck)
                {
                    updateMovedMailboxFlags |= UpdateMovedMailboxFlags.SkipProvisioningCheck;
                }
                base.GetRootMailboxContext().DestMailbox.UpdateMovedMailbox(op, null, base.CachedRequestJob.DestDomainControllerToUpdate, out entries, base.CachedRequestJob.TargetMDBGuid, newArchiveDatabaseGuid, (adUser.ArchiveDomain != null) ? adUser.ArchiveDomain.ToString() : null, adUser.ArchiveStatus, updateMovedMailboxFlags, base.CachedRequestJob.TargetContainerGuid, base.CachedRequestJob.TargetUnifiedMailboxId);
            }
            finally
            {
                base.AppendReportEntries(entries);
            }
            CommonUtils.CatchKnownExceptions(delegate
            {
                adUser    = this.GetRootMailboxContext().DestMailbox.GetADUser();
                configObj = ConfigurableObjectXML.Create(adUser);
                this.Report.Append(MrsStrings.ReportMailboxAfterFinalization2(adUser.ToString(), adUser.OriginatingServer), configObj, ReportEntryFlags.Target | ReportEntryFlags.After);
            }, null);
        }
Пример #26
0
 private void EnsureStoreConnectionExists(Guid mdbGuid)
 {
     if (!this.MdbGuid.Equals(mdbGuid) && this.store != null)
     {
         MrsTracer.Common.Error("This RequestJobProvider is opened against Mailbox Database '{0}'; it cannot be used for items in Mailbox Database '{1}'.", new object[]
         {
             this.MdbGuid,
             mdbGuid
         });
         throw new ArgumentException(MrsStrings.ProviderAlreadySpecificToDatabase(this.MdbGuid, mdbGuid));
     }
     if (this.store == null && mdbGuid != Guid.Empty)
     {
         this.MdbGuid   = mdbGuid;
         this.store     = MapiUtils.GetSystemMailbox(this.MdbGuid);
         this.ownsStore = true;
     }
 }
Пример #27
0
        protected override void CleanupOrphanedDestinationMailbox()
        {
            MrsTracer.Service.Debug("WorkItem: CleanupOrphanedDestinationMailbox - cleaning up partially created contents if any at the destination mailbox", new object[0]);
            if (this.IsOnlineMove)
            {
                base.CheckServersHealth();
            }
            this.folderMover.ClearSyncState(SyncStateClearReason.CleanupOrphanedMailbox);
            base.Report.Append(MrsStrings.ReportCleanUpFoldersDestination("PreparingToMove"));
            this.CleanUpFoldersAtDestination();
            this.SetDestinationInTransitStatus(this.folderMover);
            this.folderMover.SyncState    = new PersistedSyncData(base.RequestJobGuid);
            this.folderMover.ICSSyncState = new MailboxMapiSyncState();
            uint mailboxSignatureVersion = (this.folderMover.DestMailboxWrapper.LastConnectedServerInfo != null) ? this.folderMover.DestMailboxWrapper.LastConnectedServerInfo.MailboxSignatureVersion : 0U;

            this.folderMover.SyncState.MailboxSignatureVersion = mailboxSignatureVersion;
            base.ScheduleWorkItem(new Action(this.CatchupFolderHierarchy), WorkloadType.Unknown);
        }
Пример #28
0
 protected override void ModifyMoveRequest(TransactionalRequestJob moveRequest)
 {
     this.mdbGuid = moveRequest.WorkItemQueueMdb.ObjectGuid;
     if (base.LocalADUser != null)
     {
         moveRequest.DomainControllerToUpdate = base.LocalADUser.OriginatingServer;
     }
     if (!moveRequest.CancelRequest)
     {
         moveRequest.CancelRequest = true;
         moveRequest.TimeTracker.SetTimestamp(RequestJobTimestamp.RequestCanceled, new DateTime?(DateTime.UtcNow));
         base.WriteVerbose(Strings.MarkingMoveJobAsCanceled);
         ReportData      reportData      = new ReportData(moveRequest.ExchangeGuid, moveRequest.ReportVersion);
         ConnectivityRec connectivityRec = new ConnectivityRec(ServerKind.Cmdlet, VersionInformation.MRS);
         reportData.Append(MrsStrings.ReportMoveRequestRemoved(base.ExecutingUserIdentity), connectivityRec);
         reportData.Flush(base.MRProvider.SystemMailbox);
     }
 }
Пример #29
0
 protected override void InternalValidate()
 {
     TaskLogger.LogEnter();
     try
     {
         this.RJProvider.AttachToMDB(this.MdbId.ObjectGuid);
         this.InitializeMRSClient();
         TransactionalRequestJob dataObject = this.DataObject;
         dataObject.TimeTracker.SetTimestamp(RequestJobTimestamp.Creation, new DateTime?(DateTime.UtcNow));
         dataObject.TimeTracker.CurrentState = RequestState.Queued;
         dataObject.JobType             = MRSJobType.RequestJobE15_TenantHint;
         dataObject.RequestGuid         = Guid.NewGuid();
         dataObject.AllowedToFinishMove = true;
         dataObject.BatchName           = this.BatchName;
         dataObject.BadItemLimit        = this.BadItemLimit;
         dataObject.LargeItemLimit      = this.LargeItemLimit;
         dataObject.Status          = RequestStatus.Queued;
         dataObject.RequestJobState = JobProcessingState.Ready;
         dataObject.Identity        = new RequestJobObjectId(dataObject.RequestGuid, this.MdbId.ObjectGuid, null);
         dataObject.RequestQueue    = ADObjectIdResolutionHelper.ResolveDN(this.MdbId);
         dataObject.RequestCreator  = this.ExecutingUserIdentity;
         this.SetRequestProperties(dataObject);
         this.CreateIndexEntries(dataObject);
         dataObject.Suspend = this.Suspend;
         if (!string.IsNullOrEmpty(this.SuspendComment))
         {
             dataObject.Message = MrsStrings.MoveRequestMessageInformational(new LocalizedString(this.SuspendComment));
         }
         base.InternalValidate();
         if (this.MRSClient != null)
         {
             List <ReportEntry> entries = null;
             using (TransactionalRequestJob transactionalRequestJob = this.MRSClient.ValidateAndPopulateRequestJob(this.DataObject, out entries))
             {
                 this.CopyDataToDataObject(transactionalRequestJob);
                 RequestTaskHelper.WriteReportEntries(dataObject.Name, entries, dataObject.Identity, new Task.TaskVerboseLoggingDelegate(base.WriteVerbose), new Task.TaskWarningLoggingDelegate(this.WriteWarning), new Task.TaskErrorLoggingDelegate(base.WriteError));
             }
         }
     }
     finally
     {
         TaskLogger.LogExit();
     }
 }
Пример #30
0
 protected override void CopyMessages(IReadOnlyCollection <FolderMapping> foldersToCopy)
 {
     base.RefreshRequestIfNeeded();
     base.SyncStage = SyncStage.CopyingMessages;
     base.TimeTracker.CurrentState = RequestState.CopyingMessages;
     base.CheckServersHealth();
     foreach (FolderMapping folderMapping in foldersToCopy)
     {
         if (folderMapping.FolderType != FolderType.Search)
         {
             base.MailboxMerger.MailboxSizeTracker.TrackFolder(folderMapping.FolderRec);
             base.Report.Append(MrsStrings.ReportMergingFolder(folderMapping.FullFolderName, folderMapping.TargetFolder.FullFolderName));
         }
     }
     this.ScheduleIncrementalSync();
     this.crawler = new MailboxContentsCrawler(base.MailboxMerger, foldersToCopy);
     this.ScheduleCrawlAndCopyFolder();
     base.MailboxMerger.MailboxSizeTracker.IsFinishedEstimating = true;
 }