Version: 1.0
Last Updated: October 28, 2025
Author: Adrian Johnson adrian207@gmail.com
Classification: Internal Use
| Old Command (v2.0) | New Command (v3.0) |
|---|---|
.\AD-Repl-Audit.ps1 -DomainName "domain.com" -TargetDCs "DC01","DC02" |
.\Invoke-ADReplicationManager.ps1 -Mode Audit -DomainControllers DC01,DC02 -DomainName "domain.com" |
.\AD-ReplicationRepair.ps1 -AutoRepair |
.\Invoke-ADReplicationManager.ps1 -Mode Repair -AutoRepair -DomainControllers DC01,DC02 |
| N/A (ran both scripts) | .\Invoke-ADReplicationManager.ps1 -Mode AuditRepairVerify -DomainControllers DC01,DC02 |
| Old | New | Notes |
|---|---|---|
-TargetDCs |
-DomainControllers |
More descriptive |
| N/A | -Mode |
Required change: Choose Audit, Repair, Verify, or AuditRepairVerify |
| N/A | -Scope |
New feature: Forest, Site:<name>, or DCList (default) |
Console Output
- Old:
Write-Hosteverywhere (colorful but not pipeline-friendly) - New:
Write-Verbose,Write-Information,Write-Warning,Write-Error - Impact: Use
-Verboseto see detailed output,-InformationAction Continuefor progress
File Outputs
- Old:
RepairReport.json,RepairSummary.html, various CSVs - New:
summary.json(CI-friendly), CSVs (consistent naming),execution.log - Impact: Update any parsing scripts to use
summary.json
Default Behavior
- Old: Audit runs automatically, repair requires prompt
- New: Mode defaults to
Audit(safe), must explicitly chooseRepair
Scope Safety
- Old: No target = all DCs (risky)
- New: Must specify
-DomainControllersor-Scope Forest/Site:<name> - Impact: Prevents accidental forest-wide operations
Exit Codes
- Old:
exit 0orexit 1 - New:
0=healthy,2=issues,3=unreachable,4=error - Impact: Update CI/CD scripts to handle new codes
# Old way (audit only)
.\AD-Repl-Audit.ps1 -DomainName "test.lab" -TargetDCs "TESTDC01","TESTDC02"
# New way (equivalent)
.\Invoke-ADReplicationManager.ps1 `
-Mode Audit `
-DomainControllers TESTDC01,TESTDC02 `
-DomainName "test.lab" `
-VerboseValidate:
- Check CSV exports match expected format
- Verify
summary.jsoncontains expected fields - Confirm exit code logic (0=healthy, 2=issues)
# See what repairs would do without executing
.\Invoke-ADReplicationManager.ps1 `
-Mode Repair `
-DomainControllers DC01,DC02 `
-WhatIfValidate:
- Review all "What if:" messages
- Ensure no unexpected actions
- Confirm targeting is correct
# Old way
.\AD-ReplicationRepair.ps1 -TargetDCs "DC01","DC02"
# (prompted for approval)
# New way (equivalent)
.\Invoke-ADReplicationManager.ps1 `
-Mode Repair `
-DomainControllers DC01,DC02 `
-AuditTrail
# (prompted for approval, with transcript)Validate:
- Review transcript log in output directory
- Compare repair actions to old script behavior
- Check all issues were addressed
Old Task:
PowerShell.exe -ExecutionPolicy Bypass -File "C:\Scripts\AD-Repl-Audit.ps1" -DomainName "corp.com" -AutoRepairNew Task:
PowerShell.exe -ExecutionPolicy Bypass -File "C:\Scripts\Invoke-ADReplicationManager.ps1" `
-Mode AuditRepairVerify `
-Scope Site:HQ `
-AutoRepair `
-AuditTrail `
-OutputPath "C:\Reports\AD-Health"Key Changes:
- Add
-Mode AuditRepairVerifyfor full workflow - Use
-Scopefor better targeting - Add
-AuditTrailfor compliance - Specify
-OutputPathfor consistent location
Old CI Script:
.\AD-Repl-Audit.ps1 -DomainName "prod.com"
if ($LASTEXITCODE -ne 0) {
throw "Audit failed"
}New CI Script:
.\Invoke-ADReplicationManager.ps1 -Mode Audit -Scope Site:Production
$summary = Get-Content ".\ADRepl-*\summary.json" | ConvertFrom-Json
# Rich exit code handling
switch ($summary.ExitCode) {
0 { Write-Host "✓ All DCs healthy" }
2 { throw "Issues detected: $($summary.IssuesFound)" }
3 { throw "Unreachable DCs: $($summary.UnreachableDCs)" }
4 { throw "Execution error" }
}| Feature | v2.0 Scripts | v3.0 Script | Notes |
|---|---|---|---|
| Audit-only mode | ✓ (AD-Repl-Audit.ps1) | ✓ -Mode Audit |
|
| Repair operations | ✓ (AD-ReplicationRepair.ps1) | ✓ -Mode Repair |
Now with ShouldProcess |
| Verification | ✓ (built into repair) | ✓ -Mode Verify |
Can run standalone |
| Auto-repair | ✓ -AutoRepair |
✓ -AutoRepair |
|
| Custom output path | ✓ -OutputPath |
✓ -OutputPath |
|
| Target specific DCs | ✓ -TargetDCs |
✓ -DomainControllers |
Renamed |
| CSV export | ✓ | ✓ | Improved consistency |
| JSON export | ✓ (complex) | ✓ (CI-friendly) | Simplified for automation |
| HTML report | ✓ | ⚠ Removed | Use CSV + BI tools |
| Verbose logging | ⚠ Write-Host only | ✓ Write-Verbose | Pipeline-friendly |
| WhatIf support | ✗ | ✓ | Preview changes |
| Confirm prompts | ⚠ Custom | ✓ Built-in | Standard PowerShell |
| Transcript logging | ✗ | ✓ -AuditTrail |
Compliance feature |
| Parallel processing | ✗ | ✓ (PS7+) | 80-90% faster |
| Scope controls | ✗ | ✓ -Scope |
Safety feature |
| Exit codes | ⚠ 0/1 only | ✓ 0/2/3/4 | Richer status |
| Error handling | ⚠ Basic | ✓ Comprehensive | Targeted try/catch |
| Parameter validation | ⚠ Limited | ✓ Extensive | ValidateSet, Range, Script |
Before:
# Cron job / Task Scheduler
.\AD-Repl-Audit.ps1 -DomainName "company.com" -OutputPath "C:\Reports\Daily"After:
.\Invoke-ADReplicationManager.ps1 `
-Mode Audit `
-Scope Forest `
-OutputPath "C:\Reports\Daily\$(Get-Date -Format 'yyyy-MM-dd')" `
-Confirm:$falseBenefits: Explicit scope, date-stamped folders, cleaner exit codes
Before:
# Manual run during incident
.\AD-ReplicationRepair.ps1 -TargetDCs "DC01","DC02" -AutoRepair -OutputPath "C:\Incidents\Case123"After:
.\Invoke-ADReplicationManager.ps1 `
-Mode AuditRepairVerify `
-DomainControllers DC01,DC02 `
-AutoRepair `
-AuditTrail `
-OutputPath "C:\Incidents\Case123"Benefits: Full workflow in one run, audit trail for incident review
Before:
# Run audit after Windows updates
.\AD-Repl-Audit.ps1 -DomainName "domain.com"
# Manually inspect outputAfter:
.\Invoke-ADReplicationManager.ps1 `
-Mode Audit `
-Scope Site:HQ `
-OutputPath "C:\Maintenance\Post-Patch-$(Get-Date -Format 'yyyyMMdd')"
# Parse results programmatically
$summary = Get-Content "C:\Maintenance\Post-Patch-*\summary.json" | ConvertFrom-Json
if ($summary.IssuesFound -gt 0) {
Send-MailMessage -To "admins@company.com" -Subject "Post-patch issues detected" -Body "Review: $($summary.OutputPath)"
}Benefits: Machine-readable output, automation-friendly
Cause: Conflicting parameters (old script names still in command)
Solution:
# Wrong
.\Invoke-ADReplicationManager.ps1 -TargetDCs DC01,DC02
# Correct
.\Invoke-ADReplicationManager.ps1 -DomainControllers DC01,DC02Cause: New script uses proper output streams, not Write-Host
Solution:
# Add -Verbose for detailed output
.\Invoke-ADReplicationManager.ps1 -Mode Audit -DomainControllers DC01,DC02 -Verbose
# Or enable Information stream
.\Invoke-ADReplicationManager.ps1 -Mode Audit -DomainControllers DC01,DC02 -InformationAction ContinueCause: Default scope requires explicit DC list
Solution:
# Option 1: Provide DC list
.\Invoke-ADReplicationManager.ps1 -Mode Audit -DomainControllers DC01,DC02
# Option 2: Use discovery scope
.\Invoke-ADReplicationManager.ps1 -Mode Audit -Scope Forest
# Option 3: Target specific site
.\Invoke-ADReplicationManager.ps1 -Mode Audit -Scope Site:Default-First-Site-NameCause: New script has richer exit codes (2 = issues detected but handled)
Solution:
# Old CI logic
if ($LASTEXITCODE -ne 0) { throw "Failed" }
# New CI logic (accept 0 or 2)
if ($LASTEXITCODE -in @(3,4)) {
throw "Critical failure"
} elseif ($LASTEXITCODE -eq 2) {
Write-Warning "Issues detected but handled"
}If migration encounters issues:
-
Keep old scripts in place with
-v2suffix:Rename-Item AD-Repl-Audit.ps1 AD-Repl-Audit-v2.ps1 Rename-Item AD-ReplicationRepair.ps1 AD-ReplicationRepair-v2.ps1
-
Update scheduled tasks to point to v2 scripts temporarily
-
Document issues encountered for resolution
-
Test v3 in isolation until stable
-
Gradually migrate one use case at a time
- Script Location:
Invoke-ADReplicationManager.ps1 - Documentation:
README-ADReplicationManager.md - This Guide:
MIGRATION-GUIDE.md
For questions or issues during migration:
- Review
execution.login output directory - Check
summary.jsonfor structured data - Use
-WhatIfto preview behavior - Test with
-Verbosefor detailed logging
- Week 1: Lab testing, validate outputs
- Week 2: Production testing (audit-only, manual runs)
- Week 3: Interactive repairs with
-AuditTrail - Week 4: Update scheduled tasks with
-AutoRepair - Week 5: CI/CD integration with
summary.json - Week 6: Decommission old scripts
Migration is complete when:
- All scheduled tasks use new script
- CI/CD pipelines parse
summary.json - No dependencies on old script outputs
- Team trained on new parameters
- Documentation updated
- Old scripts archived (not deleted)
Prepared by:
Adrian Johnson
Email: adrian207@gmail.com
Role: Systems Architect / PowerShell Developer
Organization: Enterprise IT Operations
Version History:
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0 | 2025-10-28 | Adrian Johnson | Initial migration guide for v2.0 to v3.0 |
Copyright © 2025 Adrian Johnson. All rights reserved.