Exchange 2013 – Update von CU1 scheitert wegen KB2874216

Ich musste einen Exchange 2013 mit installierten CU1 updaten – bekamm aber folgende Fehlermeldung:

Das Produkt mit dem Code 4934d1ea-be46-48b1-8847-f1af20e892c1 kann nicht entfernt werden. Schwerwiegender Fehler bei der Installation. Fehlercode: 1603. Letzter vom MSI-Paket ausgegebener Fehler: ‚Unable to install because a previous Interim Update for Exchange Server 2013 Cumulative Update 1 has been installed. Please use Add/Remove Programs to uninstall the Interim Update before running this setup again.‘.

Durch den installierten KB2874216 wird das Update blockiert.

Eine Entfernung bzw. Deinstallation des Updates war bei mir nicht erfolgreich bzw. lies es sich einfach nicht entfernen.

Als Workaround habe ich in der Registry den Schlüssel

HKLM\Software\Microsoft\ExchangeServer\V15\Setup\Interim Update

gelöscht.

Danach den Server rebooten – das Setup neu starten – geht 🙂

Quelle: https://anotherexchangeblog.wordpress.com/tag/kb2874216/

Exchange: Bestimmte Anzahl an MoveRequest

Ich hatte den Anwendungsfall, dass ich bei einer Exchange-Migration nur immer eine bestimmte Anzahl von Postfächern umziehen konnte.

Dieses Problem lässt sich wunderbar per Powershell lösen:

$a= get-mailbox -server NameDesExchangeServer | Select-Object name -First 100

foreach ($b in $a) {New-moverequest -Identity $b.name}

Kurze Erklärung: In der ersten Zeile schreibe ich die ersten 100 Zeilen der Ausgabe von get-mailbox in eine Variable.

In der zweiten Zeile übergebe ich den Postfachnamen in ein new-moverequest – und mache dies für jede Zeile.

Und schon hat man – in meinem Fall – 100 MoveRequest 🙂

Natürlich kann man hier noch bei get-mailbox oder new-moverequest noch weitere Parameter und Optionen übergeben

Quelle: TechNet

Exchange Server: Getrennte Postfächer anzeigen

Wenn auf einem Exchange ein Postfach deaktiviert oder gelöscht wird, werden diese nicht gleich als getrennte Postfächer angezeigt.
Entweder man wartet auf den internen Wartungsplan oder man startet die Erkennung der getrennten Mailboxen selber – ganz einfach mittels Shell 🙂

Unter Exchange 2007 und 2010:

Für alle Datenbanken:
Get-MailboxDatabase | Clean-MailboxDatabase

Für eine spezifische Datenbank:
Clean-MailboxDatabase Datenbankname

Unter Exchange 2013, 2016 und 2019

Für alle Datenbanken:
Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisconnectReason -ne $null } | ForEach { Update-StoreMailboxState -Database $_.Database -Identity $_.MailboxGuid -Confirm:$False}

Für eine spezifische Datenbank
Get-MailboxStatistics -Database Datenbankname | ForEach {Update-StoreMailboxState -Database $_.Database -Identity $_.MailboxGuid -Confirm:$False}

Jetzt muss man je nach Datenbankgröße in bisschen warten bis der Vorgang erledigt ist…

Dann kann man mit

get-mailboxdatabase | get-mailboxstatistics | Where{ $_.DisconnectDate -ne $null } |fl displayName,Identity,disconnectdate,database

sich alle getrennten und gelöschten Postfächer anzeigen lassen 🙂

Quelle: docs.microsoft.com und docs.microsoft.com

Sophos XG: ActiveSync veröffentlichen

Da bei uns immer mehr die Sophos XG verwendet wird gibt jetzt hier eine kleine Anleitung wie man ActiveSync veröffentlicht 🙂

1) Zertifikat installieren

Zuerst müssen wir das Zertifikat für die externe Domäne (hier als Beispiel test.friedlandreas.net) installieren. Man kann das Zertifikat in verschieden Formaten importieren – am einfachsten gehts es meiner Meinung nach per PFX:

Dann sollte es hier auftauchen

2) Webserver erstellen

Jetzt muss der Exchange-Server als WebServer angelegt werden.

Zuerst legen wir einen Host an

Danach können wir den WebServer anlegen

Unter Host wird unser neu angelegter Exchange-Host angebenden und der Typ auf HTTPS umgestellt und das Zertifikat angegeben.

In der Übersicht sollte es dann so aussehen:

3) Firewall-Regel erstellen

Jetzt kann die eigentlich Veröffentlichung konfiguriert werden.

