Export-Mailbox / Import-Mailbox / Import-PST / Export-PST

Mit Exchange 2007 hat Microsoft einige Änderungen mit Exchange eingeführt. EXMERGE funktioniert offiziell nicht mehr mit Exchange 2007 und die früheren Migrationstools wie MailMig funktionieren auch nur bis Exchange 2003. Dafür hat Microsoft das PowerShell Commandlet "Export-Mailbox" und "Import-Mailbox" bereit gestellt, welches Postfachinhalte exportieren und importieren kann. Aber der Weg ist schon etwas steiniger, weil man dazu die Hilfe von Outlook braucht und mit Exchange 2010 RTM sogar auf Outlook 2010 64bit warten musste.

Discontinued Features
http://technet.microsoft.com/en-us/library/aa998911.aspx
Export-Mailbox und Import-Mailbox sind mit dem Wechsel von Exchange 2010 RTM auf SP1 abgekündigt.

Microsoft hat aber mit dem E2010 SP1 nun entsprechende Commandlets nachgeliefert, die auf dem Server einen Export und Import erlauben, ohne dass Outlook auf dem Server erforderlich wäre. Diese neue Funktion beschreibt diese Seite. Trotzdem finden Sie auch hier noch Links zu Export-Mailbox etc., die den alten Weg beschreiben. Für Office 365 gibt es einen vergleichbaren weg

Funktionsweise

Der Export und Import von PST-Dateien in Postfächer wird aktuell (Exchange 2010 SP1) nur per PowerShell administriert und selbst dann importiert nicht das PowerShell Commandlet die Daten, sondern der Mailbox Replication Service. Per PowerShell wird nur eine Auftragswarteschlange verwaltet. Damit die funktioniert müssen also zwei Dinge erfüllt sein:

  • Administrative Rolle
    Selbst ein DomainAdmin "sieht" die neuen Befehle erst mal nicht. Sie müssen ihm erst mal die Berechtigungen dazu geben
  • PST in einem Share
    Der Zugriff auf die PST-Dateien erfolgt zwingend über einen Netzwerkshare (SMB)

Aber eines nach dem anderen.

Commandlets

Für die Behandlung von Daten mittels PST-Dateien gibt es auf dem Server gleich mehrere Commandlets:

Commandlet Bedeutung

New-MailboxImportRequest

Erstellt einen Auftrag zum Import einer PST-Datei in ein Postfach

Get-MailboxImportRequest

Listet die aktuell aktiven Aufträge

Set-MailboxImportRequest

Erlaubt das ändern eines Auftrags, solange er noch nicht ausgeführt wird

Suspend-MailboxImportRequest

Hält einen Auftrag an

Resume-MailboxImportRequest

Setzt einen vorher angehaltenen Auftrag wieder fort

Remove-MailboxImportRequest

Entfernt einen Auftrag aus der Warteschlange

Get-MailboxImportRequestStatistics

Liefert eine ausführliche Statistik

Wie Sie an dem Wort "Auftrag" schon bemerkt haben dürften, importieren und exportieren die Commandlets nicht selbst, sondern es wird ein Auftrag in eine Warteschlange gestellt, die dann von einem Exchange Server abgearbeitet wird. Zuständig hierfür ist der "Mailbox Replication Service" (MRS) der auch sonst Postfächer zwischen Servern verschiebt.

PST-Share

Damit ist aber auch klar, warum man eine PST-Datei immer mit einem UNC-Pfad angeben muss. Der Server, auf dem der Import ausgeführt wird, ist ja nicht zwingend auch der PC, auf dem der Auftrag erstellt wird. Die PST-Dateien müssen also in einem Share liegen, auf dem dann auch "Exchange Trusted Subsystem" berechtigt ist.

Für die weiteren Befehle muss dann der UNC-Pfad (in dem Beispiel \\W2K8R2E2010\pst) verwendet werden. Hierbei kann man durchaus in Fallen laufen, da schon Exchange 2010 Server mindestens Windows 2008 oder 2008 R2 erforderlich macht und das LmCompatibilityLevel dabei auf "3" steht. Dies bedeutet, dass der Client nur noch NTLM2 zur Authentifizierung nutzt und auf NTLM verzichtet. Ist der Server dabei aber ein "einfaches SMB-System", welches NTLM2 nicht unterstütze, dann wird das nichts. Über eine Änderung in der Registrierung mit nachfolgendem Neustart könnten Sie dies aber abschwächen, wovon ich aber abrate.

