<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Migration &#8211; abow &#8211; how do you do IT</title>
	<atom:link href="https://abow.info/tag/migration/feed/" rel="self" type="application/rss+xml" />
	<link>https://abow.info</link>
	<description>Alle möglichen Handkniffe, die ich mir so zusammentrage im Berufsalltag</description>
	<lastBuildDate>Wed, 03 Jun 2026 17:20:31 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://abow.info/wp-content/uploads/2026/06/cropped-favicon-512-32x32.png</url>
	<title>Migration &#8211; abow &#8211; how do you do IT</title>
	<link>https://abow.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WordPress // Umzug von Strato auf einen Hostinger-VPS (Docker + Traefik)</title>
		<link>https://abow.info/persoenlich/wordpress-umzug-von-strato-auf-einen-hostinger-vps-docker-traefik/</link>
					<comments>https://abow.info/persoenlich/wordpress-umzug-von-strato-auf-einen-hostinger-vps-docker-traefik/#respond</comments>
		
		<dc:creator><![CDATA[Andi Bow]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 17:14:29 +0000</pubDate>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Persönlich]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[DB_HOST]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[docker-compose]]></category>
		<category><![CDATA[Hostinger]]></category>
		<category><![CDATA[Lets Encrypt]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Named Volume]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Reverse Proxy]]></category>
		<category><![CDATA[search-replace]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Strato]]></category>
		<category><![CDATA[Traefik]]></category>
		<category><![CDATA[Umzug]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WORDPRESS_TABLE_PREFIX]]></category>
		<category><![CDATA[wp-config]]></category>
		<guid isPermaLink="false">https://abow.info/?p=499</guid>

					<description><![CDATA[Dieser Beitrag ist ein erprobtes Runbook: ein WordPress von Strato auf einen Hostinger-VPS ziehen, auf dem ein Docker-Compose-Stack (wordpress:latest + mysql:8) läuft und Traefik als Reverse Proxy im…]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dieser Beitrag ist ein <strong>erprobtes Runbook</strong>: ein WordPress von <strong>Strato</strong> auf einen <strong>Hostinger-VPS</strong> ziehen, auf dem ein <strong>Docker-Compose-Stack</strong> (<code>wordpress:latest</code> + <code>mysql:8</code>) läuft und <strong>Traefik</strong> als Reverse Proxy im <strong>Host-Mode</strong> das TLS macht. Files (Verzeichnis) und DB-Dump liegen bereits auf dem VPS. Es sind genau die Schritte – inklusive der vier, fünf Stolperfallen, an denen man garantiert hängenbleibt.<br>WordPress wurde zuvor via Hostinger VPS Catalog in einem Docker Container installiert.<br>Die Datenbank und das Verzeichnis bei Strato wurden zuvor via FileZilla heruntergeladen und via phpMyAdmin als .sql gesichert.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Die Beispielwerte (<code>wordpress-ibr4-*</code>, <code>jryy_</code>, <code>abow.info</code>, IP <code>72.61.92.170</code>) stammen aus dem realen Umzug. Passe sie an deinen Stack an.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Ziel</h2>



<p class="wp-block-paragraph">WordPress läuft im vorhandenen Docker-Stack, ist über <code>https://abow.info</code> öffentlich erreichbar, Zertifikat von Let&#8217;s Encrypt – ohne Datenverlust.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Mentales Modell (vorab verstehen, spart 2 Stunden)</h2>



<ul class="wp-block-list">
<li><strong>Named Volume:</strong> Der WP-Container mountet <code>…/&lt;volume>/_data</code> → <code>/var/www/html</code>. Deine Files müssen in <strong><code>_data</code></strong> liegen, nicht daneben. Und: <code>_data</code> <strong>niemals löschen</strong> – ein Named Volume braucht diesen Ordner, sonst startet der Container nicht.</li>



<li><strong>Die <code>wp-config.php</code> erzeugt das offizielle Image selbst</strong> – aber <strong>nur</strong>, wenn keine existiert, und zwar aus den <code>WORDPRESS_*</code>-ENV-Variablen. Eine mitgebrachte Strato-<code>wp-config.php</code> wird <strong>nicht</strong> überschrieben.</li>



<li><strong>DB-Verbindung geht über den Service-Namen</strong> (<code>db</code>), nie <code>localhost</code>/<code>rdbms.strato.de</code>.</li>



<li><strong>Traefik im Host-Mode</strong> routet <strong>nicht</strong> über das Docker-Netz, sondern über einen <strong>festen veröffentlichten Port</strong> des Containers.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 0: Stack inspizieren</h2>



<pre class="wp-block-code"><code>ssh root@DEINE_VPS_IP

docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
</code></pre>



<p class="wp-block-paragraph">Du suchst den WP- und den DB-Container (hier <code>wordpress-ibr4-wordpress-1</code> / <code>wordpress-ibr4-db-1</code>, DB-Image <code>mysql:8</code>) und den Reverse Proxy (<code>traefik-traefik-1</code>). Projektpfad und Volume finden:</p>



<pre class="wp-block-code"><code>docker inspect wordpress-ibr4-wordpress-1 \
  --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}'
# -&gt; z.B. /docker/wordpress-ibr4

docker inspect wordpress-ibr4-wordpress-1 \
  --format '{{ range .Mounts }}{{ .Name }} | {{ .Source }} -&gt; {{ .Destination }}{{ println }}{{ end }}'
# -&gt; wordpress-ibr4_wordpress | …/_data -&gt; /var/www/html
</code></pre>



<p class="wp-block-paragraph">DB-Zugangsdaten + Prefix aus den Containern (nur ansehen):</p>



<pre class="wp-block-code"><code>docker exec wordpress-ibr4-wordpress-1 env | grep -i WORDPRESS_DB
docker exec wordpress-ibr4-db-1          env | grep -iE 'MYSQL_DATABASE|MYSQL_USER'
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 1: Files an die richtige Stelle (<code>_data</code>)</h2>



<p class="wp-block-paragraph">Liegen deine Strato-Files in einem Ordner <strong>neben</strong> <code>_data</code> (z. B. <code>_app</code>), sieht WordPress sie nicht. Ist <code>_data</code> nur die nackte Standard-Installation, deine echte Seite aber in <code>_app</code>, machst du <code>_app</code> zum Live-Verzeichnis:</p>



<pre class="wp-block-code"><code>cd /var/lib/docker/volumes/wordpress-ibr4_wordpress
# Falls _data noch die Default-Files enthaelt: sichern statt loeschen
mv _app  _data

# Core vollstaendig? (muessen existieren)
ls _data/wp-admin _data/wp-includes _data/wp-load.php
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Falle:</strong> <code>_data</code> zu <strong>löschen</strong> killt den Mountpunkt → <code>Error response from daemon: open …/_data: no such file or directory</code>. Immer <strong>umbenennen</strong>, nie löschen.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 2: Alte Strato-wp-config raus, ENV-Prefix korrekt setzen</h2>



<p class="wp-block-paragraph">Die mitgebrachte <code>wp-config.php</code> zeigt noch auf Strato:</p>



<pre class="wp-block-code"><code>grep -E "table_prefix|DB_HOST|DB_NAME|DB_USER" _data/wp-config.php
# define('DB_HOST','rdbms.strato.de');  &lt;- muss weg
# $table_prefix = 'jryy_';              &lt;- Prefix merken!
</code></pre>



<p class="wp-block-paragraph"><strong>Prefix merken</strong> (hier <code>jryy_</code>) und die alte Config wegsichern, damit das Image neu generiert:</p>



<pre class="wp-block-code"><code>mv _data/wp-config.php _data/wp-config.php.strato-bak
</code></pre>



