Exchange Health Checker Empfehlungen per Script umsetzen

Der Exchange Health Checker ist ein hervorragendes Tool um sich schnell einen Überblick über den Status der Exchange Server zu verschaffen. Das von Microsoft bereitgestellte PowerShell Script wird laufend aktualisiert und kann einen Bericht im HTML Format erzeugen. Bei einer frischen Exchange 2019 Installation auf einem Windows Server 2022 sieht der Bericht beispielweise so aus:

Health Checker Bericht
Health Checker Bericht
Health Checker Bericht
Health Checker Bericht

Bericht

Wie aus dem Bericht zu erkennen ist, finden sich bei einer frischen Exchange Installation diverse Sicherheitslücken und andere Warnungen zu möglichen Optimierungen. Praktischerweise liefert der Exchange Health Checker auch gleich passende Artikel, wie man die Probleme beseitigen kann.

Auf der Grundlage dieser Artikel habe ich ein kleines Script erstellt, welches die wichtigsten Einstellungen automatisch vornimmt. So kann das Script beispielsweise die folgenden Probleme beheben:

  • Auslagerungsdatei auf 32GB festlegen
  • Stromsparfunktionen der Netzwerkkarte deaktivieren
  • Energiesparplan auf „High Performance“ setzen
  • TCP KeepAlive auf 30 min setzen
  • TLS 1.2 für SCHANNEL aktivieren
  • TLS 1.2 für .NET Framework konfigurieren
  • TLS 1.0, TLS 1.1 für SCHANNEL und .NET Framework deaktivieren
  • TLS 1.3 deaktivieren (wird aktuell nicht von Exchange 2019 unterstützt)
  • Download Domains auf Autodiscover Hostname umstellen
  • SSL Offloading für Outlook Anywhere deaktivieren
  • Windows Extended Protection Script runterladen und ausführen

Das Script fragt bei jedem Schritt, ob die Einstellungen angewendet werden sollen, dies sieht dann beispielsweise wie folgt aus:

Apply-ExchangeHealthChecker-Recommendations.ps1

Das Script ist nicht von den Health Checker Ergebnisses abhängig, sondern ich habe einfach die Empfehlungen, welche auf einem neu installierten Exchange Server auf Windows Server 2022 vom Health Checker geliefert werden in diesem Script umgesetzt. Das Script liegt auf GitHub und ich werde neue Empfehlungen des Health Checkers in das Script integrieren.

Nach dem Ausführen des Scripts „Apply-ExchangeHealthChecker-Recommendations.ps1“ sieht der Health Checker Bericht schon viel besser aus. Hier mal ein Beispiel:

Apply-ExchangeHealthChecker-Recommendations.ps1
Apply-ExchangeHealthChecker-Recommendations.ps1

Wie bereits erwähnt habe ich das Script zunächst nur auf Windows Server 2022 und Exchange 2019 getestet. Es wäre daher schön, wenn ihr mir Screenshots oder die Fehler aus euren Reports schicken könntet, damit ich das Script „Apply-ExchangeHealthChecker-Recommendations.ps1“ erweitern kann. Auf Windows Server 2019 werden sicher noch andere Fehler und Warnungen angezeigt, daher gerne zuschicken oder auch gerne direkt via GitHub mitwirken.

Hier nun der Link zum Script:

27 thoughts on “Exchange Health Checker Empfehlungen per Script umsetzen”

  1. Hallo Frank wenn ich dich/sie so ansprechen darf, ich habe mit dem Healthchecker.ps1 jetzt ein großes Problem. Ich habe es in der Management Shell als Admin gestartet und die erste Frage leider falsch beantwortet. Meine Antwort war „E: Noch nie ausgeführt“. Nun ist wohl alles bei mir gesperrt. Wenn ich nun die ManagementShell aufrufe kommt ein Fehlermeldung. …RemoteExchange.ps1 kann nicht geladen werden, da der Vorgang durch Richtlinien für die Softwareeinschränkung …. blockiert ist. Ich habe schon mehrere Tipps probiert (set-executionpolicy; Safer in der registry nachgeschaut, da sind keinerlei Einträge; unblock-file). Was kann ich denn nun noch versuchen? Ein anderer Admin-Account startet die ManagementShell ohne Probleme.

    Grüße aus Berlin

    Reply
  2. Guten Morgen,

    bei dem Versuch das Microsoft Script zur Aktivierung der Exchange Endpoint Protection auszuführen, scheitere ich auf verschiedenen Servern an folgendem

    WARNUNG: This script requires to be run inside of Exchange Management Shell. Please run on an
    Exchange Management Server or an Exchange Server with Exchange Management Shell.
    WARNUNG: If the script was already executed via Exchange Management Shell, check your Auth
    Certificate by using the following script: https://aka.ms/MonitorExchangeAuthCertificate

    Folgende Dinge wurden geprüft -> Stand CU13 mit SU 11/2023 / MonitorExchangeAuthCertificate.ps1 zeigt keinen Fehler, mit Healtchecker 24.02.15.1640 wird folgendes gemeldet

    LmCompatibilityLevel Settings: 3
    Description: Clients use only NTLMv2 authentication, and they use NTLMv2 session security if the server supports it. Domain controllers accept LM, NTLM, and NTLMv2 authentication.
    AES256-CBC Protected Content Support: True
    SMB1 Installed: False
    SMB1 Blocked: True

    Valid Internal Transport Certificate Found On Server: True
    Valid Auth Certificate Found On Server: True
    AMSI Enabled: True
    SerializedDataSigning Enabled: TrueValid Internal Transport Certificate Found On Server: True

    Nach meinen Recherchen sind alle Voraussetzungen erfüllt, das Skript wird definitiv in der EMS gestartet, natürlich ist auch das Skript von dieser Seite keine Lösung (Apply-ExchangeHealthChecker-Recommendations.ps1), da es zwar alle andern Vorgänge ausführt, aber beim aktivieren der Exchange Endpoint Protection in den gleichen Fehler läuft.

    Weiterhin habe ich eine vorhandene ClientAccessRule entfernt, jedoch keine Verbesserung.

    Vielleicht hat jemand noch eine Idee, vielen Dank schonmal,

    Grüße Torsten

    Reply
  3. Hallo zusammen,

    hat schon einmal jemand das Script mit Exchange 2026 + Windows Server 2016 laufen lassen? Wenn ja, wie war das Ergebnis?

    Danke

    Reply
  4. Hi,

    vielen Dank für die Arbeit, die du da rein steckst.
    Ich habe das Skript ausgeführt, aber er fragt mich bei jedem einzelnen Parameter, was ich festlegen möchte:

    Cmdlet Apply-ExchangeHealthChecker-Recommendations.ps1 an der Befehlspipelineposition 1
    Geben Sie Werte für die folgenden Parameter an:
    (Geben Sie !? ein, um Hilfe zu erhalten.)
    SetStaticPagefile:
    SetDisableNicPowersaving:
    SetPowerPlanToHighPerformance:
    usw.

    Mache ich hier noch etwas falsch?

    Reply
  5. Hallo,

    vielen Dank für das Script.
    Kann es sein, dass es die Pagefilesize falsch berechnet?
    Ich hatte ursprünglich 16500MB
    Nach dem Script waren es nur noch 4GB
    Das System hatte 16GB RAM
    Viele Grüße

    Reply
  6. Hallo Frank,

    erst einmal herzlichen Dank für Deine tolle Arbeit hier.

    Mir scheint ein Fehler beim Ausführen des Scipt unterlaufen zu sein.
    Seit dem erhalte ich die Meldung bei allen Componenten ähnlich ‚ServerWideOffline‘ is in Maintenance Mode.
    Auch mit „Set-ServerComponentState ERIS -Component ServerWideOffline -State Active -Requester Maintenance“ bzw. „set-ServerComponentState -Identity ERIS -Component Hubtransport“ bekomme ich meinen Exchange 2019 auf Server 2019 nicht mehr aus dem Maintenance-Mode.
    Blöderweise dachte ich, dass ich noch einen Snapshot von vor dem Script habe, diesen hatte ich aber leider bereits gelöscht.
    Was tun?

    Reply
    • Hallo Heike,

      magst du einmal die Fehlermeldungen im Forum teilen? Das Script setzt keinen Maintenance Mode daher würde ich gerne versuchen zu verstehen, woher der Fehler kommt. Meine erste Vermutung wäre das nicht genug Speicherplatz frei ist.

      Beste Grüße,

      Frank

      Reply
      • Hallo Frank,

        habe die Fehlermeldung leider nicht mehr. Speicherplatz war aber genug frei.
        So wie es aussieht, sind bei mir mehrere Dinge zusammen gekommen und haben das Problem ausgelöst.
        Mit „Set-ServerComponentState ERIS -Component ServerWideOffline -State Active -Requester Functional“ habe ich meinen Exchange-Server wieder lauffähig bekommen.
        Dein Script war auf jeden Fall nicht der Auslöser für mein Problem, ist nur danach aufgefallen.

        Reply
  7. Hallo Franky,

    bei mir kommen auch einige Fehler. Server 2019 mit Exchange 2019 …

    Gruß Stephan

    ————————————————————————
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:200 Zeichen:17
    + Sign up
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen („&“), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:205 Zeichen:209
    + … k Button–medium Button d-lg-none color-fg-inherit p-1″> <span cla …
    + ~
    Der Operator "<" ist für zukünftige Versionen reserviert.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:415 Zeichen:13
    + CI/CD & Automation
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2269 Zeichen:126
    + … js-jump-to-line-field" type="text" placeholder="Jump to line…" …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2269 Zeichen:148
    + … pe="text" placeholder="Jump to line…" aria-label="Jump to line …
    + ~~~~
    Unerwartetes Token "Jump" in Ausdruck oder Anweisung.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2311 Zeichen:153
    + … thub-terms-of-service" data-analytics-event="{"category":&q …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2311 Zeichen:160
    + … rms-of-service" data-analytics-event="{"category":"Foo …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2311 Zeichen:172
    + … ce" data-analytics-event="{"category":"Footer",&q …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2311 Zeichen:179
    + … ta-analytics-event="{"category":"Footer","ac …
    + ~
    Ausdruck fehlt nach dem unären Operator ",".
    In C:\_Tools\Skripte\HealthChecker-Recommendations\Apply-ExchangeHealthChecker-Recommendations.ps1:2311 Zeichen:179
    + … a-analytics-event="{"category":"Footer","act …
    + ~
    Unerwartetes Token "&" in Ausdruck oder Anweisung.
    Es wurden nicht alle Analysefehler berichtet. Korrigieren Sie die berichteten Fehler, und versuchen Sie es erneut.
    + CategoryInfo : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : AmpersandNotAllowed

    Reply
  8. Hallo Frank,
    vielen Dank für den Script, hat super funktiniert.
    Ich habe nur diesen Fehler:

    Extended Protection should be set to ‚None‘ on the vDir where IP filtering is enabled Extended Protection isn’t configured as expected
    CVE-2022-24516, CVE-2022-21979, CVE-2022-21980, CVE-2022-24477, CVE-2022-30134
    Extended Protection should be set to ‚None‘ on the vDir where IP filtering is enabled Extended Protection isn’t configured as expected

    3 IPs in filter list on vDir: ‚Default Web Site/ECP‘

    liegt das daran das ich „Einschränkungen für IP-Adressen und Domänennamen“ im IIS aktiviert habe?

    Reply
    • Ich habe denselben Fehler im Healthchecker Ergebnis.
      Ich habe absichtlich einen IP Filter auf das ECP Verzeichnis gesetzt, damit dieses nur von intern erreichbar ist.
      So wurde es ja auch als Empfehlung publiziert.
      Warum ist das mit der Extended Protection inkompatible?
      Wenn ich den IP Filter entferne, ist ja das ECP wieder von extern verfügbar, was ich aber nicht möchte.

      Fehlermeldung:
      CVE-2022-24516, CVE-2022-21979, CVE-2022-21980, CVE-2022-24477, CVE-2022-30134
      Extended Protection should be set to ‚None‘ on the vDir where IP filtering is enabled Extended Protection isn’t configured as expected

      2 IPs in filter list on vDir: ‚Default Web Site/ECP‘
      For more information about Extended Protection and how to configure, please read this article: https://aka.ms/HC-ExchangeEPDoc

      Reply
  9. Hi, Frank,
    erstmal vielen vielen Dank für Deine ganze Arbeit hier !!!!

    Dein Skript hat bei uns die DownloadDomains 2x hintereinander pro Hostname gesetzt, also meinetwegen
    InternalDownloadHostName: autodiscover. autodiscover.

    Das sieht nicht gesund aus.

    Viele Grüße,
    Nelson.

    Reply
  10. Hallo zusammen,

    wenn ich das Script bei mir auf einem Exchnage 2019 ausführe kommen immer folgende Fehler:

    [PS] C:\>.\Apply-ExchangeHealthChecker-Recommendations.ps1
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:196 Zeichen:17
    + Sign up
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen („&“), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:201 Zeichen:217
    + … –medium Button d-lg-none color-fg-inherit p-1 ml-auto“> <span cla …
    + ~
    Der Operator "<" ist für zukünftige Versionen reserviert.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:207 Zeichen:16
    +
    + ~
    Der Operator „<" ist für zukünftige Versionen reserviert.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:410 Zeichen:13
    + CI/CD & Automation
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:2107 Zeichen:126
    + … js-jump-to-line-field" type="text" placeholder="Jump to line…" …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:2107 Zeichen:148
    + … pe="text" placeholder="Jump to line…" aria-label="Jump to line …
    + ~~~~
    Unerwartetes Token "Jump" in Ausdruck oder Anweisung.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:2149 Zeichen:153
    + … thub-terms-of-service" data-analytics-event="{"category":&q …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:2149 Zeichen:160
    + … rms-of-service" data-analytics-event="{"category":"Foo …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:2149 Zeichen:172
    + … ce" data-analytics-event="{"category":"Footer",&q …
    + ~
    Das kaufmännische Und-Zeichen (&) ist nicht zulässig. Der &-Operator ist für eine zukünftige Verwendung reserviert.
    Verwenden Sie das kaufmännische Und-Zeichen in doppelten Anführungszeichen ("&"), um es als Teil einer Zeichenfolge zu
    übergeben.
    In C:\Apply-ExchangeHealthChecker-Recommendations.ps1:2149 Zeichen:179
    + … ta-analytics-event="{"category":"Footer","ac …
    + ~
    Ausdruck fehlt nach dem unären Operator ",".
    Es wurden nicht alle Analysefehler berichtet. Korrigieren Sie die berichteten Fehler, und versuchen Sie es erneut.
    + CategoryInfo : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : AmpersandNotAllowed

    Was mach ich hier falsch?

    Reply
  11. Hallo Frank,

    ich hätte einen Vorschlag zum Script: Ich bin eine Person welche gerne erst den aktuell gesetzten Wert sehen möchte, bevor man den Wert von einem Script akzeptiert, denn vielleicht hatte man einen Grund die Pagefile anders zu setzen oder eine andere Einstellung auf einen bestimmten Wert zu setzen, der einen aber erst einfällt wenn man den aktuell gesetzten Wert sieht.

    Daher würde ich mich freuen erst den gesetzten Wert zu sehen, bevor die Abfrage kommt, ob der von „dir“ vorgeschlagene Wert gesetzt werden soll.

    VG Tobias

    Reply
  12. Hey Franky,

    zunächst vielen vielen Dank für das Script. Die extented Securitysachen gingen so sehr schnell von der Hand.
    Was leider bei mir nicht funktioniert mit deinem Script ist die Sache mit der Downloaddomain umschreiben.

    Wir nutzen einen komplett internen Exchange der max über VPN erreichbar ist mit Outlook z.B.
    Der Nutzen der Downloaddomains (OWA is abgedreht) geht gegen 0 wenn ichs richtig verstehe, nichts desto trotz hätte ich gern diese letzte rote Meldung noch weg :/

    Security Vulnerability
    ———————-
    IIS module anomalies detected: False
    Security Vulnerability: Download Domains are configured.
    ExternalDownloadHostName: Set to the same as Internal Or External URL as OWA.
    InternalDownloadHostName: Set to the same as Internal Or External URL as OWA.
    Configuration instructions: https://aka.ms/HC-DownloadDomains

    Reply
    • Hallo Manu,
      wenn du den Fehler im Health Checker zu den Download Domains los werden willst, musst du die Download Domain entsprechend konfigurieren. Die Download Domain darf dabei nicht einer der Domains entsprechen, welche du für die Exchange vDirs benutzt. Zusätzlich muss die Domain der Download Domain auf dem Zertifikat vorhanden sein, damit es nicht zu Zertifikatswarnungen kommt. Du kannst die Befehle aus dem Script benutzen um eine eigene Download Domain zu konfigurieren.

      Beste Grüße,
      Frank

      Reply
  13. Klasse, sehr gute Arbeit, Frank!

    Getestet unter Windows Server 2016 mit Exchange 2016 CU23 ergab nur eine Auffälligkeit:
    Das Script setzte die Auslagerungsdatei fest auf 8192MB (sie stand vorher fest bei 32778MB).

    Die anderen Punkte liefen sauber durch (waren aber auch schon mit Ausnahme von Download Domains und Extended Protection passend konfiguriert). Diese letzten 2 Dinge passen nun auch.

    Reply
    • Ich sehe gerade im Changelog, dass du das geändert hattest auf 25% des physischen RAMs, statt 32GB fest. Dann läuft das Script natürlich wie erwartet…

      Reply
    • Supported Exchange Server Versions:
      The script can be used to validate the configuration of the following Exchange Server versions: – Exchange Server 2013 – Exchange Server 2016 – Exchange Server 2019

      Reply

Leave a Comment