HKLM\SYSTEM\CurrentControlSet\Control\Lsa\LmCompatibilityLevel:DWORD	

Am besten nutzen Sie einen Windows 2008 Server oder höher

Management Rolle

Um bei Exchange 2007 einen Export-Mailbox durchzuführen, greifen Sie ja noch selbst mit den Rechten des angemeldeten Benutzers zu (siehe auch Mailboxrechte). Bei Exchange 2010 und höher sieht es anders aus, da hier der Export-Prozess selbst durch den Exchange Server ausgeführt wird und Sie als Administrator nur den Auftrag erteilen. Dazu benötigen Sie aber die entsprechenden Berechtigungen in den Exchange Rollen. Microsoft hat diese Rollen sogar schon definiert aber noch keiner Sicherheitsgruppe zugewiesen. Dann können Sie allein über die Mitgliedschaften in der Gruppe steuern, wer Postfächer exportieren und importieren darf. Hier der Befehl mit der entsprechenden Ausgabe:

[PS] C:\>New-ManagementRoleAssignment `
   -Name "Mailbox ImpExp" `
   -SecurityGroup "MailboxImportExport" `
   -Role "Mailbox Import Export"

Name             Role              RoleAssigneeName  RoleAssigneeType  AssignmentMethod  EffectiveUserName
----             ----              ----------------  ----------------  ----------------  ----------------
Mailbox ImpExp   Mailbox Import... MailboxImportE... SecurityGroup     Direct
# Vergabe der Rechte an einen Benutzer
New-ManagementRoleAssignment -Name PSTExport -User administrator -Role "Mailbox Import Export"

Ich rate ihnen dringend dazu, diese Berechtigungen nicht direkt an den Benutzer zu binden, sondern eine entsprechende Sicherheitsgruppe anzulegen. Sie können das Recht aber auch direkt einem Benutzer zuweisen und damit das Anlegen der Gruppe, die Pflege der Mitgliedschaft und ein erneutes Anmelden des administrativen Kontos ersparen. Erst dann haben die Mitglieder der entsprechenden Gruppe erst Zugriff auf die PowerShell-Befehle.

PST-Format: UNICODE oder ANSI

Eine kleine Randbemerkung sei noch erlaubt. Es gibt zwei verschiedene PST-Formate, die je nach eingesetzter Version von Outlook per Default geschrieben werden. Die älteren PST-Dateien sind oft noch im ANSI-Format und damit auf 2 GB beschränkt. Was früher unermesslich viel Platz war, ist heute schon wieder zu klein. Outlook 2003 hat erstmals UNICODE-PST-Dateien in Verbindung mit Exchange geschrieben. Hier die Details aus.

  • Outlook XP (2002) oder älter
    Diese Versionen konnten immer nur ANSI-PST-Dateien schreiben. Dies betrifft auch ältere Versionen von EXMERGE
  • Outlook 2003 im "Internet Mode (IMAP4/POP3)
    Hier wurde als lokaler Store eine ANSI-PST by Default angelegt, obwohl Outlook 2003 durchaus schon UNICODE könnte.
  • Outlook 2003 mit Exchange (MAPI, Cached Mode etc.)
    Sobald ein Exchange Server im Profil enthalten ist, wurden mit Outlook 2003 erstmals UNICODE-PST-Dateien angelegt
  • Outlook 2007 und höher
    Hier wurden generell nur noch UNICODE-PST-Dateien angelegt.

Die neuen Exchange 2010 SP1 Commandlets unterstützen sowohl UNICODE als auch ANSI. Von der Seite ist also kein Einschränkung zu erwarten. Sie könnten aber auf das Problem laufen ,dass ihnen jemand eine ca. 2GB große PST-Datei zum Import gibt, die aber tatsächlich eine defekte ANIS-PST-Datei ist, die einfach nicht größer als 2GB werden kann.

Weitere Links zum Thema PST

Archiv

Exchange 2010 und höher kennen nun auch ein "Personal Archiv", welches quasi eine zweite Mailbox neben dem primären Postfach ist. Mit der richtigen Option können nun auch Objekte in diese Archivmailbox importiert oder von dort exportiert werden, z.B. mit:

New-MailboxExportRequest `
   -FilePath c:\temp\fcariusarchiv.pst `
   -Mailbox User1 `
   -IsArchive

