예제 #1
0
 private void LoadMailboxOwner(byte[] tenantPartitionHintBlob, string nonLocalizedAssistantName)
 {
     if (this.mailboxOwner == null)
     {
         this.InvokeAndMapException(delegate
         {
             ExTraceGlobals.EventDispatcherTracer.TraceDebug <MailboxDispatcher>((long)this.GetHashCode(), "{0}: Looking up ExchangePrincipal...", this);
             ADSessionSettings adSettings;
             if (tenantPartitionHintBlob != null && tenantPartitionHintBlob.Length != 0)
             {
                 adSettings = ADSessionSettings.FromTenantPartitionHint(TenantPartitionHint.FromPersistablePartitionHint(tenantPartitionHintBlob));
             }
             else
             {
                 adSettings = ADSessionSettings.FromRootOrgScopeSet();
             }
             this.mailboxOwner = ExchangePrincipal.FromLocalServerMailboxGuid(adSettings, this.DatabaseInfo.Guid, this.MailboxGuid);
         }, nonLocalizedAssistantName);
     }
 }
 // Token: 0x06000E5E RID: 3678 RVA: 0x000566C5 File Offset: 0x000548C5
 internal static SharingPolicyCache Get(ADObjectId policyId, TenantPartitionHint tenantPartitionHint)
 {
     ArgumentValidator.ThrowIfNull("policyId", policyId);
     ArgumentValidator.ThrowIfNull("tenantPartitionHint", tenantPartitionHint);
     return(SharingPolicyCache.InternalGet(ADSessionSettings.FromTenantPartitionHint(tenantPartitionHint).CurrentOrganizationId, policyId));
 }
        // Token: 0x06001248 RID: 4680 RVA: 0x000689D4 File Offset: 0x00066BD4
        private AssistantTaskContext InitializeContextInternal(MailboxData mailbox, TimeBasedDatabaseJob job)
        {
            OABLogger.LogRecord(TraceType.FunctionTrace, "OABGeneratorAssistant.InitializeContextInternal: start", new object[0]);
            AssistantTaskContext result;

            try
            {
                if (mailbox is OABGeneratorMailboxData)
                {
                    result = OABGeneratorTaskContext.FromAssistantTaskContext(new AssistantTaskContext(mailbox, job, null));
                }
                else if (mailbox is StoreMailboxData)
                {
                    StoreMailboxData  storeMailboxData            = (StoreMailboxData)mailbox;
                    ADSessionSettings sessionSettings             = OABVariantConfigurationSettings.IsMultitenancyEnabled ? ADSessionSettings.FromTenantPartitionHint(storeMailboxData.TenantPartitionHint) : ADSessionSettings.FromRootOrgScopeSet();
                    ADUser            organizationalMailboxFromAD = this.GetOrganizationalMailboxFromAD(sessionSettings, storeMailboxData.Guid);
                    if (organizationalMailboxFromAD == null)
                    {
                        OABLogger.LogRecord(TraceType.ErrorTrace, "OABGeneratorAssistant.InitializeContext: ignoring scheduled job due to unknown organization mailbox: {0}", new object[]
                        {
                            storeMailboxData.Guid
                        });
                        result = null;
                    }
                    else if (organizationalMailboxFromAD.RecipientTypeDetails != RecipientTypeDetails.ArbitrationMailbox || !organizationalMailboxFromAD.PersistedCapabilities.Contains(Capability.OrganizationCapabilityOABGen))
                    {
                        OABLogger.LogRecord(TraceType.ErrorTrace, "OABGeneratorAssistant.InitializeContext: The mailbox {0} is not an organizational mailbox with OABGen capability", new object[]
                        {
                            storeMailboxData.Guid
                        });
                        result = null;
                    }
                    else
                    {
                        OABGeneratorMailboxData mailboxData             = new OABGeneratorMailboxData(organizationalMailboxFromAD.OrganizationId, base.DatabaseInfo.Guid, organizationalMailboxFromAD.ExchangeGuid, organizationalMailboxFromAD.DisplayName, organizationalMailboxFromAD.Sid, organizationalMailboxFromAD.PrimarySmtpAddress.Domain, Guid.Empty, storeMailboxData.TenantPartitionHint, string.Empty);
                        OABGeneratorTaskContext oabgeneratorTaskContext = OABGeneratorTaskContext.FromAssistantTaskContext(new AssistantTaskContext(mailboxData, job, null));
                        oabgeneratorTaskContext.OrganizationMailbox = organizationalMailboxFromAD;
                        result = oabgeneratorTaskContext;
                    }
                }
                else
                {
                    OABLogger.LogRecord(TraceType.ErrorTrace, "OABGeneratorAssistant.InitializeContext: MailboxData is neither StoreMailboxData nor OABGeneratorMailboxData", new object[0]);
                    result = null;
                }
            }
            catch (CannotResolveExternalDirectoryOrganizationIdException ex)
            {
                OABLogger.LogRecord(TraceType.ErrorTrace, "OABGeneratorAssistant.InitializeContext: {0}", new object[]
                {
                    ex.ToString()
                });
                result = null;
            }
            finally
            {
                OABLogger.LogRecord(TraceType.FunctionTrace, "OABGeneratorAssistant.InitializeContextInternal: finish", new object[0]);
            }
            return(result);
        }
 // Token: 0x06001253 RID: 4691 RVA: 0x00069994 File Offset: 0x00067B94
 private OfflineAddressBook[] GetCandidateOABsFromAD(OABGeneratorTaskContext context)
 {
     if (!OABVariantConfigurationSettings.IsLinkedOABGenMailboxesEnabled)
     {
         QueryFilter filter = OABGeneratorAssistant.versionFilter;
         return(context.PerOrgAdSystemConfigSession.Find <OfflineAddressBook>(null, QueryScope.SubTree, filter, null, 0));
     }
     if (context.OrganizationMailbox == null)
     {
         ADSessionSettings sessionSettings = OABVariantConfigurationSettings.IsMultitenancyEnabled ? ADSessionSettings.FromTenantPartitionHint(((OABGeneratorMailboxData)context.MailboxData).TenantPartitionHint) : ADSessionSettings.FromRootOrgScopeSet();
         context.OrganizationMailbox = this.GetOrganizationalMailboxFromAD(sessionSettings, ((OABGeneratorMailboxData)context.MailboxData).Guid);
     }
     if (context.OrganizationMailbox.GeneratedOfflineAddressBooks != null && context.OrganizationMailbox.GeneratedOfflineAddressBooks.Count > 0)
     {
         OABLogger.LogRecord(TraceType.InfoTrace, "OABGeneratorAssistant.GetCandidateOABsFromAD: Found {0} generated offline address books in org mailbox {1}", new object[]
         {
             context.OrganizationMailbox.GeneratedOfflineAddressBooks.Count.ToString(),
             context.OrganizationMailbox.Id
         });
         List <OfflineAddressBook> list = new List <OfflineAddressBook>(context.OrganizationMailbox.GeneratedOfflineAddressBooks.Count);
         foreach (ADObjectId entryId in context.OrganizationMailbox.GeneratedOfflineAddressBooks)
         {
             OfflineAddressBook offlineAddressBook = context.PerOrgAdSystemConfigSession.Read <OfflineAddressBook>(entryId);
             if (offlineAddressBook != null)
             {
                 list.Add(offlineAddressBook);
             }
         }
         return(list.ToArray());
     }
     OABLogger.LogRecord(TraceType.InfoTrace, "OABGeneratorAssistant.GetCandidateOABsFromAD: No offline address books found in org mailbox {0}", new object[]
     {
         context.OrganizationMailbox.Id
     });
     return(null);
 }
        private StoreSession OpenMailboxSession(StoreMailboxData mailbox)
        {
            Guid          activityId       = (ActivityContext.ActivityId != null) ? ActivityContext.ActivityId.Value : Guid.Empty;
            AssistantBase assistant        = this.Assistant as AssistantBase;
            string        nonLocalizedName = this.Assistant.NonLocalizedName;
            Guid          mailboxGuid      = mailbox.MailboxGuid;
            StoreSession  result;

            try
            {
                ExchangePrincipal exchangePrincipal;
                if (mailbox.TenantPartitionHint != null)
                {
                    ADSessionSettings adSettings = ADSessionSettings.FromTenantPartitionHint(mailbox.TenantPartitionHint);
                    exchangePrincipal = ExchangePrincipal.FromLocalServerMailboxGuid(adSettings, this.DatabaseInfo.Guid, mailbox.Guid);
                }
                else
                {
                    exchangePrincipal = ExchangePrincipal.FromMailboxData(mailbox.Guid, this.DatabaseInfo.Guid, mailbox.OrganizationId ?? OrganizationId.ForestWideOrgId, Array <CultureInfo> .Empty);
                }
                if (mailbox.IsPublicFolderMailbox)
                {
                    StoreSession storeSession = PublicFolderSession.OpenAsAdmin(null, exchangePrincipal, null, CultureInfo.InstalledUICulture, string.Format("{0};Action={1}", "Client=TBA", this.Assistant.GetType().Name), null);
                    AssistantsLog.LogMailboxSucceedToOpenStoreSessionEvent(activityId, nonLocalizedName, assistant, mailboxGuid, mailbox.DisplayName, this);
                    result = storeSession;
                }
                else
                {
                    bool           flag     = false;
                    MailboxSession mailbox2 = this.DatabaseInfo.GetMailbox(exchangePrincipal, ClientType.TimeBased, this.Assistant.GetType().Name);
                    try
                    {
                        mailbox2.ReconstructExchangePrincipal();
                        mailbox2.ExTimeZone = ExTimeZone.CurrentTimeZone;
                        flag = true;
                        AssistantsLog.LogMailboxSucceedToOpenStoreSessionEvent(activityId, nonLocalizedName, assistant, mailboxGuid, mailbox.DisplayName, this);
                        result = mailbox2;
                    }
                    finally
                    {
                        if (!flag)
                        {
                            mailbox2.Dispose();
                        }
                    }
                }
            }
            catch (ObjectNotFoundException ex)
            {
                string text    = "MailboxNotFound";
                string message = string.Format("{0}: {1}", this, text);
                string value   = string.Format("{0}:{1}", text, mailbox.MailboxGuid);
                ExTraceGlobals.TimeBasedDatabaseJobTracer.TraceError((long)this.GetHashCode(), message);
                AssistantsLog.LogMailboxFailedToOpenStoreSessionEvent(activityId, nonLocalizedName, assistant, ex, mailboxGuid, mailbox.DisplayName, this);
                throw new SkipException(new LocalizedString(value), ex);
            }
            catch (StorageTransientException ex2)
            {
                string message2 = string.Format("{0}: Could not open mailbox store session due to storage transient error: {1}", this, ex2.Message);
                ExTraceGlobals.TimeBasedDatabaseJobTracer.TraceError((long)this.GetHashCode(), message2);
                AssistantsLog.LogMailboxFailedToOpenStoreSessionEvent(activityId, nonLocalizedName, assistant, ex2, mailboxGuid, mailbox.DisplayName, this);
                Interlocked.Increment(ref this.mailboxesFailedToOpenStoreSessionCount);
                throw;
            }
            catch (Exception ex3)
            {
                string message3 = string.Format("{0}: Could not open mailbox store session due to error: {1}", this, ex3.Message);
                ExTraceGlobals.TimeBasedDatabaseJobTracer.TraceError((long)this.GetHashCode(), message3);
                AssistantsLog.LogMailboxFailedToOpenStoreSessionEvent(activityId, nonLocalizedName, assistant, ex3, mailboxGuid, mailbox.DisplayName, this);
                Interlocked.Increment(ref this.mailboxesFailedToOpenStoreSessionCount);
                throw;
            }
            return(result);
        }