Wir wählen hier das als Anwendugnsvorlage Exchange General und stellen den WAN-Port (bei mir hier der Port2) und das Zertifikat ein

Weiter unten unter „Geschützer Server“ entfernen wir jetzt alle nicht benötigten Einträge und lassen nur Microsoft-Server-ActiveSync stehen und editieren den Eintrag

Wir fügen hier unseren Exchange hinzu und entfernen die Authentifizierung


Unter Ausnahmen entfernen wir alles unnötige und editieren den Eintrag

Hier entfernen wir auch alles unnötige und passen die Pfade auf /Microsoft-Server-ActiveSync?* und /Microsoft-Server-ActiveSync/* an


Danach sollte es so aussehen

Unter „Erweitert“ sollte es so aussehen und dann können wir auch schon speichern 🙂

Jetzt sieht es in der Firewall so aus:

Jetzt sind wir fertig und es sollte alles funktionieren 🙂

Kurze Anmerkung zum Microsoft Remove Connecitvity Analycer : In der Standardeinstellung des Sophos XG klappt der Test nicht – er wirft einen Fehler das er sich nicht verbinden kann.

Das liegt daran das die Sophos standardmäßig ihre WebServer nur mit TLS 1.1 oder höher veröffentlicht – der Connectivity Analycer aber nur mit TLS 1.0 funktioniert.

Dies kann unter General Setting unter WebServer konfiguriert werden:

Ich lasse aber TLS 1.1 eingestellt – mit Clients hatte ich nie Probleme. Ich stelle zum testen der Verbindung kurz um – und wenn der Analyzer glücklich ist und mir ein grünes Häkchen bringt stelle ich wieder um 🙂

Exchange: Mailboxen in PST exportieren

Manchmal will man entweder eine einzelne Mailbox oder alle Mailboxen auf einem Exchange in eine PST-Datei exportieren – das geht natürlich wunderbar einfach über die Powershell 😉

Zuerst muss man dem User mit dem man die PSTs exportieren will – z.B. dem Administrator – überhaupt das Recht zum Exportieren geben:

New-ManagementRoleAssignment -Role "Mailbox Import Export" -User Administrator

Danach bitte die Powershell-Konsole schließen und eine neue aufmachen.

Einzelne Mailbox exportieren

Eine einzelne Mailbox kann mit

New-MailboxExportRequest -Mailbox user -FilePath \\server\freigabe\user.pst

exportiert werden – hier mit dem Beispiel Administrator

New-MailboxExportRequest -Mailbox Administrator -FilePath \\localhost\c$\pst\administrator.pst

Alle Mailboxen exportieren

Will man alle Mailboxen exportieren geht das mit

get-mailbox | foreach {New-MailboxExportRequest -Mailbox $_.Alias -FilePath "\\server\freigabe\$_.pst"}

Hier mein Beispiel:

get-mailbox | foreach {New-MailboxExportRequest -Mailbox $_.Alias -FilePath "\\localhost\c$\pst\$_.pst"}

Das Ergebnis sieht dann so aus:

Status anzeigen

Die Fortschritte bzw. den Status des Exports kann man sich mit

Get-MailboxExportRequest

anzeigen lassen.

Aufräumen

Um alle Export-Request am Exchange am Ende wieder zu löschen kann man das mit

Get-MailboxExportRequest | Remove-MailboxExportRequest

die PST-Dateien bleiben natürlich 😉

Quelle: www.itnator.net

Exchange: Mailbox erstellen für alle User einer Organisationseinheit

Wenn man mal für alle User einer Organisationseinheit eine Exchange-Mailbox erstellen will geht das super einfach per Powershell:

Get-User -OrganizationalUnit „OU=Finanzverwaltung,OU=Abteilungen,DC=test,DC=local“ | Enable-Mailbox

Kurze Erklärung: Mit Get-User zeigen wir uns alle Benutzer in der angegebenen OU an (muss im LDAP-Pfad-Format bzw. als DistinguishedName angegeben sein) und dann pipen wir es in ein Enable-Mailbox wo eben die Mailbox erstellt wird. fertig 🙂

Exchange: Move-Request für alle Maiboxen einer Organisationseinheit

Bei Exchange-Migrationen verschiebe ich die Mailboxen der User eigentlich immer per Exchange Powershell mit dem Move-Request-Befehl.

Bei größeren Umgebungen verschiebe ich die Mailboxen gerne per Organisationseinheiten (OU). Im Active Directory sind die Benutzer eh hoffentlich schon in sinnvollen OUs strukturiert – Finanzabteilung, IT, etc. – und so kann ich hier einfach auf diese Struktur zurückgreifen.

Das geht ganz einfach über die Exchange Powershell:

Get-Mailbox -OrganizationalUnit "OU=Finanzabteilung,OU=Users,DC=Domain,DC=local" | New-MoveRequest -TargetDatabase "ExchangeDB01"

Kurze Erklärung: Mit Get-Mailbox zeigen wir uns alle Mailboxen in der angegebenen OU an (muss im LDAP-Pfad-Format bzw. als DistinguishedName angegeben sein) und dann pipen wir es in ein New-MoveRequest mit angegebener Datenbank.

Fertig 🙂

Übrigens: Den LDAP-Pfad bzw. den DistinguishedName bekommt man am einfachsten über das Active Directory-Benutzer und Computer-MMC:

Unter Ansicht die erweiterten Features aktivieren

In den Eigenschaften der OU auf Attribut-Editor gehen und dort den Wert distinguishedName mittels Ansicht anzeigen lassen – von dort kann man ihn einfach kopieren

Exchange 2013 und 2016: Mails bleiben in Entwürfe hängen

Es gibt manchmal mal das Problem unter Exchange Server 2013 und 2016 dass Emails nicht versendet werden und in Entwürfe (Drafts) bzw. manchmal auch in Postausgang hängen bleiben.

Das Problem tritt sowohl in Outlook als auch in der Outlook Web App (OWA) auf.

Der Grund war bei mir bisher immer eine fehlerhafte DNS-Konfiguration des Exchanges!

Vor allem bei mehreren Netzwerkkarten oder bei mehreren DNS-Servern kann hier die Automatik versagen.

Einzustellen ist das am einfachsten in der ECP:

Hier stehen die DNS-Lookups (intern und extern) standardmäßig auf „Alle Netzwerkkarten“:

Hier kann die richtige Netzwerkkarte ausgewählt werden – oder auch ein DNS-Server manuell eingetragen werden:

Danach sollte das Problem gelöst sein 🙂

Quelle: thoughtsofanidlemind.com

Outlook für Mac: Ändern des Servernames über AutoDiscover deaktivieren

Verbindet man Outlook für Mac von extern mit einem Exchange wird über den AutoDiscover-Mechanismus der Servername automatisch konfiguriert – bzw. geändert.

Problematisch ist es aber wenn hier der lokale Name des Exchange-Servers eingetragen wird – und somit keine Verbindung mehr zustande kommt.

Dieses Verhalten von Outlook kann man aber deaktiveren:

1) Outlook öffnen

2) AppleScript Editor öffnen (Script Editor.app in Programme/Dienstprogramme)

3) folgendes Script ausführen

tell application "Microsoft Outlook"
set background autodiscover of every exchange account to false
end tell

Danach den Servernamen im Outlook nochmal auf den externen Namen setzten – jetzt sollte der Servername nicht mehr geändert werden und die Verbindung funktionieren!

NGINX: ReverseProxy für MAPI over HTTP, EAS und OWA

Ich habe ja mal hier beschrieben wie man einen NGNIX-ReverseProxy für EAS (Exchange ActiveSync) und OWA (OutlookWebApp) konfiguriert.

Mit Exchange 2013 wurde MAPI over HTTP eingeführt und spätestens mit Exchange 2016 wird dieses Protokoll für die Verbindung mit Outlook verwendet. Mit wenig Aufwand kann man jetzt den NGINX auch dafür verwenden um externe Outlooks anzubinden – egal ob Outlook 2010, 2013 und auch das neue Outlook 2016.

Damit das sauber – auch über Autodiscover (wichtig für Outlook 2016) – funktioniert sind folgende Vorarbeiten zu beachten:

1) Autodiscover konfigurieren

Ich empfehle die URLs der Virtuellen Verzeichnisse und von Autodiscover auf einen DNS-Namen zu setzten der intern und extern auflösbar ist – z.B. outlook.domain.de und autodiscover.domain.de.

Die URLs am Exchange kann man folgendermaßen am Exchange über die Exchange Management Shell konfigurieren:

Set-OWAVirtualDirectory –Identity „OWA (default web site)“ -ExternalURL „https://outlook.domain.de/OWA“
Set-OWAVirtualDirectory –Identity „OWA (default web site)“ -InternalURL „https://outlook.domain.de/OWA“

Set-OABVirtualDirectory –Identity „OAB (default web site)“ -ExternalURL „https://outlook.domain.de/OAB“
Set-OABVirtualDirectory –Identity „OAB (default web site)“ -InternalURL „https://outlook.domain.de/OAB“

Set-ECPVirtualDirectory –Identity „ECP (default web site)“ -ExternalURL „https://outlook.domain.de/ECP“
Set-ECPVirtualDirectory –Identity „ECP (default web site)“ -InternalURL „https://outlook.domain.de/ECP“

Set-WebServicesVirtualDirectory –Identity „EWS (default web site)“ -ExternalUrl „https://outlook.domain.de/ews/exchange.asmx“
Set-WebServicesVirtualDirectory –Identity „EWS (default web site)“ -InternalUrl „https://outlook.domain.de/ews/exchange.asmx“

Set-ActiveSyncVirtualDirectory –Identity „Microsoft-Server-ActiveSync (default web site)“ -ExternalURL „https://outlook.domain.de/Microsoft-Server-ActiveSync“
Set-ActiveSyncVirtualDirectory –Identity „Microsoft-Server-ActiveSync (default web site)“ -InternalURL https://outlook.domain.de/Microsoft-Server-ActiveSync

Set-ClientAccessServer -AutoDiscoverServiceInternalUri „https://autodiscover.domain.de/Autodiscover/Autodiscover.xml“

Im Zertifikat des Exchanges müssen natürlich auch diese beiden DNS-Namen stehen – in diesem Beispiel also outlook.domain.de und autodiscover.domain.de.

Im internen DNS und im externen DNS müssen die beiden DNS-Namen strong>outlook.domain.de und autodiscover.domain.de eingetragen werden – im internen DNS direkt auf euren Exchange-Server und im externen auf die öffentliche IP des ReverseProxys.

2) IIS am Exchange konfigurieren

Damit über den ReverseProxy z.B. auch der Abwesenheitsassistent (Out of Office) und die E-Mail-Infos funktionieren, muss am IIS des Exchanges im EWS und im MAPI die Standardauthentifizierung aktiviert werden:

EWS-Standardauth-aktivieren

3) NGINX-Konfig

Die Grundinstallation ist ja schon hier beschreiben.

Für mein Beispiel muss das Zertifikat für den NGINX muss outlook.domain.de und autodiscover.domain.de enthalten. Der interne Exchange ist hier im Beispiel der exch2016.test.local.

Hier ist dann die Konfig für den ReverseProxy:


#Abschnitt 1
server {
        listen       80;
        server_name outlook.domain.de autodiscover.domain.de;

        # Redirect any HTTP request to HTTPS
        return 301 https://$server_name$request_uri;

        error_log  /var/log/nginx/exchange-error.log;
        access_log /var/log/nginx/exchange-access.log;
}

#Abschnitt 2
server {
        listen       443;
        server_name outlook.domain.de autodiscover.domain.de;

        # Enable SSL
        ssl                     on;
        ssl_certificate         /etc/nginx/certs/cert.crt;
        ssl_certificate_key     /etc/nginx/certs/cert.key;
        ssl_session_timeout     5m;

        # Set global proxy settings
        proxy_read_timeout      360;

        proxy_http_version 1.1;
        proxy_pass_request_headers on;

        proxy_pass_header       Date;
        proxy_pass_header       Server;

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Accept-Encoding "";

        more_set_input_headers 'Authorization: $http_authorization';
        proxy_set_header Accept-Encoding "";
        more_set_headers -s 401 'WWW-Authenticate: Basic realm="exch2016.test.local"';

        location /owa           { proxy_pass https://exch2016.test.local/owa; }
        location /OWA           { proxy_pass https://exch2016.test.local/owa; }        
        location /EWS          { proxy_pass https://exch2016.test.local/EWS; }
        location /ews          { proxy_pass https://exch2016.test.local/EWS; }        
        location /Microsoft-Server-ActiveSync { proxy_pass https://exch2016.test.local/Microsoft-Server-ActiveSync; }
        location /mapi           { proxy_pass https://exch2016.test.local/mapi; }
        location /MAPI          { proxy_pass https://exch2016.test.local/mapi; }        
        location /rpc           { proxy_pass https://exch2016.test.local/Rpc; }
        location /RPC           { proxy_pass https://exch2016.test.local/Rpc; }        
        location /oab            { proxy_pass https://exch2016.test.local/OAB; }
        location /OAB            { proxy_pass https://exch2016.test.local/OAB; }        
        location /autodiscover           { proxy_pass https://exch2016.test.local/Autodiscover; }
        location /Autodiscover           { proxy_pass https://exch2016.test.local/Autodiscover; }

        error_log /var/log/nginx/exchange-ssl-error.log;
        access_log /var/log/nginx/exchange-ssl-access.log;
}

Damit hab ich ein Outlook 2016 an einen Exchange 2016 angebunden. Alles funktioniert – auch der Abwesenheitsassistent 🙂

Hilfreiche Quellen:
FrankysWeb
blog.kempkens.io