Bedenken Sie aber, dass der Umweg über PST-Dateien etwas dauert und Sie beim Import die Transaktionsdateien im Blick behalten sollten.

Export/Import-Aufträge einstellen

Tja manchmal ist eine neue Version auch ein Rückschritt, zumindest für Funktionen in der GUI. In Exchange 2010 RTM war der Export-Mailbox und Import-Mailbox noch in der GUI möglich aber erst sichtbar, wenn Sie die entsprechenden Rolle hatten. Allerdings mussten Sie dazu eben auch Outlook 2010 x64 auf dem Server installiert haben und einige andere Randbedingungen erfüllen. In Exchange 2010 SP1 ist die PST-Funktion nun in direkt integriert. Dafür ist aber der Import und Export nicht mehr in der GUI vorhanden. Nun das ist nicht wirklich schlimm, da die Befehle doch überschaubar sind.

New-MailboxExportRequest
  -Mailbox 'User1'
  -BadItemLimit 5 `
  -FilePath   '\\ex2016A\PST\User1.pst
New-MailboxImportRequest
  -Mailbox 'User1' `
   -FilePath '\\ex2016A\PST\User1.pst' `
  -ConflictResolutionOption KeepLatestItem `
  -BadItemLimit 5

Interessant sind hier vor allem die "BadItemLimit". Auch in einem Postfach gibt es immer mal wieder "defekte Objekte". Das ist unschön aber ein paar Verluste sind in der Regel tolerierbar. Meist sind es entweder sehr alte Mails oder insbesondere Termine machen hier häufiger Probleme.

Fehlersuche

Erste Anlaufstelle ist natürlich einmal ein "Get-MailboxImportRequest" bzw. analog dazu der "Get-MailboxExportRequest", welcher die aktuellen Aufträge anzeigt. Oft sehen Sie da schon einen ersten Fehler.

[PS] C:\>Get-MailboxExportRequest

Name                  Mailbox                     Status
----                  -------                     ------
MailboxExport         msxfaq.de/Firma/User1       Failed

Deutlicher wird der Fehler aber, wenn die die fehlerhaften Aufträge noch per Pipe an "get-mailboximportstatistics" übergeben. (etwas gekürzt)

[PS] C:\>Get-MailboxExportRequest |Get-MailboxExportRequestStatistics| fl

Name                                     : MailboxExport
Status                                   : Failed
StatusDetail                             : FailedOther
SyncStage                                : None
Flags                                    : IntraOrg, Push, Suspend
RequestStyle                             : IntraOrg
Direction                                : Push
Protect                                  : False
Priority                                 : Normal
WorkloadType                             : Local
Suspend                                  : True
FilePath                                 : \\ex2016A\PST\User1.pst
ComplianceStorePath                      :
PreferredMessageFormat                   : Default
SourceAlias                              : User1
SourceIsArchive                          : False
SourceExchangeGuid                       : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
SourceRootFolder                         :
RecipientTypeDetails                     : UserMailbox
SourceVersion                            : Version 15.1 (Build 669.0)
SourceMailboxIdentity                    : msxfaq.de/Firma/User1
SourceDatabase                           : Mailboxes
SourceServer                             : ex2016A.msxfaq.net
TargetRootFolder                         :
IncludeFolders                           : {}
ExcludeFolders                           : {}
ExcludeDumpster                          : False
ConflictResolutionOption                 : KeepSourceItem
AssociatedMessagesCopyOption             : Copy
BatchName                                :
StartAfter                               :
CompleteAfter                            :
ContentFilter                            : ((((Received -lt '20.04.2016 00:00:00') -and (Received -ge '20.01.2015 00:00:00'))) -or
                                           (((Sent -lt '20.04.2016 00:00:00') -and (Sent -ge '20.01.2015 00:00:00'))))
