Read-only in-place upgrade (IPU) readiness assessment for Windows Server. Run it on a server before an upgrade to Windows Server 2025 (default) or 2022, and get one verdict, a prioritised list of what to fix, and a self-contained report. Run it again afterwards to check the server against its own pre-upgrade snapshot.
| Output | For | File |
|---|---|---|
| HTML report | People: findings, what to do, evidence | <Computer>-IPU-Assessment.html |
| JSON result | Tools, fleet roll-ups, post-upgrade baseline | <Computer>-IPU-Assessment.json |
| Log | Troubleshooting the collector | <Computer>-IPU-Assessment.log |
| One result line | The automation platform (OpenText SA) | stdout, semicolon-delimited |
Default output folder: C:\Temp\IPU-Assessment.
For many servers, Merge-IPUAssessments.ps1 turns all the JSON results into a fleet overview:
| Output | For | File |
|---|---|---|
| Fleet overview | Whole estate at a glance, worst server first | IPU-Fleet-Overview.html |
| Servers sheet | One row per server, for Excel | IPU-Fleet-Servers.csv |
| Findings sheet | Every finding, one row each, for filtering | IPU-Fleet-Findings.csv |
flowchart LR
A[Run on server<br/>Mode Pre] --> B[Fast checks]
B --> C[Checkpoint report<br/>PARTIAL]
C --> D[Slow checks<br/>DISM, SFC, Setup scan]
D --> E[Final report<br/>HTML + JSON + log]
E --> F{Fix findings}
F --> G[Upgrade]
G --> H[Run again<br/>Mode Post]
H --> I[Before/after comparison]
E -.baseline JSON.-> H
It answers four questions:
- Is the path supported? Source release, edition and target, per Microsoft's installation-media table.
- Will the server and its workloads survive? SQL, Exchange, IIS, RDS, clustering, VMware, drivers, agents, antivirus/EDR, backup, certificates, removed or deprecated features.
- Is Windows healthy enough? Pending reboot, patch age, activation, disk space, DISM component store, SFC.
- Did anything get lost afterwards? Services, ports, routes, IP/DNS, hosts entries, applications, features and tasks, compared with the pre-upgrade snapshot.
Take it from the latest release, not from
main: a release is tested in CI and has SHA256SUMS.txt. Before you upload the script to OpenText SA, check
that its hash matches the one in SHA256SUMS.txt:
Get-FileHash .\Windows-IPU-Readiness-Assessment.ps1 -Algorithm SHA256The scripts are not code-signed yet (#14). If your servers enforce signed scripts, sign them with your organisation's certificate after checking the hash.
Run in an elevated session on the server (Windows PowerShell 4.0+):
# Pre-upgrade assessment, target Windows Server 2025
.\src\Windows-IPU-Readiness-Assessment.ps1
# Target 2022 instead
.\src\Windows-IPU-Readiness-Assessment.ps1 -TargetServerVersion 2022
# After the upgrade: compare with the pre-upgrade snapshot
.\src\Windows-IPU-Readiness-Assessment.ps1 -AssessmentMode PostThen open C:\Temp\IPU-Assessment\<Computer>-IPU-Assessment.html.
Collect each server's .json result into one folder, then run on an admin workstation (not on the servers):
.\src\Merge-IPUAssessments.ps1 -InputFolder 'D:\IPU\Results'flowchart LR
A[Server A<br/>.json] --> F[One folder]
B[Server B<br/>.json] --> F
C[Server C<br/>.json] --> F
F --> M[Merge-IPUAssessments.ps1]
M --> H[Fleet overview HTML]
M --> S[Servers CSV]
M --> X[Findings CSV]
Options (-OutputFolder, -Mode Pre|Post|All, -Delimiter) are in the user guide.
Full parameter reference, status meanings, SA usage and troubleshooting: User guide. What each of the 36 checks looks at and can report: Checks reference. What a report looks like: sample report (fictional server).
| Status | Meaning | Counts toward overall |
|---|---|---|
BLOCKER |
Do not upgrade until resolved | Yes |
ACTION |
Must be done as part of the change | Yes |
WARNING |
Plan for it | Yes |
MANUAL |
Cannot be proven by the script; a person must check | Yes |
OK |
Checked, fine | No |
INFO |
For visibility | No |
The overall status is the most severe finding.
The assessment is non-remediating. It never installs, removes or reconfigures anything.
- DISM runs
/ScanHealthonly; SFC runs/verifyonlyonly. LGPO.exeis used only with/b(backup) and/parse, never/gor/m.- No
Win32_Productquery. - Side effects, by design: report, log, JSON and evidence files are written. Only when
-TargetMediaPathis set is an ISO mounted and dismounted, and Setup's compatibility scan createsC:\$WINDOWS.~BT. - A crashed check is reported as
MANUAL: absence of findings in that area is not evidence of readiness.
Reports describe a server in detail (ports, tasks, certificates, agents). Treat them as sensitive. Folders the script creates are limited to SYSTEM and Administrators; an existing folder keeps its permissions, and the report warns if it is readable by ordinary users. Opt out with
-RestrictOutputAcl $false.
flowchart TD
R[IPU-ReadinessAssessment] --> S[src/<br/>assessment + fleet merge scripts]
R --> T[tests/<br/>Pester 5]
R --> D[docs/<br/>user guide, checks, schema, samples]
R --> G[.github/<br/>CI, templates, Dependabot]
R --> C[.claude/ and AGENTS.md<br/>shared AI workflow]
| Path | Contents |
|---|---|
src/ |
Windows-IPU-Readiness-Assessment.ps1 (runs on each server), Merge-IPUAssessments.ps1 (fleet overview, runs on a workstation) |
tests/ |
Pester tests: decision rules, every check against a simulated server, reports, redaction, and the fleet merge |
docs/user-guide.md |
How to run and interpret the assessment |
docs/checks.md |
What every check looks at and can report |
docs/result-schema.md, docs/result-schema.json |
JSON result format (IPU-Assessment/1) and its JSON Schema |
docs/samples/ |
Synthetic sample report and result, built by build/New-SampleReport.ps1 |
docs/adr/ |
Architecture decision records |
docs/review/ |
Repository quality reviews (newest: audit-review-claude-v2.md) |
.github/ |
CI, release and labeler workflows, issue forms, PR template, Dependabot, release notes config |
.claude/, AGENTS.md, CLAUDE.md |
Shared GitHub workflow skills, plugin settings and assistant guidance (see CONTRIBUTING) |
# Run the tests (Pester 5)
Invoke-Pester .\tests -Output DetailedTests load the script in library mode (IPU_ASSESSMENT_LIBRARY_ONLY=1): functions only, nothing is collected
from the machine. They need Windows and run the same in an elevated or a normal (unelevated) session: CI runs the
whole suite both ways (#126). Add -ExcludeTagFilter Integration to skip the tests that
start real processes. If your machine enforces a signed-script policy, start the session with
pwsh -ExecutionPolicy Bypass (process scope only). Details: user guide, Running the tests.
New contributor? Start with the Git setup guide. Contributing workflow and conventions: CONTRIBUTING.md. Security reports: SECURITY.md. Version history: CHANGELOG.md.
GPL-3.0. See LICENSE.