예제 #6
0
        public TObject FindByExchangeGuidIncludingAlternate <TObject>(Guid mailboxGuid, TenantPartitionHint tenantPartitionHint) where TObject : ADObject, new()
        {
            IRecipientSession tenantOrRootOrgRecipientSession;

            if (tenantPartitionHint == null)
            {
                tenantOrRootOrgRecipientSession = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 68, "FindByExchangeGuidIncludingAlternate", "f:\\15.00.1497\\sources\\dev\\MailboxTransport\\src\\MailboxTransportSubmission\\StoreDriverSubmission\\Providers\\ADStoreProvider.cs");
            }
            else
            {
                tenantOrRootOrgRecipientSession = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromTenantPartitionHint(tenantPartitionHint), 74, "FindByExchangeGuidIncludingAlternate", "f:\\15.00.1497\\sources\\dev\\MailboxTransport\\src\\MailboxTransportSubmission\\StoreDriverSubmission\\Providers\\ADStoreProvider.cs");
            }
            return(tenantOrRootOrgRecipientSession.FindByExchangeGuidIncludingAlternate <TObject>(mailboxGuid));
        }
예제 #7
0
        protected virtual StoreSession CreateStoreConnection(MailboxConnectFlags mailboxConnectFlags)
        {
            MrsTracer.Provider.Function("StorageMailbox.CreateStoreConnection", new object[0]);
            base.CheckDisposed();
            if (!base.IsRestore)
            {
                Guid guid = base.IsArchiveMailbox ? base.MbxArchiveMdbGuid : base.MbxHomeMdbGuid;
                if (mailboxConnectFlags.HasFlag(MailboxConnectFlags.NonMrsLogon) && base.TestIntegration.GetIntValueAndDecrement("InjectNFaultsTargetConnectivityVerification", 0, 0, 2147483647) > 0)
                {
                    guid = new Guid("F00DBABE-0000-0000-0000-000000000000");
                }
                if (base.MdbGuid != guid)
                {
                    MrsTracer.Provider.Warning("Source mailbox does not exist or is in the wrong database.", new object[0]);
                    throw new MailboxIsNotInExpectedMDBPermanentException(guid);
                }
            }
            MrsTracer.Provider.Debug("Opening StoreSession: mailbox=\"{0}\"", new object[]
            {
                base.TraceMailboxId
            });
            StoreSession result;

            try
            {
                using (base.RHTracker.Start())
                {
                    ADSessionSettings adsessionSettings = (base.PartitionHint != null) ? ADSessionSettings.FromTenantPartitionHint(base.PartitionHint) : ADSessionSettings.FromRootOrgScopeSet();
                    adsessionSettings.IncludeSoftDeletedObjects = true;
                    adsessionSettings.IncludeInactiveMailbox    = true;
                    ExchangePrincipal exchangePrincipal;
                    if (base.IsRestore)
                    {
                        exchangePrincipal = ExchangePrincipal.FromMailboxData(base.MailboxGuid, base.MdbGuid, StorageMailbox.CultureInfos);
                    }
                    else
                    {
                        exchangePrincipal = ExchangePrincipal.FromMailboxGuid(adsessionSettings, base.MailboxGuid, base.MdbGuid, RemotingOptions.LocalConnectionsOnly, base.EffectiveDomainControllerName, false);
                    }
                    string text = ((mailboxConnectFlags & MailboxConnectFlags.NonMrsLogon) != MailboxConnectFlags.None) ? "Client=Management" : "Client=MSExchangeMigration";
                    if ((mailboxConnectFlags & MailboxConnectFlags.PublicFolderHierarchyReplication) != MailboxConnectFlags.None)
                    {
                        text = "Client=PublicFolderSystem;Action=PublicFolderHierarchyReplication";
                    }
                    if (base.IsPublicFolderMailbox)
                    {
                        OpenMailboxSessionFlags openMailboxSessionFlags = OpenMailboxSessionFlags.None;
                        if (base.RestoreFlags.HasFlag(MailboxRestoreType.Recovery))
                        {
                            openMailboxSessionFlags |= OpenMailboxSessionFlags.UseRecoveryDatabase;
                        }
                        result = PublicFolderSession.OpenAsMRS(exchangePrincipal, text, openMailboxSessionFlags);
                    }
                    else
                    {
                        MailboxSession.InitializationFlags initializationFlags = MailboxSession.InitializationFlags.None;
                        if (base.IsRestore)
                        {
                            initializationFlags |= MailboxSession.InitializationFlags.OverrideHomeMdb;
                            if (base.RestoreFlags.HasFlag(MailboxRestoreType.Recovery))
                            {
                                initializationFlags |= MailboxSession.InitializationFlags.UseRecoveryDatabase;
                            }
                            if (base.RestoreFlags.HasFlag(MailboxRestoreType.SoftDeleted) || base.RestoreFlags.HasFlag(MailboxRestoreType.Disabled))
                            {
                                initializationFlags |= MailboxSession.InitializationFlags.DisconnectedMailbox;
                            }
                            base.VerifyRestoreSource(mailboxConnectFlags);
                        }
                        if (base.IsFolderMove && this is StorageDestinationMailbox)
                        {
                            initializationFlags |= MailboxSession.InitializationFlags.MoveUser;
                        }
                        if (base.IsOlcSync)
                        {
                            initializationFlags |= MailboxSession.InitializationFlags.OlcSync;
                        }
                        this.PerformPreLogonOperations(exchangePrincipal, mailboxConnectFlags, text);
                        result = MailboxSession.OpenAsMrs(exchangePrincipal, initializationFlags, text);
                    }
                }
            }
            catch (ObjectNotFoundException originalException)
            {
                base.VerifyMdbIsOnline(originalException);
                throw;
            }
            catch (MailboxInTransitException innerException)
            {
                throw this.GetMailboxInTransitException(innerException);
            }
            return(result);
        }