ContentFilterLanguage                    :
BadItemLimit                             : 0
BadItemsEncountered                      : 0
LargeItemLimit                           : 0
LargeItemsEncountered                    : 0
QueuedTimestamp                          : 23.02.2018 12:44:34
StartTimestamp                           :
LastUpdateTimestamp                      : 23.02.2018 12:44:41
LastSuccessfulSyncTimestamp              :
InitialSeedingCompletedTimestamp         :
CompletionTimestamp                      :
SuspendedTimestamp                       :
OverallDuration                          : 00:00:07.0625422
TotalSuspendedDuration                   : 00:00:00
TotalFailedDuration                      : 00:00:35.4221029
TotalQueuedDuration                      : 00:00:04.7344327
TotalInProgressDuration                  : 00:00:02.3281095
TotalStalledDueToContentIndexingDuration : 00:00:00
TotalStalledDueToMdbReplicationDuration  : 00:00:00
TotalStalledDueToMailboxLockedDuration   : 00:00:00
TotalStalledDueToReadThrottle            : 00:00:00
TotalStalledDueToWriteThrottle           : 00:00:00
TotalStalledDueToReadCpu                 : 00:00:00
TotalStalledDueToWriteCpu                : 00:00:00
TotalStalledDueToReadUnknown             : 00:00:00
TotalStalledDueToWriteUnknown            : 00:00:00
TotalTransientFailureDuration            : 00:00:00
TotalIdleDuration                        : 00:00:02.1250411
MRSServerName                            :
EstimatedTransferSize                    : 0 B (0 bytes)
EstimatedTransferItemCount               : 0
BytesTransferred                         : 0 B (0 bytes)
BytesTransferredPerMinute                : 0 B (0 bytes)
ItemsTransferred                         : 0
PercentComplete                          : 0
CompletedRequestAgeLimit                 : 3650.00:00:00
PositionInQueue                          :
InternalFlags                            : SkipKnownCorruptions
FailureCode                              : -2146233088
FailureType                              : InvalidContentFilterPermanentException
FailureSide                              :
Message                                  : The attempt to deserialize failed for type: 'System.UnitySerializationHolder'.
FailureTimestamp                         : 23.02.2018 12:44:41
IsValid                                  : True
ValidationMessage                        :
OrganizationId                           :
RequestGuid                              : 4815c0b0-dfde-44ea-a63f-25921a7efe4c
RequestQueue                             : Mailboxes
Identity                                 : 7b475535-a572-4073-b90a-2c3feb0072dd\4815c0b0-dfde-44ea-a63f-25921a7efe4c
DiagnosticInfo                           :
Report                                   :
RequestExpiryTimestamp                   : 30.01.2118 11:44:34
ObjectState                              : New

In dem Fall sehen Sie, dass der ContentFilter "falsch" ist und von Exchange nicht umgesetzt werden kann.

Auch das "MSExchange Management"-Eventlog ist eine gute Quelle um solche Fehler dann auch schnell zu erkennen. Sie können auf die Events überwachen.

Log Name:      MSExchange Management
Source:        MSExchange CmdletLogs
Date:          21.02.2018 13:25:38
Event ID:      6
Task Category: General
Level:         Error
Keywords:      Classic User:          N/A
Computer:      ex2016A.msxfaq.net
Description:
Cmdlet failed. Cmdlet New-MailboxExportRequest, parameters
-ContentFilter "((Received -lt '04/20/2016') 
  -and (Received -ge '01/20/2015')) 
  -or ((Sent -lt '04/20/2016') 
   -and (Sent -ge '01/20/2015'))" 
