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); } }
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); } }
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; }
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); } }
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; }
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)); }
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); }); }
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); }); }
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; }
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); }
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); }
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); }); }
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); }
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); } }
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; }
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(); }
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); }
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); }
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); }
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; } }
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); }
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); } }
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(); } }
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; }