예제 #8
0
        private StoreSession ConnectToTargetMailbox(bool mailboxMustExist, MailboxConnectFlags mailboxConnectFlags)
        {
            MrsTracer.Provider.Function("StorageDestinationMailbox.ConnectToTargetMailbox", new object[0]);
            base.CheckDisposed();
            StoreSession result      = null;
            ConnectFlag  connectFlag = ConnectFlag.UseAdminPrivilege;

            connectFlag |= ConnectFlag.UseRpcContextPool;
            if (!mailboxMustExist)
            {
                bool flag = false;
                MrsTracer.Provider.Debug("Checking if destination mailbox exists...", new object[0]);
                using (ExRpcAdmin rpcAdmin = base.GetRpcAdmin())
                {
                    using (base.RHTracker.Start())
                    {
                        flag = MapiUtils.IsMailboxInDatabase(rpcAdmin, base.MdbGuid, base.MailboxGuid);
                    }
                }
                if (!flag)
                {
                    MrsTracer.Provider.Debug("Mailbox {0} does not exist in database {1}", new object[]
                    {
                        base.MailboxGuid,
                        base.MdbGuid
                    });
                    return(null);
                }
                MrsTracer.Provider.Debug("Mailbox {0} exists in database {1}", new object[]
                {
                    base.MailboxGuid,
                    base.MdbGuid
                });
            }
            StoreSession storeSession = null;

            try
            {
                using (base.RHTracker.Start())
                {
                    DefaultFolderType[] foldersToInit = (DefaultFolderType[])Enum.GetValues(typeof(DefaultFolderType));
                    MailboxSession.InitializationFlags initializationFlags = MailboxSession.InitializationFlags.DefaultFolders | MailboxSession.InitializationFlags.UserConfigurationManager | MailboxSession.InitializationFlags.DeadSessionChecking | MailboxSession.InitializationFlags.RequestLocalRpc | MailboxSession.InitializationFlags.OverrideHomeMdb | MailboxSession.InitializationFlags.SuppressFolderIdPrefetch | MailboxSession.InitializationFlags.UseNamedProperties | MailboxSession.InitializationFlags.DisconnectedMailbox | MailboxSession.InitializationFlags.MoveUser;
                    if (base.MbxType == MailboxType.DestMailboxCrossOrg)
                    {
                        initializationFlags |= MailboxSession.InitializationFlags.XForestMove;
                    }
                    MrsTracer.Provider.Debug("Opening Mailbox Session: mailbox='{0}', mailboxGuid={1}, dbGuid={2}, connectFlags=[{3}], initFlags=[{4}]", new object[]
                    {
                        base.TraceMailboxId,
                        base.MailboxGuid.ToString(),
                        base.MdbGuid.ToString(),
                        connectFlag,
                        initializationFlags
                    });
                    OrganizationId organizationId;
                    if (base.PartitionHint != null)
                    {
                        ADSessionSettings adsessionSettings = ADSessionSettings.FromTenantPartitionHint(base.PartitionHint);
                        organizationId = adsessionSettings.CurrentOrganizationId;
                    }
                    else
                    {
                        organizationId = OrganizationId.ForestWideOrgId;
                    }
                    ExchangePrincipal exchangePrincipal = ExchangePrincipal.FromMailboxData(base.MailboxGuid, base.MdbGuid, organizationId, StorageMailbox.CultureInfos);
                    string            clientInfoString  = "Client=MSExchangeMigration";
                    if ((mailboxConnectFlags & MailboxConnectFlags.PublicFolderHierarchyReplication) != MailboxConnectFlags.None)
                    {
                        clientInfoString = "Client=PublicFolderSystem;Action=PublicFolderHierarchyReplication";
                    }
                    if (base.IsPublicFolderMailbox)
                    {
                        storeSession = PublicFolderSession.OpenAsMRS(exchangePrincipal, clientInfoString, OpenMailboxSessionFlags.None);
                    }
                    else
                    {
                        MailboxAccessInfo accessInfo = new MailboxAccessInfo(new WindowsPrincipal(WindowsIdentity.GetCurrent()));
                        storeSession = MailboxSession.ConfigurableOpen(exchangePrincipal, accessInfo, CultureInfo.InvariantCulture, clientInfoString, LogonType.SystemService, null, initializationFlags, foldersToInit);
                    }
                    if (!base.TestIntegration.DisableFolderCreationBlockFeature)
                    {
                        storeSession.BlockFolderCreation = true;
                    }
                    if (storeSession != null && base.Flags.HasFlag(LocalMailboxFlags.WordBreak))
                    {
                        bool invalidateAnnotations = base.Flags.HasFlag(LocalMailboxFlags.InvalidateContentIndexAnnotations);
                        storeSession.ContentIndexingSession = ContentIndexingSession.CreateSession(storeSession, invalidateAnnotations);
                    }
                    result       = storeSession;
                    storeSession = null;
                }
            }
            catch (Exception ex)
            {
                if (CommonUtils.ExceptionIs(ex, new WellKnownException[]
                {
                    WellKnownException.MapiNotFound
                }))
                {
                    base.VerifyMdbIsOnline(ex);
                    if (mailboxMustExist)
                    {
                        throw;
                    }
                }
                else
                {
                    if (CommonUtils.ExceptionIs(ex, new WellKnownException[]
                    {
                        WellKnownException.MapiMailboxInTransit
                    }))
                    {
                        throw this.GetMailboxInTransitException(ex);
                    }
                    throw;
                }
            }
            finally
            {
                if (storeSession != null)
                {
                    storeSession.Dispose();
                }
            }
            return(result);
        }