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

Exchange: Umlaute werden in Abwesenheitsnachricht nicht richtig angezeigt

Ich hatte bei einem Exchange 2013 das Problem, dass Umlaute in Abwesenheitsnachrichten (Out of Office) bzw. Automatischen Antworten nicht dargestellt wurden – diese wurden mit einem ? ersetzt. Das sah dann so aus:

OOFUmlaute

Ich habe das Problem damit behoben, dass ich den ContentType der RemoteDomain auf dem Exchange von MimeText auf MimeHTMLText mittels der Exchange Management Shell umgestellt habe:

get-remotedomain | set-remotedomain -ContentType MimeHtmlText

Danach waren alle Umlaute in den Automatischen Antworten und Abwesenheitsnotizen (OOF halt 😉 ) wieder richtig

OOFUmlauteOOF

Quelle: TechNET

Exchange 2013 CU11: Server nicht verfügbar in der Powershell

Nach der Installation von Exchange 2013 CU11 hatte ich das Problem, dass z.B. bei der Powershell-Abfrage Get-ExchangeServer nur noch alle alten Server mit Exchange 2010 angezeigt werden. Auch Server mit Exchange 2013 die noch keinen CU11 installiert hatten wurden nicht mehr angezeigt. Somit war die Exchange-Verwaltungsshell ziemlich nutzlos….

In der ECP (Exchange Administrative Center) auf dem Exchange 2013 mit CU11 jedoch wurden alle Server richtig angezeigt und man konnte auch Einstellungen, etc bearbeiten und auch ändern.

Um das Problem zu beheben und wieder muss folgendes ausgeführt werden:

1) Im Exchange Administrative Center das Postfach des Administrators auf den neuen Exchange 2013 CU11 verschieben

2) Auf dem Exchange 2013 CU11 in der Regisry unter HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ WSMAN\Client\ConnectionCookies die Einträge löschen (falls dort welche vorhanden sind)

Danach geht wieder alles in der Exchange-Verwaltungsshell 🙂

Quelle: TechNet

ActiveDirectory Rechte-Vererbung mittels Powershell einschalten

Die Rechte-Vererbung im ActiveDirectory ist manchmal bei bestimmten Benutzern deaktiviert – selten ist das gewollt – fast immer gibt es aber deswegen (vor allem in Verbindung mit Exchange) Probleme.

Einige Beispiele:

– ExchangeSynchronisationsfehler 86000C0A bei betroffenen Benutzern, obwohl OWA korrekt funktioniert

– Dateisystems-Auflistung im Explorer schlängt mit 0x86000Cxx Fehlern fehl

Fehler im Ereignisprotokoll von MSExchange ActiveSync mit dem Inhalt „Active directory Antwort: 00000005: SecErr: DSID-031521D0, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0″.“

Exchange: das Verschieben der Mailbox der Benutzer (z.B. bei Exchange-Migrationen) schlägt fehl

Bei einem Benutzer kann man die Vererbung wie hier beschrieben ja manuell aktivieren – bei vielen Usern ist da ein automatisierter Weg zu empfehlen….

Das kann man ganz einfach mit der Powershell erledigen! Einfach die PowerShell ISE als Administrator ausführen und folgendes Script ausführen:

Import-Module activedirectory
$OU = "OU=INDIESEROUWERDENUSERGESUCHT,DC=MEINDOMAENE,DC=TLD"
$Users=get-aduser -Filter * -SearchBase $OU

if ($Users -ne $null) 
{

    foreach ($Entry in $Users) 
    {
    [string]$dn = (Get-ADUser $Entry).DistinguishedName
    $user = [ADSI]”LDAP://$dn”
    $acl = $user.objectSecurity
    Write-Host "Pruefe Benutzer:" (Get-ADUser $Entry).SamAccountName

        if ($acl.AreAccessRulesProtected)
        {
        Write-Host "Fixe Benutzer:" (Get-ADUser $Entry).SamAccountName
        $acl.SetAccessRuleProtection($false,$true)
        $inherited = $acl.AreAccessRulesProtected
        $user.commitchanges()
        }
    }

}

else 
{
    Write-Host "Keine Benutzer in $OU gefunden"
}

In der Zeile $OU = „OU=INDIESEROUWERDENUSERGESUCHT,DC=MEINDOMAENE,DC=TLD“ einfach die ensprechende OU angeben und alle Benutzer – auch in Unter-OUs – werden angepasst 🙂

Quelle: ugg.li

Outlook 2013 meldet ständig „Der Microsoft Exchange Administrator hat eine Änderung durchgeführt, die einen Neustart von Outlook erfordert“

Ich hatte den Fall, dass ein Kunden mit Exchange Server 2013 und Outlook 2013 darüber geklagt hat, dass immer wieder im Outlook die Meldung kommt „Der Microsoft Exchange Administrator hat eine Änderung durchgeführt, die einen Neustart von Outlook erfordert“.

Das kommt von einem falschen Eintrag der Exchange-Datenbank im Active-Directory.

Mit dem ADSI Edit (adsiedit.msc) macht man folgendes:

Configuration >> CN=Services >> CN=Microsoft Exchange >> CN=OrganisatonsNname >> CN=Administrative Groups >> CN=Exchange Administrative Group >> CN=Databases

dort auf der Datenbank bzw. den Datenbanken das Attribut MSEXCHHomePublicMDB überprüfen. Vor allem nach Migrationen verweist es noch auf falsche oder nicht mehr Vorhandene Datenbanken. Diesen Wert dann einfach leeren.

Falls der Wert schon auf nicht gesetzt steht – also leer ist – kann man auch einfach eine leere PublicFolder-Datenbank anlegen.

Spätestens jetzt sollte Outlook ohne die Meldung seinen Dienst tun.

Quelle: TechNet