Why Disaster Recovery Testing Matters
Disaster recovery plans that are never tested are disaster plans that will fail when you need them most. On Windows Server 2022 environments, backups may silently fail, recovery procedures may have drifted from reality, and key personnel may have changed — none of which becomes apparent until an actual incident. DR testing validates that your recovery time objectives (RTO) and recovery point objectives (RPO) are achievable, identifies gaps in documentation, trains staff on recovery procedures, and satisfies audit requirements from frameworks such as ISO 27001, SOC 2, and NIST 800-34.
A mature DR testing programme moves beyond simple backup checks to include full application validation, network restoration, database consistency verification, and stakeholder communication drills. This article covers the complete DR testing process for Windows Server 2022 environments.
Defining RTO and RPO
Before testing, your organisation must have formally documented RTO and RPO targets for each system. These define what success looks like in a DR test:
Recovery Time Objective (RTO): The maximum acceptable time from the moment of failure to the moment the system is available to users. For example, an RTO of 4 hours means the system must be back online within 4 hours of a disaster. RTO drives infrastructure choices — a 4-hour RTO may be achievable with tape restore, while a 15-minute RTO requires hot standby or cloud failover.
Recovery Point Objective (RPO): The maximum acceptable amount of data loss measured in time. An RPO of 1 hour means you can tolerate losing up to 1 hour of data — meaning backups or replication must run at least every hour. An RPO of zero requires synchronous replication.
Document your RTO/RPO per system in a table stored in your DR runbook. A practical format:
# Example RTO/RPO documentation (stored as part of DR runbook)
System Name | Tier | RTO | RPO | Backup Method
---------------------|------|--------|---------|------------------
SQL-PROD-01 | 1 | 1 hr | 15 min | SQL Always On + Azure ASR
FILE-SERVER-01 | 2 | 4 hrs | 1 hr | Robocopy + Veeam
DC-01 (Domain Ctrl) | 1 | 2 hrs | 30 min | Active Directory + Veeam
WEB-APP-01 | 2 | 4 hrs | 2 hrs | Veeam Backup & Replication
MGMT-SERVER-01 | 3 | 8 hrs | 4 hrs | wbadmin full backup
DR Testing Methodologies
There are four main DR testing approaches, ordered by increasing thoroughness and disruption:
Tabletop Exercise: A discussion-based walkthrough where key personnel talk through the DR procedure step by step without actually executing anything. The facilitator presents a disaster scenario and team members describe what they would do at each step. Tabletops are low-risk and can be conducted in 2–4 hours. They are effective for identifying procedural gaps, training new staff, and reviewing updated runbooks. They do not validate that backups are valid or that systems actually recover.
Walkthrough Test: Team members actually review the DR runbook and verify that all prerequisites are in place — backup storage is accessible, recovery media exists, credentials are current, and contact lists are up to date. This is slightly more thorough than a tabletop but still does not involve actually restoring any system.
Simulation Test: A simulated disaster is declared for a subset of systems. Recovery procedures are executed in a non-production environment (isolated network or test lab). Systems are restored from backup and tested for functionality. Production is not interrupted. This is the most practical test type for regular use.
Full Interruption Test: Production systems are actually failed over or taken offline, and full recovery is performed. This is the most thorough test but carries the highest risk of extended downtime if the recovery fails. Full interruption tests should be rare (annually at most) and require executive sign-off, maintenance window scheduling, and rollback plans.
Testing Backup Restores with wbadmin
For Windows Server 2022 systems backed up with the built-in Windows Server Backup (wbadmin), restore testing involves selecting a backup version and restoring individual files or a full volume to a test location.
List available backups on a backup target:
wbadmin get versions -backupTarget:\backupserverWS2022Backups
Get details of a specific version (note the VersionIdentifier from the output above):
wbadmin get items -version:05/16/2026-23:00 -backupTarget:\backupserverWS2022Backups
Restore a specific folder to an alternate location for validation:
wbadmin start recovery `
-version:05/16/2026-23:00 `
-backupTarget:\backupserverWS2022Backups `
-itemType:File `
-items:C:DataCriticalDocs `
-recoveryTarget:D:TestRestoreCriticalDocs `
-quiet
After restore, validate file integrity by comparing checksums:
# Compare SHA256 hashes of original vs restored files
$sourceFiles = Get-ChildItem "C:DataCriticalDocs" -Recurse -File
$restoreFiles = Get-ChildItem "D:TestRestoreCriticalDocs" -Recurse -File
foreach ($src in $sourceFiles) {
$relPath = $src.FullName.Substring("C:DataCriticalDocs".Length)
$rst = Join-Path "D:TestRestoreCriticalDocs" $relPath
if (Test-Path $rst) {
$srcHash = (Get-FileHash $src.FullName -Algorithm SHA256).Hash
$rstHash = (Get-FileHash $rst -Algorithm SHA256).Hash
if ($srcHash -ne $rstHash) {
Write-Warning "HASH MISMATCH: $relPath"
}
} else {
Write-Warning "MISSING in restore: $relPath"
}
}
Write-Host "File integrity check complete."
VM Failover Testing with Hyper-V Replica
If you use Hyper-V Replica to replicate Windows Server 2022 VMs to a secondary Hyper-V host, a test failover creates a temporary copy of the replicated VM using a separate virtual switch (so it does not conflict with the production VM). This is non-disruptive — the primary VM keeps running and replication continues.
Initiate a test failover in PowerShell on the replica host:
# On the Replica Hyper-V host
Start-VMFailover -VMName "WEB-APP-01" -AsTest
# Start the test VM
Start-VM -Name "WEB-APP-01 - Test"
Connect to the test VM console and validate:
vmconnect.exe localhost "WEB-APP-01 - Test"
After validation, remove the test failover VM:
Stop-VMFailover -VMName "WEB-APP-01"
Check replication health after the test to confirm replication resumed normally:
Get-VMReplication -VMName "WEB-APP-01" |
Select-Object VMName, State, Health, LastReplicationTime, ReplicationFrequencySec
Azure Site Recovery Test Failover
For VMs replicated to Azure via Azure Site Recovery, test failovers can be triggered from the Azure portal or via PowerShell. A test failover boots the VM in an isolated Azure VNet without affecting the protected item or production replication:
$rpi = Get-AzRecoveryServicesAsrReplicationProtectedItem `
-Name "RP-WS2022-AppServer01" `
-ProtectionContainer $protectionContainer
# Get the latest application-consistent recovery point
$recoveryPoint = Get-AzRecoveryServicesAsrRecoveryPoint -ReplicationProtectedItem $rpi |
Where-Object { $_.RecoveryPointType -eq "AppConsistent" } |
Sort-Object RecoveryPointTime -Descending |
Select-Object -First 1
# Trigger test failover to isolated VNet
$testJob = Start-AzRecoveryServicesAsrTestFailoverJob `
-ReplicationProtectedItem $rpi `
-Direction PrimaryToRecovery `
-AzureVMNetworkId "/subscriptions//resourceGroups/rg-test/providers/Microsoft.Network/virtualNetworks/vnet-isolated" `
-RecoveryPoint $recoveryPoint
# Wait for completion
Get-AzRecoveryServicesAsrJob -Job $testJob | Wait-AzRecoveryServicesAsrJob
Once the VM is online in Azure, validate by connecting to it via Azure Bastion or RDP, checking that services are running, and running application-specific checks (e.g., querying a SQL Server database, verifying a web app responds on port 80/443).
Clean up after the test:
Start-AzRecoveryServicesAsrTestFailoverCleanupJob `
-ReplicationProtectedItem $rpi `
-Comment "DR test 2026-05-17: all checks passed"
Validating Application Functionality Post-Restore
Restoring a VM or file does not guarantee the application is working correctly. Post-restore validation should be scripted wherever possible to ensure consistent, repeatable checks. For a Windows Server 2022 IIS web application:
# Check IIS service is running on the restored server
$iisStatus = Invoke-Command -ComputerName "WEB-APP-01-TEST" -ScriptBlock {
Get-Service W3SVC | Select-Object Name, Status
}
if ($iisStatus.Status -ne "Running") {
Write-Error "IIS not running on restored server!"
}
# Check HTTP response
$response = Invoke-WebRequest -Uri "http://WEB-APP-01-TEST" -UseBasicParsing
if ($response.StatusCode -ne 200) {
Write-Error "HTTP check failed: $($response.StatusCode)"
} else {
Write-Host "HTTP check passed: 200 OK"
}
# Verify SQL Server connectivity from the web app server
$sqlCheck = Invoke-Command -ComputerName "WEB-APP-01-TEST" -ScriptBlock {
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=SQL-PROD-01;Database=AppDB;Integrated Security=True;Connect Timeout=5"
try { $conn.Open(); $conn.State } catch { "FAILED: $_" } finally { $conn.Close() }
}
Write-Host "SQL connectivity: $sqlCheck"
Documenting Test Results and Gaps
Every DR test must produce a written record. Create a test report that includes: date and time of test, systems tested, test type (tabletop/simulation/full), who participated, the simulated failure scenario, what passed, what failed, actual RTO/RPO achieved versus target, and corrective actions identified. Store this report with your DR runbook and track corrective actions in your change management system.
Example summary structure:
# DR Test Report - 2026-05-17
Test Type: Simulation (isolated environment)
Systems Tested: WEB-APP-01, SQL-PROD-01
Participants: SysAdmin1, DBAdmin1, AppOwner1
Results:
WEB-APP-01 restore from ASR test failover: PASSED
Actual RTO: 48 minutes (Target: 4 hrs) PASS
Actual RPO: 35 minutes (Target: 2 hrs) PASS
HTTP health check: PASS
SQL connectivity: PASS
SQL-PROD-01 backup restore (wbadmin):
Actual RTO: 3h 12min (Target: 1 hr) FAIL
Actual RPO: 18 minutes (Target: 15 min) FAIL (marginally)
Gaps Identified:
1. SQL restore took 3+ hrs - investigate Veeam instant recovery
2. wbadmin backup had a failed run on 2026-05-15 - investigate
3. DR runbook recovery steps for SQL outdated - update required
Corrective Actions:
Action 1: Evaluate Veeam Instant VM Recovery for SQL-PROD-01 (Owner: SysAdmin1, Due: 2026-06-01)
Action 2: Fix wbadmin backup failure on SQL-PROD-01 (Owner: SysAdmin1, Due: 2026-05-20)
Action 3: Update SQL recovery runbook section (Owner: DBAdmin1, Due: 2026-05-24)
Updating the DR Runbook
A DR runbook is only useful if it reflects current reality. After every test, review the runbook and update any steps that were inaccurate, missing, or outdated. Specifically verify: server names and IP addresses, credential locations (e.g., break-glass accounts in a password vault), backup locations, network topology diagrams, third-party vendor contact numbers, and escalation paths.
Store the runbook in at least two locations — one on-premises (printed copy or local share) and one in a cloud repository (SharePoint, Azure DevOps, or a secure cloud storage location) so it is accessible even if the on-premises environment is unavailable. Version-control the runbook to maintain history of changes.
DR Testing Frequency Best Practices
Industry guidance and compliance frameworks generally recommend the following DR testing schedule:
Monthly: Automated backup validation — verify that the last backup completed successfully, the backup file is restorable (test a file restore), and backup logs show no errors. This can be fully automated with a PowerShell script that runs after each backup job.
Quarterly: Simulation test for Tier 1 systems. Restore VMs in an isolated environment and validate application functionality against your checklist. Document results.
Annually: Tabletop exercise including business stakeholders for all critical systems. Consider a full interruption test for one Tier 1 system per year during a scheduled maintenance window.
On major change: After any significant infrastructure change (new server, DR site change, backup tool upgrade, network reconfiguration), run a simulation test for affected systems before the change goes into production.
Notifying Stakeholders
DR tests should follow a defined communication process. Before the test: notify the change management board, inform application owners, and schedule the test during a low-impact window. During the test: maintain a live status log in a shared location (Teams channel, shared document) so all participants can see progress. After the test: send a brief executive summary covering what was tested, pass/fail results, and corrective actions. For compliance audits, retain all DR test records for a minimum of three years, or as required by your applicable framework.