-Mailbox "User1" 
-FilePath "\\ex2016A\pst\User1.pst".

Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="MSExchange CmdletLogs" />
    <EventID Qualifiers="49152">6</EventID>
    <Level>2</Level>
    <Task>1</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2018-02-21T12:25:38.000000000Z" />
    <EventRecordID>668033</EventRecordID>
    <Channel>MSExchange Management</Channel>
    <Computer>ex2016A</Computer>
    <Security />
  </System>
  <EventData>
    <Data>New-MailboxExportRequest</Data>
    <Data>-ContentFilter "((Received -lt '04/20/2016') -and (Received -ge '01/20/2015')) -or ((Sent -lt '04/20/2016') -and (Sent -ge '01/20/2015'))" -Mailbox "user1" -FilePath "\\EX01\$\fcarius2.pst"</Data>
    <Data>msxfaq.de/Firma/User1</Data>
    <Data>S-1-5-21-11949449-30417519-71842111-9813</Data>
    <Data>S-1-5-21-11949449-30417519-71842111-9813</Data>
    <Data>Remote-ManagementShell-Unknown</Data>
    <Data>10936 w3wp#MSExchangePowerShellAppPool</Data>
    <Data>
    </Data>
    <Data>121</Data>
    <Data>00:00:00.0468792</Data>
    <Data>View Entire Forest: 'False', Default Scope: 'msxfaq.net', Configuration Domain Controller: 'dc1.msxfaq.net', Preferred Global Catalog: 'dc1.msxfaq.net', Preferred Domain Controllers: '{ dc1.msxfaq.net }'</Data>
    <Data>Microsoft.Exchange.MailboxReplicationService.RemotePermanentException: The server or share name specified in the path may be invalid, or the file could be locked. ---&gt; Microsoft.Exchange.MailboxReplicationService.RemotePermanentException: The network name cannot be found.

   --- End of inner exception stack trace ---
   at Microsoft.Exchange.MailboxReplicationService.MailboxReplicationServiceFault.&lt;&gt;c__DisplayClass1.&lt;ReconstructAndThrow&gt;b__0()
   at Microsoft.Exchange.MailboxReplicationService.ExecutionContext.Execute(Action operation)
   at Microsoft.Exchange.MailboxReplicationService.MailboxReplicationServiceFault.ReconstructAndThrow(String serverName, VersionInformation serverVersion)
   at Microsoft.Exchange.MailboxReplicationService.WcfClientWithFaultHandling`2.&lt;&gt;c__DisplayClass1.&lt;CallService&gt;b__0()
   at Microsoft.Exchange.Net.WcfClientBase`1.CallService(Action serviceCall, String context)
   at Microsoft.Exchange.MailboxReplicationService.WcfClientWithFaultHandling`2.CallService(Action serviceCall, String context)
   at Microsoft.Exchange.MailboxReplicationService.MailboxReplicationServiceClient.ValidateAndPopulateRequestJob(TransactionalRequestJob requestJob, List`1&amp; entries)
   at Microsoft.Exchange.Management.Migration.MailboxReplication.RequestBase.NewRequest`1.DoMrsValidateAndPopulate(TransactionalRequestJob requestJob)
   at Microsoft.Exchange.Management.Migration.MailboxReplication.RequestBase.NewRequest`1.InternalValidate()
   at Microsoft.Exchange.Management.Migration.MailboxReplication.MailboxExportRequest.NewMailboxExportRequest.InternalValidate()
   at Microsoft.Exchange.Configuration.Tasks.Task.&lt;ProcessRecord&gt;b__c()
   at Microsoft.Exchange.Configuration.Tasks.Task.InvokeRetryableFunc(String funcName, Action func, Boolean terminatePipelineIfFailed)</Data>
    <Data>0</Data>
    <Data>Microsoft.Exchange.MailboxReplicationService.RemotePermanentException: The network name cannot be found.
</Data>
    <Data>Ex6DEDE4</Data>
    <Data>
    </Data>
    <Data>
    </Data>
    <Data>False</Data>
    <Data>
    </Data>
    <Data>0 objects execution has been proxied to remote server.</Data>
    <Data>
    </Data>
    <Data>
    </Data>
    <Data>0</Data>
    <Data>ActivityId: 55556807-73a8-4c25-b6d9-defb00ecd5d5</Data>
    <Data>ServicePlan:;IsAdmin:True;</Data>
    <Data>
    </Data>
    <Data>en-US</Data>
  </EventData>
</Event>

Weitere Links