<p class="wp-block-paragraph">Jetzt den <strong>Table-Prefix in die Compose</strong> – und zwar im <code>environment:</code>-Block des <strong><code>wordpress</code></strong>-Service (nicht beim <code>db</code>-Service!). Häufigster Fehler: Zeile landet bei den <code>MYSQL_*</code>-Variablen und greift nie.</p>



<pre class="wp-block-code"><code>services:
  wordpress:
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD}
      - WORDPRESS_TABLE_PREFIX=jryy_          # &lt;- HIER, beim wordpress-Service
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 3: Container neu erzeugen und Prefix <strong>effektiv</strong> prüfen</h2>



<p class="wp-block-paragraph"><code>docker compose up -d</code> allein startet einen laufenden Container <strong>nicht</strong> neu – dann läuft der Entrypoint nicht und die <code>wp-config.php</code> wird nicht geschrieben. Daher <code>--force-recreate</code>:</p>



<pre class="wp-block-code"><code>cd /docker/wordpress-ibr4
docker compose up -d --force-recreate wordpress
</code></pre>



<p class="wp-block-paragraph">Jetzt <strong>nicht</strong> nur <code>grep</code> (das offizielle Image schreibt <code>getenv_docker('…','wp_')</code> mit Fallback). Den <strong>aufgelösten</strong> Wert prüfen:</p>



<pre class="wp-block-code"><code>docker exec wordpress-ibr4-wordpress-1 \
  php -r 'require "/var/www/html/wp-config.php"; echo DB_HOST.PHP_EOL.DB_NAME.PHP_EOL.$table_prefix.PHP_EOL;'
</code></pre>



<p class="wp-block-paragraph">Zielausgabe:</p>



<pre class="wp-block-code"><code>db
wordpress
jryy_
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Kommt <code>wp_</code> statt <code>jryy_</code>: Die ENV-Zeile steht im falschen Service-Block oder die alte <code>wp-config.php</code> existiert noch. Beides fixen, <code>--force-recreate</code> wiederholen. Effektiv-Check mit <code>docker exec … env | grep WORDPRESS_TABLE_PREFIX</code> zeigt, ob die Variable im Container überhaupt ankommt.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 4: Datenbank importieren</h2>



<p class="wp-block-paragraph"><code>docker exec -i … &lt; dump.sql</code> liest die Datei vom <strong>Host</strong> und pipet sie in den Container – der <strong>Pfad im Container ist egal</strong>, nur der Host-Pfad muss stimmen. Passwort kommt aus der Container-ENV, du tippst nichts:</p>



<pre class="wp-block-code"><code>docker exec -i wordpress-ibr4-db-1 \
  sh -c 'exec mysql -uwordpress -p"$MYSQL_PASSWORD" wordpress' \
  &lt; /var/lib/docker/volumes/wordpress-ibr4_wordpress/dbs12659889.sql
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Falle <code>ERROR 1050 … Table already exists</code>:</strong> In der DB liegen schon Tabellen (Reste der Default-Installation oder ein abgebrochener Import). Schema einmal komplett leeren, dann neu importieren:</p>



