Freitag, 23. August 2019

[EXCHANGE][MIGRATION] Eine OnPremise Exchange Migration durchführen


Voraussetzungen

Exchange 2007 kann nur auf maximal Exchange 2013 NICHT 2016 migriert werden
Exchange 2010 kann nur auf maximal Exchange 2016 NICHT 2019 migriert werden
Exchange 2013 kann NICHT auf einem Server 2016 installiert werden, nur Server 2012 R2
Exchange 2016 kann NICHT auf einem Server 2019 installiert werden, nur Server 2016

Active Directory functional level

Exchange 2013                  2003
Exchange 2016                  2008 R2
Exchange 2019                  2012 R2

Outlook Client

Exchange 2013                  Outlook 2007 SP3
Exchange 2016                  Outlook 2010 SP2
Exchange 2019                  Outlook 2013

Komplette Kompatibilität Matrix online

Cutover oder Coexistenz?

Entweder man löst den alten Exchange in einem Schritt ab, oder man lässt beide noch ein wenig laufen (coexistenz)

Jenachdem ist ein Extra-Schritt notwendig

Anmerkung, bei der Coexistenz sind extern ebenfalls «legacy» DNS nötig (legacy.contoso.com) sowie damit es extern funktioniert 2 externe IP Adressen
Patch-Status alter Exchange Server:
Bitte den alten Server so weit wie möglich Patchen und Updaten:
WICHTIG: Dies sind die im MINIMUM benötigten Patches gemäss Microsoft

Domain Level vom AD

Der Forest und Domain Functional Level sollten mindestens 2003 / 2008R2 sein, bitte wie hier beschrieben überprüfen:
Bzw:
Active Directory Users and Computers
-> Raise Domain Functional Level
Active Directory Domains and Trusts
-> Raise Forest Functional Level


IIS Authentifizierung anpassen:

IIS Manager -> Sites -> Default Web Site -> RPC
Authentifizierung: Windows Authentication -> Enable

Exchange Infos vom alten Server auslesen

Als erstes brauchen wir die Infos des aktuellen Exchange, dazu ein kleines Script:

Folgendes Script als z.B. ExchangeAuslesen.ps1 auf dem Desktop speichern und in der Exchange Shell ausführen (auf altem Server):

$file = "$env:USERPROFILE\Desktop\OLDEXCHINFOS.TXT"
$servername = "ALTER EXCHANGE SERVER"

Get-OwaVirtualDirectory -Server $servername | fl internalurl | Out-File -append -filepath $file
Get-OwaVirtualDirectory -Server $servername | fl externalurl | Out-File -append -filepath $file
Get-EcpVirtualDirectory -server $servername | fl internalurl | Out-File -append -filepath $file
Get-EcpVirtualDirectory -server $servername | fl externalurl | Out-File -append -filepath $file
Get-WebServicesVirtualDirectory -server $servername | fl internalurl | Out-File -append -filepath $file
Get-WebServicesVirtualDirectory -server $servername | fl externalurl | Out-File -append -filepath $file
Get-ActiveSyncVirtualDirectory -Server $servername  | fl internalurl | Out-File -append -filepath $file
Get-ActiveSyncVirtualDirectory -Server $servername  | fl externalurl | Out-File -append -filepath $file
Get-OabVirtualDirectory -Server $servername | fl internalurl | Out-File -append -filepath $file
Get-OabVirtualDirectory -Server $servername | fl externalurl | Out-File -append -filepath $file
#$mapiexturl = Get-MapiVirtualDirectory -Server $servername | fl internalurl
#$mapiinturl = Get-MapiVirtualDirectory -Server $servername | fl externalurl

Get-OutlookAnywhere -Server $servername | fl externalhostname | Out-File -append -filepath $file
Get-OutlookAnywhere -Server $servername | fl internalhostname | Out-File -append -filepath $file
Get-OutlookAnywhere -Server $servername | fl ClientAuthenticationMethod | Out-File -append -filepath $file

#$aduri = Get-ClientAccessService $servername | fl AutoDiscoverServiceInternalUri
#$aduri2 = Get-ClientAccessServer $servername | fl AutoDiscoverServiceInternalUri


#postfachgrössen
Get-MailboxStatistics -server $servername | Sort-Object TotalItemSize -Descending | ft DisplayName,@{label="TotalItemSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}},ItemCount | Out-File -append $file

#postfachgrössen-limits
#Get-Mailbox -server $server -ResultSize Unlimited | Where {$_.UseDatabaseQuotaDefaults -eq $False} | Select Name,Prohibit*,Issue* | Out-File -append $file
Get-Mailbox -server $servername -ResultSize Unlimited | Select Name,Prohibit*,Issue* | Out-File -append $file

#datenbankgrössenlimits
Get-MailboxDatabase -server $servername | fl StorageGroupName,Name,issuewarningquota,ProhibitSendQuota,ProhibitSendReceiveQuota | Out-File -append $file

#open relay?
Get-ReceiveConnector -server $servername | Get-ADPermission | Where {$_.ExtendedRights -like "*Ms-Exch-SMTP-Accept-Any-Recipient*" -and $_.Deny -eq $False -and $_.User -like "*NT AUTHORITY\Anonymous Logon*"} | fl Identity | Out-File -append $file

#OAB
Get-MailboxDatabase -server $servername | Where {$_.OfflineAddressBook -eq $null} | Set-MailboxDatabase -OfflineAddressBook (Get-OfflineAddressBook | Where {$_.IsDefault -eq $True}) | Out-File -append $file
Get-OfflineAddressBook -server $servername | Where {$_.IsDefault -eq $True} | Out-File -append $file

#public folders
Get-PublicFolder -server $servername -Recurse |Where {$_.Identity.ToString() -ne “\NON_IPM_SUBTREE”} | Select Identity,@{N=”Replicas”;E={[String]::Join(“;”, $_.Replicas)}}, Foldertype, MailEnabled,@{N=”Size MB”;E={(Get-PublicFolderStatistics $_).TotalItemSize.Value.ToMB()}} | Out-File -append $file

Sendeconnectoren:
Organisation Configuration -> Send connectors
Werden die Mails direkt oder per Smarthost versendet?
Smarthostname und ggf. Logins aufschreiben
Empfangsconnectoren:
Server Configuration -> Hub Transport -> Empfangsconnectoren
Die Frage ist, ob ein Open-Relay Connector vorhanden ist bzw. nicht-Standard Connectoren
Ich empfehle, dennoch dies manuel noch zu prüfen und folgendes zu notieren:
Name, IP/Port, Accept Mail From, Authentication
Offline Adress Book
Das Offline Adressbuch sollte auf allen Datenbanken konfiguriert sein, und nicht leer sein!
Dies lässt sich mit diesem Befehl leicht beheben:
Get-MailboxDatabase | Where {$_.OfflineAddressBook -eq $null} | Set-MailboxDatabase -OfflineAddressBook (Get-OfflineAddressBook | Where {$_.IsDefault -eq $True})
Das Script enthält den Befehl, aber zu Sicherheit nochmals ausführen

Neuen Server Installieren (OS)

Nun sind wir so weit. Der neue Server kann nun installiert werden.
DC Join
Nach der Installation des Server OS und der installation aller Windows Updates, diese ganz normal in die Domäne aufnehmen wie ein Computer (nur join, kein dcpromo).

Vorbereitungen

Exchange 2013
In der Windows Powershell, folgenden Befehl ausführen, dieser installiert alle benötigten Features:
Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS, RSAT-ADDS-Tools
Auf einem 2012 Server, muss manuell noch folgendes installiert werden:
Microsoft Unified Communications Managed API 4.0 Runtime Installieren:

Exchange 2016

Net 4.7.1 installieren
https://www.microsoft.com/de-DE/download/details.aspx?id=56116

Unified Messaging Communications Managed API 4.0 Runtime
https://www.microsoft.com/de-DE/download/confirmation.aspx?id=34992

Visual C++ Redist:
https://www.microsoft.com/de-DE/download/details.aspx?id=40784

Windows Features:
Windows Poweshell :
Install-WindowsFeature RSAT-ADDS
Install-WindowsFeature NET-WCF-HTTP-Activation45, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation

Exchange 2019


Windows Features:
Windows Poweshell :
Install-WindowsFeature RSAT-ADDS

Install-WindowsFeature NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS

Backup

Bevor wir den Exchange Server installieren, ist ein funktionierendes Backup zu empfehlen.
Da das AD Schema usw. Updated wird. Diese Änderungen sind nicht rückgängig zu machen!

Exchange Installieren

Exchange 2013

DownloadLink: https://www.microsoft.com/en-us/download/details.aspx?id=54931
(Die CU's sind vollständige Installer)
Einfach das Setup.exe starten (als Administrator)
Wichtig:
Mailbox role und Client Acces role installieren
Grundsätzlich können die Standardeinstellungen genutzt werden
Die Warnmeldung bez. Office 2010 Filter Packs kann grundsätzlich ignoriert werden,
oder Ihr installiert dies einfach

Exchange 2016

Den Exchange ganz normal installieren:
Ohne Updates
Mailbox Rolle und Windows Features automatisch installieren
Standardpfad sowie alle Standardeinstellungen sind gut

Exchange 2019

Den Exchange ganz normal installieren:
Ohne Updates
Mailbox Rolle und Windows Features automatisch installieren
Standardpfad sowie alle Standardeinstellungen sind gut

ECP Zugriff Prüfen

Nach der Installation des Exchange schauen wir, ob die neue Admin Console funktioniert:
 
Falls es nicht geht, ist hier ein Lösungsansatz. Nicht weitermachen ohne funktionierendes ECP
https://blog.ollischer.com/exchange-2016-http-error-500-after-logging-into-ecpowa

----------------------------------------

Verbindungen auf alten Exchange umleiten:
Exchange Management Shell (neuer Server):

Get-ClientAccessServer -Identity <ALTER EXCHANGE SERVER> | fl AutoDiscoverServiceInternalURI
Die URL sollte sein:
https://autodiscover.contoso.com/Autodiscover/Autodiscover.xml
Wir setzen diese nun dem neuen Exchange Server:
Set-ClientAccessServer -Identity <NEUER EXCHANGE SERVER> -AutoDiscoverServiceInternalURI https://autodiscover.contoso.com/Autodiscover/Autodiscover.xml
Damit leiten wir alle Clients, die aus was auch immer für Gründen, schon mit dem neuen Exchange 2013 verbinden wollen, auf den alten 2007 Exchange wieder um

 
MAPIoverHTTP aktivieren (optional)
Exchange Management Shell (neuer Server):
Set-OrganizationConfig -MapiHttpEnabled $true

Anmerkung: Ggf. die Limits wie hier beschrieben setzen:
http://blog.thunderbyte.ch/2017/11/exchange-mapi-over-http-einstellungen.html

Alle Exchange Pfade setzen:

Wir schauen uns die Namen aus dem Export-Script an, aber meist ist dies:
mail.contoso.com und autodiscover.contoso.com

Folgendes Script als z.B. PfadeSetzen.ps1 auf dem Desktop speichern und in der Exchange Shell ausführen (auf neuem Server):
$servername = "NEUER EXCHANGE SERVER"
$internalhostname = "mail.contoso.de"
$externalhostname = "mail.contoso.de"
$autodiscoverhostname = "autodiscover.contoso.de"
  
$owainturl = "https://" + "$internalhostname" + "/owa"
$owaexturl = "https://" + "$externalhostname" + "/owa"
$ecpinturl = "https://" + "$internalhostname" + "/ecp"
$ecpexturl = "https://" + "$externalhostname" + "/ecp"
$ewsinturl = "https://" + "$internalhostname" + "/EWS/Exchange.asmx"
$ewsexturl = "https://" + "$externalhostname" + "/EWS/Exchange.asmx"
$easinturl = "https://" + "$internalhostname" + "/Microsoft-Server-ActiveSync"
$easexturl = "https://" + "$externalhostname" + "/Microsoft-Server-ActiveSync"
$oabinturl = "https://" + "$internalhostname" + "/OAB"
$oabexturl = "https://" + "$externalhostname" + "/OAB"
$mapiinturl = "https://" + "$internalhostname" + "/mapi"
$mapiexturl = "https://" + "$externalhostname" + "/mapi"
$aduri = "https://" + "$autodiscoverhostname" + "/Autodiscover/Autodiscover.xml"
  
Get-OwaVirtualDirectory -Server $servername | Set-OwaVirtualDirectory -internalurl $owainturl -externalurl $owaexturl
Get-EcpVirtualDirectory -server $servername | Set-EcpVirtualDirectory -internalurl $ecpinturl -externalurl $ecpexturl
Get-WebServicesVirtualDirectory -server $servername | Set-WebServicesVirtualDirectory -internalurl $ewsinturl -externalurl $ewsexturl
Get-ActiveSyncVirtualDirectory -Server $servername  | Set-ActiveSyncVirtualDirectory -internalurl $easinturl -externalurl $easexturl
Get-OabVirtualDirectory -Server $servername | Set-OabVirtualDirectory -internalurl $oabinturl -externalurl $oabexturl
Get-MapiVirtualDirectory -Server $servername | Set-MapiVirtualDirectory -externalurl $mapiexturl -internalurl $mapiinturl
Get-OutlookAnywhere -Server $servername | Set-OutlookAnywhere -externalhostname $externalhostname -internalhostname $internalhostname -ExternalClientsRequireSsl:$true -InternalClientsRequireSsl:$true -ExternalClientAuthenticationMethod 'Negotiate'
Get-ClientAccessService $servername | Set-ClientAccessService -AutoDiscoverServiceInternalUri $aduri
Get-ClientAccessServer $servername | Set-ClientAccessServer -AutoDiscoverServiceInternalUri $aduri

SSL Zertifikat installieren

Entweder ein selber signiertes, gekauftes (empfohlen) oder ein gratis Zertifikat verwenden.

Selber signiert:
http://blog.thunderbyte.ch/2016/08/server-eigenes-ssl-zertifikat-richtig.html

Gekauftes:
http://blog.thunderbyte.ch/2019/04/ssliisexchangessl-zertifikat-mit.html
Das Zertifikat nicht nur im IIS unter den Bindungen setzen, sowie auch hier bitte:
Exchange Admin Center:
Server -> Zertifikate
Für SMTP, IMAP, POP und IIS Einstellen

Diverse Einstellungen
Authentifizierungseinstellungen:




Empfehlung: Gleich einstellen wie beim "alten" Server,
Grundlegend empfehle ich aber folgendes:

ACHTUNG: Wird geändert, kann es sein, das die Handys neu konfiguriert werden müssten


Exchange Admin Center:
Server -> Server

Auf beiden Servern, Outlook Anywhere:
Interne / Externe URL überprüfen
Methode auf: Aushandeln
SSL Abladung zulassen

Server -> Virtuelle Verzeichnisse

Server: Alle
Typ: OWA

Bei beiden Servern unter Authentifizierung:

Formularbasiert -> Nur Benutzername und die Anmeldedomäne auswählen

IIS:
Default Website -> Microsoft-Server-ActiveSync

Authentication (Männchen Symbol)
Standardauthentifizierung -> bearbeiten

Standarddomäne: \
Bereich: contoso.local

(Dadurch muss auf den Handys die Domäne nicht angegeben werden)



Versenden einrichten:
Exchange Admin Center:
Nachrichtenfluss -> Sendeconnector

In den Bereichsdefinitionen, den neuen Server auch als Quellserver hinzufügen

Neuen Server etwas anpassen

Datenbank Umbenennen:
Standardmässig erstellt das Setup einen doofen Namen:

Get-MailboxDatabase -Server NEUER EXCHANGE SERVER

Ändern wir dies doch in etwas Passenderes:

Set-MailboxDatabase -Identity “Mailbox Database XY” -Name EXCHXXDB

Sollte die Mailbox auf eine andere Partition, wäre nun ein guter Zeitpunkt:

(V16 ggf. anpassen, je nach Server Version)
Move-DatabasePath -Identity EXCHXXDB -EdbFilePath “D:\Microsoft\Exchange Server\V16\Mailbox\EXCHXXDB.edb” -LogFolderPath “D:\Microsoft\Exchange Server\V16\Mailbox\EXCHXXDB ”
Grenzwerte Einstellen:

Servers -> Datenbanken:
Auf der neuen Datenbank die gleichen Grenzwerte wie auf der alten einstellen
Wir holen wieder unsere Notizen, und setzen in den Eigenschaften der Datenbank die Limiten für die Postfachgrössen etc.
Auf dem alten Server, lässt sich mit diesem Befehl die Postfachgrössen einsehen:
Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | ft DisplayName,@{label="TotalItemSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}},ItemCount

Umlaufprotokollierung aktivieren
Achtung, je nachdem wie viel Daten migriert werden, braucht der Exchange für das Transaktionsprotokoll sehr viel Platz!

Gegebenenfalls die Umlaufprotokollierung einstellen:

Server -> Datenbanken

Wartung: Umlaufprotokollierung
Je nach dem dies nach der Migration wieder deaktivieren

Datenbank Aus- und Einbinden
Die Datenbank für das übernehmen der Einstellungen Aus- und wieder Einbinden

Empfangsconnector Open Relay
EAC -> Nachrichtenfluss -> Empfangsconnector
Hier brauchen wir nun die Notizen welche wir zu beginn gemacht haben vom alten Exchange Server und dessen Empfangsconnectoren
Erstellt diese nach den Notizen
Die standardmässig installierten Empfangsconnectoren sollten eigentlich genügen (Default Frontend SERVERNAME)
Für Geräte im Netzwerk, z.B. Scanner, empfehle ich auf z.B. Port 2525 einen SMTP relay zu erstellen, damit diese ohne Passwort und komplizierten einstellungen E-Mails verschicken können
Neu:
Name: SMTP_RELAY_INTERNAL
Rolle: Frontend Transport
Typ: Custom
Port auf 2526 ändern
Remote Netzwerk, hier die IP Adressen eintragen, welche senden dürfen

Authentifizierung:
Extern gesichert
Berechtigungsgruppen
Exchange Server und Anonyme Benutzer

(Nicht vergessen, 2526 in der Windows Firewall öffnen)
 
SMTP Banner Setzen:
Get-ReceiveConnector
Get-ReceiveConnector "Default Frontend SERVERNAME" | Format-List
Set-ReceiveConnector -Identity "Default Frontend SERVERNAME" -Banner "220 mail.contoso.com"

Wichtig: auf den gleichen Wert wie der PTR (Reverse-DNS) Eintrag setzen

OAB Setzen:
Server -> Datenbanken, unter Clienteinstellungen, das Default Adress Book setzen

Limits Setzen

Empfangsconnector Limits
EAC -> Nachrichtenfluss -> Empfangsconnector
Hier brauchen wir nun die Notizen welche wir zu beginn gemacht haben vom alten Exchange Server und dessen Empfangsconnectoren
Stellt dort die Grössenlimits für Nachrichten ein wie es der alte Server hatte

Sendeconnector Limits
Nachrichtenfluss -> Sendeconnectors
Setzt auch die Limits für den Sendeconnector


FQDN Setzen:
Set-SendConnector -Identity CONNECTORNAME -Fqdn "mail.contoso.ch"

Elementgrössenlimits:
Get-TransportConfig | fl MaxReceiveSize,MaxSendSize
Set-TransportConfig -MaxReceiveSize 100MB -MaxSendSize 100MB

Einstellungen prüfen

Sende Connector prüfen
Nachrichtenfluss -> Sendeconnectors
Hier die Einstellungen prüfen oder ggf. neuen Connector erstellen
(Name: InternetMail
Typ: Internet
MX wählen (direkter versand) oder einen Smart Host angeben
Adressbereich:
Neu -> Typ: SMT, Domain: *, Kosten: 1
)
Akzeptierte Domäne prüfen:
Nachrichtenfluss -> Akzeptierte Domänen
Müsste eigentlich sauber übernommen worden sein

Neu Erstellen falls nicht:
( Name: contoso.com
Accepted domain: contoso.com
)
Adressrichtline prüfen:
Nachrichtenfluss -> E-Mail Adress Richtlinie
Müsste eigentlich sauber übernommen worden sein

Passen Sie die bestehenden Standardrichtlinien entsprechend an:
Akzeptierte Domäne: contoso.com
Adressenformat: alias@contoso.com

Server neu starten

Alles ist eingestellt. Sicherheitshalber mal den Server neu starten

Die Daten Migration

Firewall und DNS

Auf der Firewall, Port 25 / 443 auf den neuen Exchange umstellen

DNS auf dem DC auf den neuen Exchange umstellen

autodiscover.contoso.com / mail.contoso.com auf die IP des neuen Exchanges

Cutover oder Coexistenz?

Entweder man löst den alten Exchange in einem Schritt ab, oder man lässt beide noch ein wenig laufen (coexistenz)

Jenachdem ist folgender Extra-Schritt notwendig

Anmerkung, bei der Coexistenz sind extern ebenfalls «legacy» DNS nötig (legacy.contoso.com)
FIREWALL REGELN NICHT VERGESSEN VIA 2ER WAN IP

Coexistenz einrichten

DNS Erstellen

Damit wir beide Exchange betreiben können, brauchen wir DNS Einträge für den alten Exchange.
Im DNS Manager auf dem DC, setzen wir also einen neuen A record:
legacy -> IP des alten Exchange Servers
(legacy.contoso.com)
Je nachdem, sollte der DNS Eintrag auch ausserhalb (beim Hoster) gesetzt werden
Alter OWA testen:
https://legacy.contoso.com/owa

Pfade des alten Exchange setzen

Wir setzen nun die externen und internen URLs auf den neuen Legacy Eintrag
Per Script oder Manuel:
Exchange Management Console
Server Configuration -> Client Access -> Outlook Web Access, General Tab
Internal URL
z.B.: https://legacy.contoso.com/owa
External URL
z.B.: https://legacy.contoso.com/owa 
Offline Adress Book:
internal / external URL:
https://legacy.contoso.com/oab
Exchange Active Sync URL:
Microsoft Server Active Sync Properties:
Internal URL:
https://legacy.contoso.com/Microsoft-Server-Active-Sync
External URL:
leer lassen
HTTPS Web Service:
Geht nur via Exchange 2007 Shell:
Set-WebServicesVirtualDirectory -Identity "SERVERNAME\ews (Default Web Site)" -InternalURL "https://legacy.contoso.com/EWS/Exchange.asmx" -ExternalURL "https://legacy.contoso.com/EWS/Exchange.asmx"
Folgendes Script als z.B. LegacyPfadeSetzen.ps1 auf dem Desktop speichern und in der Exchange Shell ausführen (auf altem Server):
servername = "ALTER EXCHANGE"
$internalhostname = "legacy.contoso.com"
$externalhostname = "legacy.contoso.com"
$autodiscoverhostname = "autodiscover.contoso.com"
 
$owainturl = "https://" + "$internalhostname" + "/owa"
$owaexturl = "https://" + "$externalhostname" + "/owa"
$ecpinturl = "https://" + "$internalhostname" + "/ecp"
$ecpexturl = "https://" + "$externalhostname" + "/ecp"
$ewsinturl = "https://" + "$internalhostname" + "/EWS/Exchange.asmx"
$ewsexturl = "https://" + "$externalhostname" + "/EWS/Exchange.asmx"
$easinturl = "https://" + "$internalhostname" + "/Microsoft-Server-ActiveSync"
$easexturl = "https://" + "$externalhostname" + "/Microsoft-Server-ActiveSync"
$oabinturl = "https://" + "$internalhostname" + "/OAB"
$oabexturl = "https://" + "$externalhostname" + "/OAB"
$mapiinturl = "https://" + "$internalhostname" + "/mapi"
$mapiexturl = "https://" + "$externalhostname" + "/mapi"
$aduri = "https://" + "$autodiscoverhostname" + "/Autodiscover/Autodiscover.xml"
 
Get-OwaVirtualDirectory -Server $servername | Set-OwaVirtualDirectory -internalurl $owainturl -externalurl $owaexturl
Get-EcpVirtualDirectory -server $servername | Set-EcpVirtualDirectory -internalurl $ecpinturl -externalurl $ecpexturl
Get-WebServicesVirtualDirectory -server $servername | Set-WebServicesVirtualDirectory -internalurl $ewsinturl -externalurl $ewsexturl
Get-ActiveSyncVirtualDirectory -Server $servername  | Set-ActiveSyncVirtualDirectory -internalurl $easinturl -externalurl $easexturl
Get-OabVirtualDirectory -Server $servername | Set-OabVirtualDirectory -internalurl $oabinturl -externalurl $oabexturl
Get-MapiVirtualDirectory -Server $servername | Set-MapiVirtualDirectory -externalurl $mapiexturl -internalurl $mapiinturl
Get-OutlookAnywhere -Server $servername | Set-OutlookAnywhere -externalhostname $externalhostname -internalhostname $internalhostname -ExternalClientsRequireSsl:$true -InternalClientsRequireSsl:$true -ExternalClientAuthenticationMethod 'Negotiate'
Get-ClientAccessService $servername | Set-ClientAccessService -AutoDiscoverServiceInternalUri $aduri

Die beiden Exchange Server sollten somit Coexistent laufen!
Jenachdem wo die Mailbox eines Benutzers ist, wird dieser auf den richtigen Exchange umgeleitet

Systempostfächer-Migration

(Ab Exchange 2013)

Get-Mailbox –Arbitration
Get-Mailbox -Arbitration | New-MoveRequest -TargetDatabase EXCHXXDB


Get-Mailbox -AuditLog
Get-Mailbox -AuditLog | New-MoveRequest -TargetDatabase EXCHXXDB

Um den Status zu sehen:

Get-MoveRequest | Get-MoveRequestStatistics
Sind alle auf Complete, MUSS der Move-Request gelöscht werden:

Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest

Public Folders

Je nach Exchange Version des alten Servers ist es einfacher oder bisschen schwerer

(Bis und mit Exchange 2010)
http://techgenix.com/migrating-public-folders-exchange-2013-part1/
Um zu sehen, ob was im Public Folder ist:
Get-PublicFolder –server SERVERNAME -Recurse |Get-PublicFolderStatistics |ft Name, ItemCount, FolderPath
(Ab Exchange 2013)
Get-Mailbox –Server ALTEREXCHANGE –PublicFolder

New-MoveRequest PublicFolders1 -TargetDatabase
EXCHXXDB
Um den Status zu sehen:

Get-MoveRequest | Get-MoveRequestStatistics
Sind alle auf Complete, MUSS der Move-Request gelöscht werden:

Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest

Postfächer Migrieren

Achtung: Sollten grosse Mengen an Daten verschoben werden, muss genug Platz auf dem neuen Server sein für die Transaktionsprotokolle! Ausser die Umlaufprotokollierung wurde aktiviert

Exchange Admin Center
Empfänger -> Migration
Neuen Batch -> move to a different database
Wählt die-Benutzer aus, wählt die neue Datenbank des neuen Exchanges aus
Anmerkung: Migriert den Admin-Benutzer noch nicht, bis Public folders bei älteren Servern komplett gelöscht sind

Unter erweitert, setzt die Fehlerhaften Elemente auf ca. 100
Der Batch kann automatisch starten und automatisch abschliessen
Nach Abschluss des Batches, diesen löschen

Command für Detailierter Statusbericht:


Get-MoveRequest -resultsize unlimited | Where-Object {$_.status -notlike “null”} | Get-MoveRequestStatistics | select DisplayName, StatusDetail, TotalMailboxSize, BytesTransferred, *Percent* | ft -auto
 
Sollte es zu Fehlern kommen bei einem Postfach:

BadItemLimit hochschrauben, und Datenverlust akzeptieren:
Get-MoveRequest | ?{$_.DisplayName -eq “
IDENTITY“} | Set-MoveRequest -BadItemLimit 2000 -AcceptLargeDataLoss

Erneut starten:
Get-MoveRequest | ?{$_.DisplayName -eq “
IDENTITY“} | Resume-MoveRequest

Log auslesen:
Get-MoveRequestStatistics -Identity "IDENTITY" -IncludeReport | FL | Out-File LOG.txt

ggf. ist das Postfachlimit einfach zu klein, genaueres zeigt das Log

Fertige löschen:

Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest

 
AD Objekte Upgraden
Nachdem alle Mailboxen umgezogen sind, müssen wir div. Einträge noch Updaten:
Exchange Powershell auf dem neuen Server:
Get-EmailAddressPolicy | Set-EmailAddressPolicy
Get-GlobalAddressList | Set-GlobalAddressList
Get-AddressList | Set-AddressList
Get-DistributionGroup | Set-DistributionGroup

CompanyWeb Connector (Nur wenn alter SBS war):





set-transportserver –identity <DestinationServerName> -RootDropDirectorypath C:\inetpub\mailroot

get-transportserver | fl

Sicherstellen, das RootDropDirectorypath gesetzt ist

set-ForeignConnector –identity “Windows SBS Company Web Connector <SourceServerName>” -SourceTransportServers <DestinationServerName> 

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-essentials-sbs/cc974290(v=ws.10)?redirectedfrom=MSDN

Alter Exchange DeInstallieren

Vorbereitungen

Legacy DNS Einträge löschen (Coexistenz szenario)
Im DNS Manager, sowie auch extern falls erstellt, die DNS legacy Einträge löschen
Connectoren entfernen
Auf dem alten Server

Exchange Management Console
Organisation Configuration -> Transport -> Send Connectors
Sendeconnectoren löschen
Server Configuration -> Transport -> Receive Connectors
Alle Nicht-Standard Connectoren löschen
 
Offline Adress Book entfernen
Auf dem alten Server
Exchange Management Console
Organisation Configuration -> Mailbox -> Offline Adress Book
Achtung: Löscht nur den mit dem alten Exchange Server name

Get-OfflineAddressBook
Remove-OfflineAddressBook -Identity "Default Offline Address Book"

Public Folder entfernen (Nur Exchange 2007 / 2010):

WICHTIG: Dieser Schritt ist NUR bei Exchange 2007 / 2010 nötig

Get-PublicFolder "\" -Recurse | Remove-PublicFolder -Confirm:$False -ErrorAction:SilentlyContinue -Server <ServerName2007/2010>
Get-PublicFolder "\NON_IPM_SUBTREE" -Recurse | Remove-PublicFolder -Confirm:$False -ErrorAction:SilentlyContinue -Server <ServerName2007/2010>
Public Folder Datenbank entfernen:
Get-PublicFolderDatabase -Server <ServerName2007/2010> | Remove-PublicFolderDatabase
Sollte es nicht klappen:
Get-PublicFolder -Server ServerName2007/2010 "\Non_Ipm_Subtree" -Recurse -ResultSize:Unlimited | Remove-PublicFolder -Server ServerName2007/2010-Recurse  -ErrorAction:SilentlyContinue
Get-PublicFolder -Server ServerName2007/2010"\" -Recurse -ResultSize:Unlimited | Remove-PublicFolder -Server ServerName2007/2010-Recurse  -ErrorAction:SilentlyContinue
Get-OrganizationConfig | Set-OrganizationConfig -PublicFolderMigrationComplete $True
Danach via GUI Löschen, sollte gehen ohne ADSI Edit

Datenbanken Entfernen (Exchange 2007 / 2010)

WICHTIG: Dieser Schritt ist NUR bei Exchange 2007 / 2010 nötig
Zuerst müssen wir sicherstellen, dass keine Mailboxen mehr vorhanden sind:

Ggf. muss der Administrator erst noch migriert werden!
Get-Mailbox -Server <ALTER SERVER>

WICHTIG: Benutzer nur DEAKTIVIEREN nicht löschen, sonst löscht Ihr den Benutzer KOMPLETT aus dem AD RAUS!!
 
 
 
Liste der Datenbanken:
Get-MailboxDatabase –Server <ServerName2007>
 
Mailboxed deaktivieren
Get-MailboxDatabase „Mailbox Database“ | Get-Mailbox | Disable-Mailbox
 
Löschen der Datenbanken:
Get-MailboxDatabase –Server <ServerName> | Remove-MailboxDatabase
 
Löschen der Storage Gruppen:
Eine Liste erhalten:
Get-StorageGroup
Löschen mit diesem Befehl:
Get-StorageGroup | Remove-StorageGroup

Exchange Server DeInstallation

Den alten Exchange einfach via Systemsteuerung Programme DeInstallieren. Ich empfehle ihn erst mal ein paar Tage abzuschalten vor der DeInstallation
Einfach alle Häkchen rausnehmen
Sollte nichts weiteres auf dem alten Server laufen, diese aus der Domäne nehmen und für immer ausschalten

Meldungen bei DeInstallation

Meldung: "Diese Postfachdatenbank enthält mindestens ein Postfach, einen Postfachplan, ein Archivpostfach oder...."

Get-Mailbox -Database <Database ID>
Get-MailboxPlan

Get-Mailbox -Database <Database ID> -Archive
Disable-Mailbox <Mailbox ID> -Archive

Get-Mailbox -Database <Database ID> -Arbitration | fl ExchangeGuid
Disable-Mailbox <Mailbox ID> -Arbitration -DisableLastArbitrationMailboxAllowed

Get-Mailbox -Database <Database ID> -Auditlog
Get-Mailbox -AuditLog | Disable-Mailbox
 
SMTP-Dienst ist auf diesem Computer installiert
-> SMTP-Server unter Features im Server Manager deinstallieren
Quell-Transport-Server für Connectoren
-> Auf den Sendeconnectoren, den Server rausnehmen
·         Dieser Computer ist für das Erweitern der Migliedschaft von Verteilergruppe
-> Folgende Exchange Powershells ausführen:
get-distributiongroup -resultsize unlimited |  ft name,expansionserver
get-dynamicdistributiongroup -resultsize unlimited |  ft name,expansionserver
get-distributiongroup -resultsize unlimited | set-distributiongroup -expansionserver $null
get-dynamicdistributiongroup -resultsize unlimited | set-dynamicdistributiongroup -expansionserver $null

Arbitration Mailboxes
Get-Mailbox -Database „Mailbox Database“ -Arbitration  |fl
Disable-Mailbox „NAME“ -Arbitration -DisableLastArbitrationMailboxAllowed
Disable-Mailbox „NAME“ -Arbitration -DisableLastArbitrationMailboxAllowed
Disable-Mailbox „NAME“ -Arbitration -DisableLastArbitrationMailboxAllowed

MSFTE.MSI nicht gefunden:

Registry: HKLM\Software\Microsoft\Exchange\VX\ den "Watermark" Schlüssel löschen, in jeder Rolle (vorher ein export zur sicherheit!)

oder die "Microsoft Full Text Indexing Search Engine" deinstallieren mit CMD
MsiExec.exe /X {6574fdc2-40fc-405a-9554-22d1ce15686b}

Umlaufprotokollierung wieder deaktivieren

Server -> Datenbanken

Wartung: Umlaufprotokollierung
Hier wieder deaktivieren

Datenbank Aus- und Einbinden
Die Datenbank für das übernehmen der Einstellungen Aus- und wieder Einbinden

AntiSpam Einstellunge

Gemäss dieser Anleitung, Blacklistenchecks etc. setzen
http://blog.thunderbyte.ch/2017/08/exchange-exchange-2013-antispam-ip.html

Grundlage der Anleitung

Keine Kommentare:

Kommentar veröffentlichen