<pre class="wp-block-code"><code>docker exec wordpress-ibr4-db-1 sh -c '
  exec mysql -uwordpress -p"$MYSQL_PASSWORD" -N -e "
    SET FOREIGN_KEY_CHECKS=0; SET GROUP_CONCAT_MAX_LEN=1000000;
    SELECT IFNULL(CONCAT(\"DROP TABLE IF EXISTS \", GROUP_CONCAT(\"\`\",table_name,\"\`\"), \";\"), \"SELECT 1;\")
    FROM information_schema.tables WHERE table_schema=\"wordpress\";
  " wordpress' \
| docker exec -i wordpress-ibr4-db-1 sh -c 'exec mysql -uwordpress -p"$MYSQL_PASSWORD" wordpress'
</code></pre>



<p class="wp-block-paragraph">Danach <code>SHOW TABLES;</code> muss leer sein → Import wiederholen.</p>
</blockquote>



<p class="wp-block-paragraph">Rechte setzen und verifizieren (Prefix beachten – hier <code>jryy_</code>):</p>



<pre class="wp-block-code"><code>docker exec wordpress-ibr4-wordpress-1 chown -R www-data:www-data /var/www/html

docker exec wordpress-ibr4-db-1 \
  sh -c 'exec mysql -uwordpress -p"$MYSQL_PASSWORD" wordpress \
  -e "SELECT option_name,option_value FROM jryy_options WHERE option_name IN (\"siteurl\",\"home\");"'

docker exec wordpress-ibr4-wordpress-1 \
  php -r 'require "/var/www/html/wp-load.php"; echo "WP ".$GLOBALS&#91;"wp_version"]." | ".get_option("blogname").PHP_EOL;'
</code></pre>



<p class="wp-block-paragraph">Erwartung: deine <code>siteurl</code>/<code>home</code> und WP-Version + Blogname.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 5: URLs (nur bei Domain-/Protokollwechsel)</h2>



<p class="wp-block-paragraph">Stehen <code>siteurl</code>/<code>home</code> bereits korrekt (z. B. <code>https://abow.info</code>), ist <strong>nichts</strong> zu tun – diesen Schritt überspringen. Andernfalls <strong>serialisierungssicher</strong> mit WP-CLI ersetzen, nie per rohem SQL:</p>



<pre class="wp-block-code"><code>docker compose exec wordpress bash -c '
  curl -sO https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
  php wp-cli.phar search-replace "http://alt.tld" "https://abow.info" --all-tables --allow-root --dry-run'
</code></pre>



<p class="wp-block-paragraph">Sieht der Probelauf gut aus → <code>--dry-run</code> weglassen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 6: HTTPS hinter Traefik</h2>



<p class="wp-block-paragraph">Traefik terminiert TLS und spricht intern per HTTP mit WordPress. Ohne Hinweis baut WordPress Redirect-Loops / Mixed-Content. Per ENV in den <strong>wordpress</strong>-Service (die <code>$$</code> sind Absicht – Compose würde einfaches <code>$</code> als Variable interpretieren):</p>



<pre class="wp-block-code"><code>      - WORDPRESS_CONFIG_EXTRA=if (isset($$_SERVER&#91;'HTTP_X_FORWARDED_PROTO']) &amp;&amp; $$_SERVER&#91;'HTTP_X_FORWARDED_PROTO'] === 'https') { $$_SERVER&#91;'HTTPS'] = 'on'; }
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 7: Traefik-Routing im Host-Mode</h2>



<p class="wp-block-paragraph">Prüfen, wie Traefik tickt:</p>



<pre class="wp-block-code"><code>docker inspect traefik-traefik-1 --format '{{ json .Config.Cmd }}'
# -&gt; providers.docker=true, entrypoints web:80 / websecure:443,
#    HTTP-&gt;HTTPS-Redirect, certresolver "letsencrypt" (HTTP-Challenge)

docker inspect traefik-traefik-1 \
  --format '{{ range $n,$v := .NetworkSettings.Networks }}{{ $n }} {{ end }}'
# -&gt; host   (= Host-Mode!)
</code></pre>



<p class="wp-block-paragraph"><strong>Host-Mode-Konsequenzen</strong> (das ist die größte Falle):</p>



<ul class="wp-block-list">
<li><code>docker network connect</code> ist <strong>nicht möglich</strong> (Container im Host-Namespace).</li>



<li>Traefik erreicht den WP-Container nur über einen <strong>festen, veröffentlichten Port</strong> auf <code>127.0.0.1</code>.</li>



<li>Im Label statt <code>loadbalancer.server.port</code> → <strong><code>loadbalancer.server.url</code></strong> mit der festen URL.</li>
</ul>



<p class="wp-block-paragraph">Daher in der Compose den WP-Port <strong>fix</strong> mappen (nicht dynamisch <code>"80"</code>, das vergibt Docker zufällig):</p>



<pre class="wp-block-code"><code>    ports:
      - "127.0.0.1:8081:80"
</code></pre>



<p class="wp-block-paragraph">Und die <strong>Labels</strong> auf <strong>Service-Ebene</strong> (gleiche Einrückung wie <code>environment:</code>/<code>volumes:</code>, nur <strong>einmal</strong> <code>labels:</code> pro Service!):</p>



<pre class="wp-block-code"><code>    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.abow.rule=Host(`abow.info`)"
      - "traefik.http.routers.abow.entrypoints=websecure"
      - "traefik.http.routers.abow.tls=true"
      - "traefik.http.routers.abow.tls.certresolver=letsencrypt"
      - "traefik.http.services.abow.loadbalancer.server.url=http://127.0.0.1:8081"
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>YAML-Fallen:</strong> <code>labels:</code> darf nicht unter <code>volumes:</code> verschachtelt sein und nicht doppelt vorkommen (<code>mapping key "labels" already defined</code>). Nach jeder Änderung validieren:</p>



<pre class="wp-block-code"><code>docker compose config &gt;/dev/null &amp;&amp; echo "YAML OK" || echo "YAML kaputt"
</code></pre>
</blockquote>



<p class="wp-block-paragraph">Anwenden und <strong>intern</strong> testen (ohne auf DNS/Zertifikat zu warten):</p>



<pre class="wp-block-code"><code>docker compose up -d wordpress

curl -s -I http://127.0.0.1:8081/ | head -1            # WordPress direkt: 200/301
curl -s -I -H "Host: abow.info" http://127.0.0.1/ | head -1   # ueber Traefik
</code></pre>



<p class="wp-block-paragraph"><code>HTTP/1.1 308 Permanent Redirect</code> beim zweiten Befehl = <strong>Traefik kennt den <code>abow</code>-Router</strong> und leitet auf HTTPS um. Routing steht.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 8: DNS umstellen → Zertifikat kommt automatisch</h2>



<p class="wp-block-paragraph">Das Let&#8217;s-Encrypt-Zertifikat (HTTP-Challenge) zieht <strong>erst</strong>, wenn die Domain öffentlich auf den VPS zeigt. Beim DNS-Anbieter für <code>abow.info</code>:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Typ</th><th>Name</th><th>Wert</th></tr></thead><tbody><tr><td>A</td><td><code>@</code></td><td><code>72.61.92.170</code> (VPS-IPv4, via <code>curl -s -4 ifconfig.me</code>)</td></tr><tr><td>AAAA</td><td><code>@</code></td><td>deine VPS-IPv6 (oder AAAA entfernen)</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Vorher testen ohne DNS-Wartezeit: per Windows-<code>hosts</code>-Datei <code>abow.info</code> → VPS-IP (PowerShell-Skript unten). Browser-Zertifikatswarnung ist dabei normal, bis das echte Zert gezogen ist.</p>
</blockquote>



<p class="wp-block-paragraph">Nach Propagation prüfen:</p>



<pre class="wp-block-code"><code>dig +short abow.info                                   # -&gt; 72.61.92.170
curl -sI https://abow.info | head -3                   # -&gt; HTTP/2 200
echo | openssl s_client -connect abow.info:443 -servername abow.info 2&gt;/dev/null \
  | openssl x509 -noout -issuer -subject -dates        # Issuer: Let's Encrypt
</code></pre>



<p class="wp-block-paragraph"><code>HTTP/2 200</code> ohne TLS-Fehler = <strong>live mit gültigem Zertifikat.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schritt 9: Nacharbeiten &amp; Aufräumen</h2>



<pre class="wp-block-code"><code># In WordPress: Einstellungen -&gt; Permalinks -&gt; ohne Aenderung speichern (Rewrites/.htaccess)

# Backups/Reste entfernen
rm -rf /var/lib/docker/volumes/wordpress-ibr4_wordpress/_data_OLD
rm -f  /var/lib/docker/volumes/wordpress-ibr4_wordpress/_data/wp-config.php.*-bak*
rm -f  /docker/wordpress-ibr4/docker-compose.yml.bak*
</code></pre>



<ul class="wp-block-list">
<li><strong>DB-Passwort rotieren</strong>, falls es irgendwo im Klartext aufgetaucht ist.</li>



<li>Strato-Dump nach erfolgreicher Kontrolle sichern/löschen.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">PowerShell: Vorab-Test per hosts-Datei</h2>



<pre class="wp-block-code"><code>&lt;#
.NOTES
    Name:        PS_Hosts_Preview_VPS
    Author:      Andreas Bowitz
    Version:     0.2
    LastUpdated: 2026-Jun-03

.SYNOPSIS
    Setzt temporär einen hosts-Eintrag, um eine Domain vor der DNS-Umstellung
    auf die neue VPS-IP zeigen zu lassen (lokaler Test vom Windows-Client).
#&gt;

$VpsIP  = "72.61.92.170"
$Domain = "abow.info"

$HostsFile = "$env:WINDIR\System32\drivers\etc\hosts"
$Entry     = "$VpsIP`t$Domain"

if (-not (&#91;Security.Principal.WindowsPrincipal] &#91;Security.Principal.WindowsIdentity]::GetCurrent()
    ).IsInRole(&#91;Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Warning "Bitte PowerShell als Administrator starten."; return
}
if ((Get-Content $HostsFile) -match &#91;Regex]::Escape($Domain)) {
    Write-Host "Eintrag fuer '$Domain' existiert bereits." -ForegroundColor Yellow
} else {
    Add-Content -Path $HostsFile -Value $Entry
    Write-Host "Hinzugefuegt: $Entry" -ForegroundColor Green
}
ipconfig /flushdns | Out-Null
Write-Host "Test: https://$Domain  (Zert-Warnung bis echtem DNS normal). Danach Zeile wieder entfernen." -ForegroundColor Cyan
</code></pre>



<h2 class="wp-block-heading">Bash: Import-Helfer (auf dem VPS)</h2>



<pre class="wp-block-code"><code>#!/usr/bin/env bash
# .NOTES
#   Name:        migrate_strato_to_docker
#   Author:      Andreas Bowitz
#   Version:     0.2
#   LastUpdated: 2026-Jun-03
#   Zweck:       DB-Dump in den db-Container importieren + Rechte setzen.
#                Im Compose-Projektverzeichnis ausfuehren.
set -euo pipefail

DB_CONTAINER="wordpress-ibr4-db-1"
WP_CONTAINER="wordpress-ibr4-wordpress-1"
DB_NAME="wordpress"
PREFIX="jryy_"
DUMP="${1:?Pfad zum SQL-Dump angeben}"

echo "&gt;&gt; Pruefe, ob Tabellen existieren ..."
COUNT=$(docker exec "$DB_CONTAINER" sh -c \
  "exec mysql -uwordpress -p\"\$MYSQL_PASSWORD\" -N -e \
   'SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=\"$DB_NAME\";'")
if &#91; "$COUNT" -gt 0 ]; then
  echo "!! $COUNT Tabellen vorhanden. Erst leeren (manuell), dann erneut starten." ; exit 1
fi

echo "&gt;&gt; Importiere '$DUMP' ..."
docker exec -i "$DB_CONTAINER" \
  sh -c 'exec mysql -uwordpress -p"$MYSQL_PASSWORD" '"$DB_NAME" &lt; "$DUMP"

echo "&gt;&gt; Rechte setzen ..."
docker exec "$WP_CONTAINER" chown -R www-data:www-data /var/www/html

echo "&gt;&gt; Kontrolle ..."
docker exec "$DB_CONTAINER" sh -c \
  "exec mysql -uwordpress -p\"\$MYSQL_PASSWORD\" $DB_NAME \
   -e 'SELECT option_value FROM ${PREFIX}options WHERE option_name=\"siteurl\";'"
echo "&gt;&gt; Fertig."
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Troubleshooting (gesammelte Stolperfallen)</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Symptom</th><th>Ursache</th><th>Lösung</th></tr></thead><tbody><tr><td><code>open …/_data: no such file or directory</code></td><td><code>_data</code> (Mountpunkt des Named Volume) gelöscht</td><td>Volume-Ordner wiederherstellen, Files in <code>_data</code> legen – nie löschen</td></tr><tr><td><code>php</code>-Check zeigt <code>wp_</code> statt <code>jryy_</code></td><td><code>WORDPRESS_TABLE_PREFIX</code> im falschen Service-Block oder alte <code>wp-config.php</code> da</td><td>ENV beim <code>wordpress</code>-Service, alte Config umbenennen, <code>--force-recreate</code></td></tr><tr><td><code>wp-config.php</code> wird nicht neu geschrieben</td><td><code>docker compose up -d</code> recreatet laufenden Container nicht</td><td><code>docker compose up -d --force-recreate wordpress</code></td></tr><tr><td><code>ERROR 1050 … already exists</code></td><td>Tabellen schon vorhanden</td><td>Schema leeren (DROP-Loop), dann neu importieren</td></tr><tr><td><code>Error establishing a database connection</code></td><td><code>DB_HOST</code> = <code>localhost</code>/<code>rdbms.strato.de</code></td><td>auf Service-Namen <code>db</code> setzen</td></tr><tr><td><code>mapping key "labels" already defined</code> / <code>mapping values not allowed</code></td><td><code>labels:</code> doppelt oder falsch eingerückt</td><td>nur <strong>ein</strong> <code>labels:</code> auf Service-Ebene; <code>docker compose config</code> validieren</td></tr><tr><td>Traefik routet nicht / 404</td><td>Host-Mode + dynamischer Port / <code>server.port</code> statt <code>server.url</code></td><td>fixes <code>127.0.0.1:8081:80</code>, Label <code>loadbalancer.server.url=http://127.0.0.1:8081</code></td></tr><tr><td>Kein Zertifikat</td><td>HTTP-Challenge scheitert, DNS zeigt noch auf Strato</td><td>A/AAAA auf VPS-IP, dann zieht Traefik automatisch</td></tr><tr><td>Redirect-Loop / Mixed Content</td><td>HTTPS hinter Proxy nicht erkannt</td><td><code>WORDPRESS_CONFIG_EXTRA</code> mit <code>HTTP_X_FORWARDED_PROTO</code></td></tr><tr><td>404 auf Unterseiten</td><td>Permalinks/Rewrite</td><td>Permalinks ohne Änderung neu speichern</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Fazit:</strong> Auf einem Docker-VPS verlagert sich der Umzug komplett in die Shell. Die eigentliche Arbeit sind nicht die Standard-Schritte (Dump rein, Files rein), sondern die <strong>Eigenheiten der Umgebung</strong>: Named Volume = <code>_data</code> (nie löschen), <code>WORDPRESS_TABLE_PREFIX</code> beim <strong>richtigen</strong> Service plus <code>--force-recreate</code>, Effektiv-Prüfung mit <code>php -r</code> statt <code>grep</code>, und Traefik im <strong>Host-Mode</strong> mit <strong>festem Port</strong> und <code>server.url</code>. Wer diese vier Punkte kennt, zieht beim nächsten Mal in 20 Minuten um – ohne Hilfe.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abow.info/persoenlich/wordpress-umzug-von-strato-auf-einen-hostinger-vps-docker-traefik/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Microsoft Exchange // CU Update Installation</title>
		<link>https://abow.info/microsoft/microsoft_exchange/microsoft-exchange-cu-update-installation-2/</link>
					<comments>https://abow.info/microsoft/microsoft_exchange/microsoft-exchange-cu-update-installation-2/#respond</comments>
		
		<dc:creator><![CDATA[Andi Bow]]></dc:creator>
		<pubDate>Fri, 19 Jun 2026 17:00:00 +0000</pubDate>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Microsoft Exchange]]></category>
		<category><![CDATA[Microsoft Exchange Online]]></category>
		<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[CU Update]]></category>
		<category><![CDATA[Cumulative Update]]></category>
		<category><![CDATA[Exchange]]></category>
		<category><![CDATA[Exchange Server SE]]></category>
		<category><![CDATA[Extended Protection]]></category>
		<category><![CDATA[IIS URL Rewrite]]></category>
		<category><![CDATA[Mailflow]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Patchmanagement]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Schema]]></category>
		<guid isPermaLink="false">https://abow.info/?p=453</guid>

					<description><![CDATA[Die Installation eines Exchange Cumulative Updates ist keine simple Routineaufgabe – es sind zahlreiche Aspekte zu beachten. Die Rückmeldung während der Installation ist oft spärlich; es kann durchaus…]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Die Installation eines Exchange Cumulative Updates ist keine simple Routineaufgabe – es sind zahlreiche Aspekte zu beachten. Die Rückmeldung während der Installation ist oft spärlich; es kann durchaus minutenlang so aussehen, als passiere nichts. Solange das Setup-Fenster noch reagiert, besteht in der Regel kein Grund zur Sorge.</p>



<p class="wp-block-paragraph">Diese Dokumentation basiert auf der Installation eines CU auf dem eigenständigen Exchange-Server <strong>exch01.domain.tld</strong>, der vorab mit allen aktuellen Windows-Updates versorgt wurde. Die zugrunde liegende Umgebung ist ein Multi-AD-Forest mit Child-Domain – also deutlich komplexer als eine Single-Forest-/Single-Domain-Struktur.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Wichtig vorab (Stand: Juni 2026): Exchange 2016/2019 sind End of Support</h2>



<p class="wp-block-paragraph">Exchange Server 2016 und 2019 haben am <strong>14. Oktober 2025</strong> das Support-Ende erreicht. Es gibt seitdem <strong>keine regulären Sicherheitsupdates, Bugfixes oder technischen Support</strong> mehr. Wer noch im Programm der <strong>Extended Security Updates (ESU)</strong> ist, erhält Updates nur noch <strong>bis April 2026</strong> – das ist ausdrücklich nur ein Übergang, keine Dauerlösung.</p>



<p class="wp-block-paragraph">Die einzige weiterhin unterstützte On-Prem-Variante ist <strong>Exchange Server Subscription Edition (SE)</strong>. Exchange SE RTM ist code-identisch mit Exchange 2019 CU15; <strong>SE CU1</strong> kam in H1/2026, <strong>SE CU2</strong> folgt in H2/2026 und blockt dann die Koexistenz mit 2016/2019.</p>



<p class="wp-block-paragraph"><strong>Konsequenz für dieses Thema:</strong> Reine CU-Installationen auf 2016/2019 sind heute fast nur noch im Rahmen einer In-Place-Migration nach SE relevant (2019 CU14/CU15 → SE) oder mit aktivem ESU. Der hier beschriebene Ablauf gilt aber <strong>technisch unverändert auch für Exchange Server SE</strong> – Modern Servicing bedeutet lediglich: Es ist immer nur das <strong>aktuellste</strong> CU supported (kein „N-1&#8243; mehr).</p>
</blockquote>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="389" src="https://abow.info/wp-content/uploads/2026/06/inlay_lifecycle_se-1024x389.png" alt="" class="wp-image-455" srcset="https://abow.info/wp-content/uploads/2026/06/inlay_lifecycle_se-1024x389.png 1024w, https://abow.info/wp-content/uploads/2026/06/inlay_lifecycle_se-300x114.png 300w, https://abow.info/wp-content/uploads/2026/06/inlay_lifecycle_se-768x292.png 768w, https://abow.info/wp-content/uploads/2026/06/inlay_lifecycle_se-1536x584.png 1536w, https://abow.info/wp-content/uploads/2026/06/inlay_lifecycle_se.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Voraussetzungen</h2>



<h3 class="wp-block-heading">Passende Berechtigungen</h3>



<p class="wp-block-paragraph">Für das Update wird ein Benutzerkonto benötigt, das Mitglied in folgenden Gruppen ist:</p>



<ul class="wp-block-list">
<li><strong>Organization Management</strong></li>



<li><strong>Organisations-Admins</strong> (Enterprise Admins)</li>



<li><strong>Schema-Admins</strong></li>
</ul>



<p class="wp-block-paragraph">Nur damit ist sichergestellt, dass alle Änderungen am Active-Directory-Schema und an der Exchange-Organisation durchgeführt werden können. Fehlen die Rechte, schlägt die Installation fehl – und die Ursache lässt sich oft nur mit gezielter Log-Recherche nachvollziehen.</p>



<p class="wp-block-paragraph">In seltenen Konstellationen (wie z. B. bei <em>domain.tld</em>) ist die Gruppe <strong>Organisations-Admins</strong> nicht automatisch Mitglied der <strong>Domänen-Admins</strong> jeder betroffenen Domäne. Dann muss <code>PrepareDomain</code> zwingend mit einem Benutzer aus der <strong>Domänen-Admins</strong>-Gruppe der jeweiligen Domäne ausgeführt werden.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Vorbereitung der Arbeiten</h2>



<p class="wp-block-paragraph">Je nach Umgebung unterscheiden sich die Vorbereitungsschritte. Vieles lässt sich aber schon im Vorfeld erledigen.</p>



<h3 class="wp-block-heading">Übersicht der Exchange-Server erfassen</h3>



<p class="wp-block-paragraph">Erstelle vorab eine Übersicht aller Exchange-Server inklusive <strong>Dienstestatus</strong>, <strong>Build-Versionen</strong> und ggf. <strong>Rollenverteilung</strong>. Das dokumentiert den IST-Zustand sauber und hilft im Fehlerfall enorm.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Tipp:</strong> Microsoft empfiehlt offiziell den <strong>Exchange Server Health Checker</strong> (PowerShell-Skript), um vorab zu sehen, welche CUs/SUs/manuellen Schritte ausstehen. Den IST-Zustand kannst du außerdem mit dem unten verlinkten Pre-Flight-Skript einsammeln.</p>
</blockquote>



<h3 class="wp-block-heading">Beginn der Arbeiten kommunizieren</h3>



<p class="wp-block-paragraph">Vor dem Start der Wartung den Kunden/Service Owner rechtzeitig informieren, damit Einschränkungen bekannt und eingeplant sind.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="471" src="https://abow.info/wp-content/uploads/2026/06/inlay_cu_ablauf-1024x471.png" alt="" class="wp-image-456" srcset="https://abow.info/wp-content/uploads/2026/06/inlay_cu_ablauf-1024x471.png 1024w, https://abow.info/wp-content/uploads/2026/06/inlay_cu_ablauf-300x138.png 300w, https://abow.info/wp-content/uploads/2026/06/inlay_cu_ablauf-768x353.png 768w, https://abow.info/wp-content/uploads/2026/06/inlay_cu_ablauf-1536x707.png 1536w, https://abow.info/wp-content/uploads/2026/06/inlay_cu_ablauf.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Exchange-Version ermitteln</h2>



<p class="wp-block-paragraph">Zuerst feststellen, welche Version aktuell läuft – per <strong>Exchange Management Shell</strong> oder <strong>EAC</strong>.</p>



<pre class="wp-block-code"><code>Get-ExchangeServer | Select-Object Name, AdminDisplayVersion | Format-Table
</code></pre>



<p class="wp-block-paragraph">Beispielausgabe:</p>



<pre class="wp-block-code"><code>Name    AdminDisplayVersion
----    -------------------
EXCH01  Version 15.1 (Build 2044.4)
EXCH02  Version 15.1 (Build 2044.4)
</code></pre>



<p class="wp-block-paragraph">Die Build-Nummer ordnest du über die Microsoft-Liste der konkreten CU-Version zu: <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://learn.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates">Exchange Build Numbers and Release Dates (Microsoft Learn)</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Build-Logik kurz erklärt:</strong> <code>15.0.x</code> = Exchange 2013, <code>15.1.x</code> = Exchange 2016, <code>15.2.x</code> = Exchange 2019 / Exchange SE. Im Beispiel entspricht <strong>15.1.2044.4</strong> dem <strong>Exchange 2016 CU17</strong>.</p>
</blockquote>



<h3 class="wp-block-heading">CU-Version der Setup-Datei prüfen</h3>



<p class="wp-block-paragraph">Welche Version ein vorhandenes Setup-Paket enthält:</p>



<pre class="wp-block-code"><code>Get-Command Exsetup.exe | ForEach-Object { $_.FileVersionInfo }
</code></pre>



<h3 class="wp-block-heading">Download der aktuellen CU/SE-Version</h3>



<p class="wp-block-paragraph">Aktuelle Pakete (Exchange SE bzw. die letzten ESU-fähigen SUs für 2016/2019) gibt es bei Microsoft. Nutze zur Pfadbestimmung den <strong>Exchange Update Wizard</strong>, der dir abhängig von Quell- und Ziel-CU die genauen Schritte ausgibt.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Besonderheit: UM Language Pack</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Hinweis:</strong> Unified Messaging (UM) wurde mit Exchange 2019 entfernt und ist in Exchange SE nicht mehr vorhanden. Dieser Abschnitt ist daher nur noch für <strong>Exchange 2016</strong> relevant.</p>
</blockquote>



<p class="wp-block-paragraph">Falls UM eingesetzt wird, ist ggf. ein <strong>UM Language Pack</strong> installiert (z. B. für Voicemail-Ansagen). Es muss nach dem CU-Update in passender Version <strong>neu installiert</strong> werden und erscheint in der Systemsteuerung unter <em>Programme und Features</em>.</p>



<p class="wp-block-paragraph">Prüfen, ob ein Language Pack aktiv ist:</p>



<pre class="wp-block-code"><code>Get-UMService | Select-Object Name, Languages
</code></pre>



<p class="wp-block-paragraph">Wird nur <code>{en-US}</code> ausgegeben, ist kein zusätzliches Sprachpaket installiert.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">.NET Framework-Version ermitteln</h2>



<p class="wp-block-paragraph">Am einfachsten per PowerShell (als Administrator):</p>



<pre class="wp-block-code"><code>(Get-ItemProperty "HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full").Release
</code></pre>



<p class="wp-block-paragraph">Beispielausgabe:</p>



<pre class="wp-block-code"><code>528049
</code></pre>



<p class="wp-block-paragraph">Der Release-Wert lässt sich der Microsoft-Tabelle zuordnen – <strong>528049 = .NET 4.8</strong>: <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed">How to determine which .NET Framework versions are installed</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Kurzreferenz Release-Werte:</strong> <code>528040/528049/528449</code> = .NET 4.8 · <code>533320/533325</code> = .NET 4.8.1. Exchange SE benötigt <strong>.NET 4.8</strong> (auf Windows Server 2025 ist 4.8.1 systemseitig dabei).</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Kompatibilität von CU und .NET Framework</h2>



<p class="wp-block-paragraph">Mit diesen Infos prüfst du anhand der <strong>Supportability Matrix</strong>, ob die installierte .NET-Version zum geplanten CU passt. Ist das <strong>nicht</strong> der Fall, muss .NET <strong>vor</strong> dem CU aktualisiert werden.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://learn.microsoft.com/en-us/exchange/plan-and-deploy/supportability-matrix">Exchange Server Supportability Matrix (Microsoft Learn)</a></p>



<p class="wp-block-paragraph">In unserem Beispiel: .NET 4.8 wird bereits <strong>ab Exchange 2016 CU13</strong> unterstützt – ein .NET-Update ist hier <strong>nicht erforderlich</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Active Directory Schema-Version prüfen</h2>



<p class="wp-block-paragraph">Vor dem CU prüfen, ob das AD-Schema bereits die erforderliche Version hat.</p>



<p class="wp-block-paragraph"><strong>Exchange Schema Version:</strong></p>



<pre class="wp-block-code"><code>$sc = (Get-ADRootDSE).SchemaNamingContext
$ob = "CN=ms-Exch-Schema-Version-Pt," + $sc
Write-Output "RangeUpper: $((Get-ADObject $ob -Properties rangeUpper).rangeUpper)"
</code></pre>



<p class="wp-block-paragraph"><strong>Exchange Object Version (Domain):</strong></p>



<pre class="wp-block-code"><code>$dc = (Get-ADRootDSE).DefaultNamingContext
$ob = "CN=Microsoft Exchange System Objects," + $dc
Write-Output "ObjectVersion (Default): $((Get-ADObject $ob -Properties objectVersion).objectVersion)"
</code></pre>



<p class="wp-block-paragraph"><strong>Exchange Object Version (Forest):</strong></p>



<pre class="wp-block-code"><code>$cc = (Get-ADRootDSE).ConfigurationNamingContext
$fl = "(objectClass=msExchOrganizationContainer)"
Write-Output "ObjectVersion (Configuration): $((Get-ADObject -LDAPFilter $fl -SearchBase $cc -Properties objectVersion).objectVersion)"
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Hinweis:</strong> Die <em>ObjectVersion (Configuration)</em> wird in manchen Umgebungen erst nach dem erfolgreichen Update des ersten Exchange-Servers erhöht.</p>
</blockquote>



<p class="wp-block-paragraph">Beispielausgabe:</p>



<pre class="wp-block-code"><code>RangeUpper: 15332
ObjectVersion (Default): 13237
ObjectVersion (Configuration): 16217
</code></pre>



<p class="wp-block-paragraph">Die jeweils erforderlichen Soll-Werte je CU stehen hier:</p>



<ul class="wp-block-list">
<li><a href="https://learn.microsoft.com/de-de/exchange/plan-and-deploy/prepare-ad-and-domains?view=exchserver-2016">Exchange 2016 – AD- und Domain-Vorbereitung</a></li>



<li><a href="https://learn.microsoft.com/de-de/exchange/plan-and-deploy/prepare-ad-and-domains?view=exchserver-2019">Exchange 2019 – AD- und Domain-Vorbereitung</a></li>
</ul>



<p class="wp-block-paragraph">In unserem Fall muss das <strong>Schema erweitert</strong> werden, da das neue CU eine höhere Schema-Version voraussetzt.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Tipp:</strong> Alle obigen Abfragen plus Dienstestatus, FSMO, .NET und Transport Agents erledigt das verlinkte Pre-Flight-Skript in einem Rutsch (read-only).</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schema Master ermitteln</h2>



<p class="wp-block-paragraph">Für das Schema-Upgrade muss bekannt sein, welcher DC die <strong>Schema-Master</strong>-Rolle hält. Das Upgrade sollte im Vorfeld des CU erfolgen.</p>



<p class="wp-block-paragraph"><strong>Variante 1 – CMD:</strong></p>



<pre class="wp-block-code"><code>netdom query fsmo
</code></pre>



<p class="wp-block-paragraph"><strong>Variante 2 – PowerShell:</strong></p>



<pre class="wp-block-code"><code>Get-ADForest | Select-Object SchemaMaster
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Schema-Erweiterung des Active Directory</h2>



<p class="wp-block-paragraph">Die <strong>Installations-ISO des CUs</strong> wird auf dem <strong>DC mit der Schema-Master-Rolle</strong> eingebunden (im Beispiel <code>rootdc01.domain.tld</code>).</p>



<p class="wp-block-paragraph">Alternativ auf einem anderen DC in der <strong>gleichen AD-Site</strong> wie der Exchange-Server. Bei Bedarf die FSMO-Rolle temporär verschieben:</p>



<ol class="wp-block-list">
<li><code>mmc</code> öffnen → Snap-In „<strong>Active Directory-Schema</strong>&#8220; hinzufügen</li>



<li>Rechtsklick auf <strong>Active Directory-Schema</strong> → <strong>Change Domain Controller</strong></li>



<li>Ziel-DC wählen → <strong>Operation Master</strong> → <strong>Change</strong></li>
</ol>



<h3 class="wp-block-heading">Durchführung</h3>



<ol class="wp-block-list">
<li><strong>PowerShell als Administrator</strong> auf dem Schema-Master öffnen</li>



<li>Auf das ISO-Laufwerk wechseln (z. B. <code>D:</code>):</li>
</ol>



<pre class="wp-block-code"><code>D:
</code></pre>



<ol start="3" class="wp-block-list">
<li>Befehle nacheinander ausführen:</li>
</ol>



<pre class="wp-block-code"><code>.\setup.exe /PrepareSchema /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
.\setup.exe /PrepareAD /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Zum Lizenz-Schalter:</strong> Microsoft akzeptiert zwei Varianten – <code>_DiagnosticDataON</code> oder <code>_DiagnosticDataOFF</code>. Der Unterschied ist ausschließlich, ob optionale Diagnosedaten an Microsoft gesendet werden. Funktional ist die Installation identisch. <strong>Tipp:</strong> Innerhalb einer Wartung konsistent denselben Schalter verwenden, um Verwirrung in den Logs zu vermeiden.</p>
</blockquote>



<h3 class="wp-block-heading">Komplexe Umgebungen mit mehreren Domänen</h3>



<p class="wp-block-paragraph">Gibt es Exchange-Server in weiteren Domänen:</p>



<pre class="wp-block-code"><code>.\setup.exe /PrepareAllDomains /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
</code></pre>



<p class="wp-block-paragraph">Schlägt <code>PrepareAllDomains</code> mangels Domain-Adminrechten fehl, jede Domäne einzeln vorbereiten:</p>



<pre class="wp-block-code"><code>.\setup.exe /PrepareDomain:&lt;domain.tld&gt; /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Abschluss der AD-Vorbereitung</h2>



<p class="wp-block-paragraph">Danach ist das AD auf dem aktuellen Stand. Die ISO kann vom DC wieder ausgehängt werden.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Hinweis:</strong> Vor dem Start der Exchange-Installation die <strong>AD-Replikation abwarten</strong> – meist reichen ca. <strong>15 Minuten</strong>, je nach Umgebung mehr. Mit <code>repadmin /replsummary</code> lässt sich der Replikationsstand prüfen.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Problem: „Ein Neustart einer vorangegangenen Installation steht noch aus&#8220;</h2>



<p class="wp-block-paragraph">Vor dem Setup kann diese Meldung kommen:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Ein Neustart einer vorangegangenen Installation steht noch aus. Starten Sie das System neu, und führen Sie Setup erneut aus.</strong></p>
</blockquote>



<p class="wp-block-paragraph">Das Setup wird <strong>abgebrochen</strong>. Details im Log:</p>



<pre class="wp-block-code"><code>&lt;SystemDrive&gt;:\ExchangeSetupLogs\ExchangeSetup.log
</code></pre>



<h3 class="wp-block-heading">Lösungsmöglichkeiten</h3>



<ul class="wp-block-list">
<li><strong>Variante 1 (empfohlen):</strong> Server <strong>einmal neu starten</strong>, Setup erneut ausführen.</li>



<li><strong>Variante 2 (nur wenn Reboot nicht hilft):</strong> Den Registry-<strong>Wert</strong> prüfen:</li>
</ul>



<pre class="wp-block-code"><code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager → PendingFileRenameOperations
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Korrektur/Warnung (wichtig!):</strong> Diesen Wert <strong>nicht blind löschen</strong>. <code>PendingFileRenameOperations</code> kann <strong>mehrere legitime</strong> ausstehende Umbenennungen enthalten, die Windows beim nächsten Boot erledigen will. Werden die gelöscht, können laufende Updates inkonsistent werden.</p>



<p class="wp-block-paragraph"><strong>Besser:</strong> Erst den Inhalt ansehen (<code>Get-ItemProperty ... -Name PendingFileRenameOperations</code>), den Wert <strong>exportieren/sichern</strong>, und nur wenn dort ausschließlich irrelevante Reste stehen, gezielt entfernen. In 95 % der Fälle löst ein simpler Reboot das Problem sauber.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Weitere Infos: <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://www.frankysweb.de/exchange-allgemein-fehler-%E2%80%9Eein-neustart-steht-noch-aus%E2%80%9C-bei-installation-oder-update/">FrankysWeb – „Ein Neustart steht noch aus&#8220;</a></p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Sonderanpassungen an der Konfiguration</h2>



<p class="wp-block-paragraph">Individuelle <strong>Konfigurationsänderungen</strong> (z. B. an <code>web.config</code>) können durch ein CU <strong>überschrieben</strong> werden. Diese vorab <strong>dokumentieren/exportieren</strong> und nach dem Update <strong>prüfen und ggf. erneut setzen</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Abhängige Drittherstellersoftware</h2>



<p class="wp-block-paragraph">In produktiven Umgebungen ist oft Drittsoftware aktiv (Signaturen, Archivierung, Security). Solche Komponenten können durch ein CU beeinträchtigt werden, vor allem wenn Exchange-DLLs ersetzt werden.</p>



<p class="wp-block-paragraph">Prüfen, ob sich Software in den Mailflow einklinkt:</p>



<pre class="wp-block-code"><code>Get-TransportAgent
</code></pre>



<p class="wp-block-paragraph">Beispielausgabe:</p>



<pre class="wp-block-code"><code>Name                              Enabled  Priority
----                              -------  --------
Exclaimer Auto Responder Agent    True     1
</code></pre>



<p class="wp-block-paragraph">Hier ist der <strong>Exclaimer Auto Responder Routing Agent</strong> aktiv (laut Hersteller keine Maßnahmen nach CU nötig). Anders z. B. bei <strong>CI-Mail Policy</strong> – die muss nach jedem CU <strong>neu installiert</strong> werden.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Empfehlung: Vor dem Update die Dritthersteller-Doku prüfen oder beim Hersteller anfragen, ob nach einem CU Maßnahmen nötig sind.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Vorbereitung vor dem Update</h2>



<h3 class="wp-block-heading">Kundenkommunikation</h3>



<p class="wp-block-paragraph">Falls noch nicht erfolgt: <strong>Kunde vor Beginn informieren</strong>, besonders bei Produktivsystemen.</p>



<h3 class="wp-block-heading">Kein Snapshot!</h3>



<p class="wp-block-paragraph">Ein Snapshot (Hyper-V/VMware) ist <strong>nicht sinnvoll</strong> – das CU ändert nicht nur Exchange, sondern auch das <strong>AD-Schema</strong>. Ein Snapshot-Rollback führt zu inkonsistenten Zuständen. Es gibt <strong>kein Rollback</strong> – nur den Weg nach vorn.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Technische Vorbereitung</h2>



<h3 class="wp-block-heading">Status der Exchange-Dienste dokumentieren</h3>



<p class="wp-block-paragraph">IST-Zustand festhalten:</p>



<ul class="wp-block-list">
<li><strong>Dienste</strong> (Screenshot oder PowerShell): <code>Test-ServiceHealth</code></li>



<li><strong>Komponentenstatus</strong>: <code>Get-ServerComponentState &lt;Servername></code></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Hintergrund: CU-/Hotfix-Installationen setzen Dienste/Komponenten oft auf „Deaktiviert&#8220;. Eine saubere Rückdokumentation ist entscheidend.</p>
</blockquote>



<h3 class="wp-block-heading">Zugriffe reduzieren</h3>



<ul class="wp-block-list">
<li><strong>Benutzersitzungen abmelden</strong> (alle außer Admin).</li>



<li><strong>Offene PowerShell-Sitzungen beenden:</strong></li>
</ul>



<pre class="wp-block-code"><code>Get-Process *powershell* | Stop-Process -Id &lt;Prozess-ID&gt;
</code></pre>



<h3 class="wp-block-heading">Virenscanner deaktivieren</h3>



<ul class="wp-block-list">
<li>AV (z. B. <strong>Bitdefender</strong>) <strong>deaktivieren</strong> (bei Bitdefender: <em>Shift + Rechtsklick > Poweruser</em>).</li>



<li>Andere Lösungen nach Herstelleranleitung.</li>



<li>Geht keine Deaktivierung: <strong>dokumentieren</strong> und fortfahren.</li>
</ul>



<h3 class="wp-block-heading">Backup pausieren</h3>



<ul class="wp-block-list">
<li>Laufende <strong>Backup-Jobs pausieren/deaktivieren</strong> – das CU beinhaltet mehrere Neustarts; Sicherungen können den Prozess stören oder beschädigte Backups erzeugen.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Installation des .NET Framework Updates (falls erforderlich)</h2>



<p class="wp-block-paragraph">Im Beispiel nicht nötig – der Vollständigkeit halber:</p>



<ol class="wp-block-list">
<li><strong>Offline-Installer herunterladen</strong> (z. B. .NET 4.8)</li>



<li><strong>Als Administrator ausführen</strong>, Lizenz akzeptieren, installieren</li>



<li>Laufzeit bis zu <strong>60 Minuten</strong>, wirkt teils eingefroren</li>



<li><strong>Neustart zwingend</strong></li>



<li>Danach über <strong>Windows Update</strong> verfügbare <strong>.NET-Sicherheitsupdates</strong> nachziehen</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">IIS URL Rewrite Module (bei bestimmten CUs)</h2>



<p class="wp-block-paragraph">Seit dem <strong>CU vom September 2021</strong> gibt es einen sicherheitsrelevanten „Not-Aus-Schalter&#8220;. Dafür ist vorab das <strong>IIS URL Rewrite Module</strong> nötig:</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://www.iis.net/downloads/microsoft/url-rewrite">Microsoft URL Rewrite Module</a></p>



<p class="wp-block-paragraph">Installation dauert nur wenige Minuten und sollte <strong>vor dem CU</strong> erfolgen, falls das CU diese Abhängigkeit mitbringt.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Installation des Cumulative Updates (CU)</h2>



<p class="wp-block-paragraph">Vor der Installation den <strong>Exchange Server einmal neu starten</strong>, um sauber zu starten.</p>



<h3 class="wp-block-heading">ISO-Datei einbinden</h3>



<p class="wp-block-paragraph">Die CU-ISO <strong>per Doppelklick einbinden</strong> – sie erscheint als virtuelles Laufwerk.</p>



<h3 class="wp-block-heading">Wichtiger Hinweis: Extended Protection</h3>



<p class="wp-block-paragraph">Mit aktuellen CUs wird <strong>Extended Protection (EP)</strong> automatisch aktiviert. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://learn.microsoft.com/en-us/exchange/plan-and-deploy/post-installation-tasks/security-best-practices/exchange-extended-protection?view=exchserver-2019">Exchange Extended Protection (Microsoft Learn)</a></p>



<p class="wp-block-paragraph">Soll EP <strong>nicht</strong> aktiviert werden:</p>



<pre class="wp-block-code"><code>.\Setup.exe /Update /DoNotEnableEP /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> EP ist eine <strong>Sicherheitsfunktion</strong> und sollte im Normalfall <strong>aktiviert bleiben</strong>. <code>/DoNotEnableEP</code> nur nutzen, wenn dokumentierte Kompatibilitätsgründe vorliegen (z. B. bestimmte Loadbalancer-/Hybrid-Szenarien).</p>
</blockquote>



<h3 class="wp-block-heading">CU-Installation starten</h3>



<ol class="wp-block-list">
<li><strong>Administrative PowerShell</strong> öffnen</li>



<li>Zum ISO-Laufwerk navigieren</li>



<li>Installation starten:</li>
</ol>



<pre class="wp-block-code"><code>.\Setup.exe /Mode:Upgrade /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Wichtig:</strong> <code>setup.exe</code> <strong>muss als Administrator</strong> laufen, sonst drohen inkonsistentes Verhalten oder ein <strong>defekter Exchange-Server</strong>.</p>
</blockquote>



<h3 class="wp-block-heading">Während der Installation</h3>



<ul class="wp-block-list">
<li>Die Installation kann mehrfach längere Zeit „hängen&#8220; – das ist <strong>normal</strong>.</li>



<li>Alle <strong>Exchange-Dienste sind gestoppt</strong> – das Monitoring sollte das erkennen (ggf. Wartungsfenster setzen).</li>



<li>Häufige Fehlerursache: <strong>Backup-Software startet automatisch</strong> → Backup-Jobs vorab stoppen!</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Neustart nach dem CU-Update</h2>



<p class="wp-block-paragraph">Nach der Installation ist ein <strong>Neustart zwingend</strong>. Er kann <strong>ungewöhnlich lange</strong> dauern – teils <strong>bis zu einer Stunde</strong>, bis alle Dienste laufen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Nacharbeiten nach dem CU-Update</h2>



<h3 class="wp-block-heading">Sonderanpassungen prüfen und ggf. erneut setzen</h3>



<p class="wp-block-paragraph"><code>web.config</code>-Anpassungen u. Ä. jetzt <strong>prüfen</strong> und bei Bedarf erneut vornehmen – CUs überschreiben solche Änderungen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Arbeiten nach dem Neustart</h2>



<h3 class="wp-block-heading">1. Dienste &amp; Konfiguration</h3>



<p class="wp-block-paragraph">Exchange-Dienste gestartet und in erwarteter Konfiguration? → Abgleich mit Vorher-Screenshot.</p>



<h3 class="wp-block-heading">2. Komponentenstatus</h3>



<pre class="wp-block-code"><code>Get-ServerComponentState &lt;Servername&gt;
</code></pre>



<p class="wp-block-paragraph">→ Abgleich mit dokumentiertem Zustand.</p>



<h3 class="wp-block-heading">3. Datenbankstatus</h3>



<p class="wp-block-paragraph">Im <strong>EAC → Servers → Databases</strong> prüfen, ob alle Datenbanken eingebunden/bereitgestellt sind. (PowerShell: <code>Get-MailboxDatabaseCopyStatus</code>.)</p>



<h3 class="wp-block-heading">4. Mailflow testen</h3>



<p class="wp-block-paragraph">Test eingehend und ausgehend (z. B. Admin sendet an Techniker, erhält Antwort).</p>



<h3 class="wp-block-heading">5. OWA / Outlook-Zugriff prüfen</h3>



<p class="wp-block-paragraph"><strong>OWA</strong> mit Testnutzer testen, wenn möglich <strong>Outlook-Konnektivität</strong> prüfen.</p>



<h3 class="wp-block-heading">6. Monitoring prüfen</h3>



<p class="wp-block-paragraph">Alles wieder „grün&#8220;? <strong>CPU-Last</strong> direkt nach Neustart erhöht ist normal – nach <strong>30–60 Minuten</strong> sollte sie sich stabilisieren.</p>



<h3 class="wp-block-heading">7. Ereignisprotokolle prüfen</h3>



<p class="wp-block-paragraph"><strong>Anwendungs-/System-Eventlogs</strong> filtern (Kritisch/Fehler/Warnung). Kurz nach dem Neustart sind manche Fehler normal und verschwinden wieder.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Letzte Schritte nach dem CU-Update</h2>



<h3 class="wp-block-heading">Prüfung mit <code>Test-ServiceHealth</code></h3>



<pre class="wp-block-code"><code>Test-ServiceHealth
</code></pre>



<p class="wp-block-paragraph">Alle erforderlichen Dienste sollten „Running&#8220; zeigen.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Microsoft empfiehlt, <strong>nach</strong> dem Update erneut den <strong>Exchange Health Checker</strong> laufen zu lassen, um offene Folgeaktionen zu erkennen.</p>
</blockquote>



<h3 class="wp-block-heading">Reaktivierung des Virenscanners</h3>



<p class="wp-block-paragraph">Falls manuell deaktiviert und nicht automatisch zurück: AV <strong>wieder aktivieren</strong>.</p>



<h3 class="wp-block-heading">Backup fortsetzen</h3>



<p class="wp-block-paragraph">Pausierten Backup-Job <strong>fortsetzen</strong> (Rechtsklick → Fortsetzen).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Prüfung der erfolgreichen Installation</h2>



<pre class="wp-block-code"><code>Get-ExchangeServer | Select-Object Name, AdminDisplayVersion | Format-Table
</code></pre>



<p class="wp-block-paragraph">Beispielausgabe:</p>



<pre class="wp-block-code"><code>Name    AdminDisplayVersion
----    -------------------
EXCH04  Version 15.1 (Build 2044.4)
EXCH05  Version 15.1 (Build 2176.2)
</code></pre>



<p class="wp-block-paragraph">Die Build-Nummer muss der Zielversion entsprechen (siehe Microsoft Build-Liste).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Abschluss</h2>



<ul class="wp-block-list">
<li><strong>Information kommunizieren</strong> (intern an Service Owner, extern an Kunde/Ansprechpartner).</li>



<li><strong>Installationsdateien bereinigen</strong> (ISO und extrahierte Dateien löschen, Papierkorb leeren).</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Bonus: Pre-Flight-Skript</h2>



<p class="wp-block-paragraph">Das begleitende PowerShell-Skript <strong><code>PS_Exchange_CU_PreFlight_Check.ps1</code></strong> sammelt den kompletten IST-Zustand (Versionen, Dienste, ComponentState, AD-Schema, FSMO, .NET, Transport Agents, Pending-Reboot) read-only in eine Textdatei – ideal für die Vorher-/Nachher-Dokumentation.</p>



<div class="wp-block-file"><a id="wp-block-file--media-85f8861f-f54a-46bc-8de9-afca60d3e222" href="https://abow.info/wp-content/uploads/2026/06/PS_Exchange_CU_PreFlight_Check.ps1">PS_Exchange_CU_PreFlight_Check</a><a href="https://abow.info/wp-content/uploads/2026/06/PS_Exchange_CU_PreFlight_Check.ps1" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-85f8861f-f54a-46bc-8de9-afca60d3e222">Herunterladen</a></div>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://abow.info/microsoft/microsoft_exchange/microsoft-exchange-cu-update-installation-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
