Series: SharePoint 2019 → Subscription Edition Migration · Post 11 of 12
Reading time: ~18 minutes
Audience: SharePoint Administrators, Migration Project Managers, IT Leadership / CIO
It is 7 a.m. The cutover window closed three hours ago. Sites are up. Databases are mounted. Users are logging in. You have been awake since yesterday afternoon, and somewhere between the final smoke test and the “all clear” on the team call, you let yourself feel something close to relief.
Then the Slack message arrives. It’s the PM: “Can you put together something for the CIO? She wants a summary of how the migration went.”
You have nothing ready to send.
You know the migration worked — you were there. But knowing something happened and being able to prove it happened are two entirely different things. The PM doesn’t want your certainty. She wants a document. The CIO wants a number. The compliance officer, who you just noticed has sent a separate email, wants a side-by-side comparison of permission settings before and after.
This is the gap that post-migration validation closes. Not because the technical work isn’t done — it is. But because a migration that cannot be documented might as well not have happened, as far as every stakeholder above the server room is concerned.
This post gives you the framework and the eight scripts to produce that documentation: a three-level validation model, a per-agency health card for every department head, an executive summary ready for the CIO, and a compliance comparison that satisfies an auditor. By the end, you will have a complete migration sign-off package that converts a successful technical event into a closed project.
All eight scripts covered in this post are part of the Complete SP2019 → SPSE Migration Toolkit. More on that at the end.
Why Post-Migration Validation Is Non-Negotiable
Three things happen when you skip formal validation and rely on spot-checks instead.
First, silent failures go undetected. A database mount can succeed — SharePoint reporting no errors, Central Administration showing Ready — while a small number of site collections are orphaned or inaccessible. This happens when a database has orphaned site IDs that conflict with the SPSE configuration database. The mount completes. The sites never appear. Nobody notices until a department head asks why their team site is missing. Running a post-migration inventory scan and comparing it to your pre-migration snapshot catches this in the first hour, not six months later.
Second, compliance does not migrate automatically. Storage quotas travel with the content database, but quota enforcement behaviour can differ between SP2019 and SPSE depending on how policies are applied at the web application level. External sharing settings, permission inheritance structures, and lock states need explicit verification — they cannot be assumed. If a site was locked ReadOnly on SP2019 for compliance reasons and that state did not carry through correctly, you have a compliance incident waiting to happen.
Third, stakeholders require evidence. A verbal “it worked” is not a project deliverable. Every migration that involves a change record, a compliance audit, or a formal sign-off milestone requires documented output. If the CIO is closing a budget line, she needs a number. If the CAB is closing the change record, they need an output artefact. “We checked and it looked fine” has never satisfied an audit.
The framework for this post is a three-level validation model. Technical validation confirms databases and sites are present and accounted for. Functional validation confirms the platform is usable — search works, sites load, content is accessible. Compliance validation confirms that policy, quota, and permission configurations survived the migration intact. Each level has its own scripts. All three feed into the sign-off package.
| Validation Level | What It Confirms | Scripts |
|---|---|---|
| Technical | All databases mounted, site counts match pre-migration snapshot, no missing content | Get-SPMigrationInventory.ps1, Compare-MigrationSnapshots.ps1, Test-SPMountCompatibility.ps1 |
| Functional | Sites load, search is crawling, index is healthy, content sources active | Get-SPSearchHealthAudit.ps1 |
| Compliance | Quotas, permissions, policy settings, and lock states are correct | Get-SPSiteCompliance.ps1, Compare-SPCompliance.ps1, Generate-AgencyHealthCards.ps1, Get-MigrationExecutiveSummary.ps1 |
Work through all three levels in sequence. Do not skip to compliance reporting before the inventory comparison is clean. A compliance report built on top of a farm with missing databases is a confidence problem, not a deliverable.

Level 1 — Technical Validation: Did Everything Actually Migrate?
Technical validation is the foundation. Before you report anything to anyone, you need to confirm that every database that was supposed to migrate is mounted, every site collection that was supposed to exist is present, and the numbers match what you recorded before the migration began.
Running the Post-Migration Inventory Scan
Get-SPMigrationInventory.ps1 scans the SPSE farm and produces a structured inventory of all mounted content databases and their site collections. It connects to the SPSE configuration database, enumerates all web applications and their attached content databases, queries site collection counts per database, and outputs a consolidated report.
Run this immediately after the cutover completes — before you start validating anything else.
# Get-SPMigrationInventory.ps1 — post-migration inventory scan# Enumerates all content databases and site collections on the SPSE farm$params = @{ WebApplicationUrls = @( "https://intranet.contoso.com", "https://mysite.contoso.com", "https://portal.contoso.com" ) OutputPath = "C:\MigrationValidation\PostMigration-Inventory.csv" IncludeSiteDetails = $true}.\Get-SPMigrationInventory.ps1 @params# Sample output:## DBName WebAppUrl SiteCount MountStatus LastModified# ------ --------- --------- ----------- ------------# SP_Content_Intranet https://intranet.contoso.com 142 Mounted 2025-09-14 04:12# SP_Content_MySite https://mysite.contoso.com 89 Mounted 2025-09-14 04:15# SP_Content_DeptA https://portal.contoso.com 34 Mounted 2025-09-14 04:18# SP_Content_DeptB_Archive https://portal.contoso.com 12 Mounted 2025-09-14 04:19
Every row represents a mounted content database. If a database that should be here is absent, MountStatus will show Missing — the script detects this by comparing the farm’s content database list against the input parameter set. A clean output where every expected database shows Mounted with a non-zero SiteCount is the first row of your sign-off package.
Comparing Pre- and Post-Migration Snapshots
The inventory scan tells you what is on the SPSE farm now. The snapshot comparison tells you whether that matches what was on the SP2019 farm before you started.
In Post #2 — Farm Inventory Before Migration, you ran Get-SPInventoryReport.ps1 against the source SP2019 farm and saved the output. That file is the pre-migration snapshot. Compare-MigrationSnapshots.ps1 loads both snapshots and produces a discrepancy report.
# Compare-MigrationSnapshots.ps1 — pre/post inventory comparison# Flags missing databases, missing site collections, and count mismatches$params = @{ PreMigrationSnapshot = "C:\MigrationValidation\PreMigration-Snapshot.csv" PostMigrationSnapshot = "C:\MigrationValidation\PostMigration-Inventory.csv" OutputPath = "C:\MigrationValidation\Snapshot-Comparison.csv" SeverityThreshold = "Warning" # Report Warning and Critical only}.\Compare-MigrationSnapshots.ps1 @params# Sample output:## Item SnapshotState CurrentState DiscrepancyType Severity# ---- ------------- ------------ --------------- --------# SP_Content_DeptC Present (18) Missing MissingDB Critical# SP_Content_DeptA Present (34) Present (34) None OK# SP_Content_MySite Present (89) Present (89) None OK# SP_Content_Intranet Present (142) Present (141) CountMismatch Warning
The DiscrepancyType column will show one of three values:
- MissingDB — database present in the pre-migration snapshot, not found on SPSE. This is a Critical finding. Do not continue reporting until it is resolved or formally documented as out of scope.
- MissingSite — database is mounted but a specific site URL present before migration is not found. Less common, but possible if the database was restored from a backup taken before a recent site creation.
- CountMismatch — database is mounted with a different site collection count than the snapshot recorded. Requires investigation before sign-off.
If
Compare-MigrationSnapshots.ps1returns zero discrepancies across all databases, screenshot it and label it Exhibit A. That is your clean technical sign-off in a single image. Everything else you produce builds on that foundation.
Mount Compatibility Audit
Before closing Level 1, run a compatibility audit against all mounted content databases. Test-SPMountCompatibility.ps1 checks whether the schema version of each database aligns with the SPSE build level. This matters more than it sounds: a database mounted without completing a schema upgrade will work fine today but will fail when you apply a SPSE Cumulative Update in three months.
# Test-SPMountCompatibility.ps1 — schema version audit for all mounted databases# Run against SPSE farm post-cutover to catch any compatibility gaps$params = @{ WebApplicationUrl = "https://intranet.contoso.com" OutputPath = "C:\MigrationValidation\MountCompatibility-Audit.csv" CheckAllWebApps = $true}.\Test-SPMountCompatibility.ps1 @params# Sample output:## DBName SchemaVersion RequiredVersion IsCompatible ActionRequired# ------ ------------- --------------- ------------ --------------# SP_Content_Intranet 15.0.5579.1000 15.0.5579.1000 True None# SP_Content_DeptA 15.0.4571.1506 15.0.5579.1000 False Run schema upgrade# SP_Content_MySite 15.0.5579.1000 15.0.5579.1000 True None
Any row showing IsCompatible = False represents a database where the schema upgrade step was either skipped or failed silently during the mount process. The ActionRequired field tells you what to run. Address these before the validation is considered complete.
If you told yourself “we’ll fix the schema version later” during the cutover window — this is later. Resolve
IsCompatible = Falseentries before signing off Level 1.
Level 2 — Functional Validation: Are Sites and Search Working?
A database is mounted and site collections are present. That’s Level 1. Level 2 asks the harder question: is the platform actually usable? Sites loading is not the same as search working, and search not working is the most common source of post-migration user complaints in the first two weeks.
Auditing Search Health After Migration
Search is the highest-risk functional area in any post-migration SPSE environment. When you attach a content database, SharePoint does not automatically trigger a crawl of the newly mounted content. The search index has no awareness of sites that arrived via database attach. Until a full crawl runs, every site collection in every migrated database is invisible to search results — users will get zero results for queries that previously returned hundreds.
Get-SPSearchHealthAudit.ps1 examines the Search Service Application and produces a structured health report per content source.
# Get-SPSearchHealthAudit.ps1 — post-migration search health audit# Checks crawl state, index health, and content source status$params = @{ SearchServiceApplication = "Search Service Application" OutputPath = "C:\MigrationValidation\SearchHealth-Audit.csv" IncludeIndexStats = $true}.\Get-SPSearchHealthAudit.ps1 @params# Sample output:## ContentSource CrawlStatus ItemsIndexed LastCrawlDuration Errors HealthStatus# ------------- ----------- ------------ ----------------- ------ ------------# Local SharePoint Idle 0 Never 0 WARNING: No crawl since mount# News Sites Idle 1,240 2h 14m (pre-mig) 0 WARNING: Stale (>48h)# File Shares Completed 8,302 44m 0 OK# People Search Idle 0 Never 0 WARNING: No crawl since mount
Common post-migration search findings this audit surfaces:
HealthStatus: WARNING — No crawl since mount— the content source has never been crawled on the SPSE farm. All content mounted via database attach falls into this category until a full crawl runs. This is normal; it just needs to be scheduled and tracked.HealthStatus: WARNING — Stale (>48h)— the crawl ran on the pre-migration farm and that state carried forward, but no crawl has run since the content was attached to SPSE.- Search index health warnings from the SP2019 farm — if the SP2019 index had unresolved errors before migration, those don’t vanish on SPSE. The audit surfaces them explicitly.
After reviewing the audit output, trigger a full crawl on all content sources:
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue$ssa = Get-SPEnterpriseSearchServiceApplication -Identity "Search Service Application"foreach ($source in (Get-SPEnterpriseSearchCrawlContentSource -SearchApplication $ssa)) { Write-Host "Starting full crawl: $($source.Name)" $source.StartFullCrawl()}
A full crawl across a medium-sized farm (50–100 content databases, 200–400 site collections) typically takes 4–8 hours. Document the start time, schedule a re-run of Get-SPSearchHealthAudit.ps1 the following morning, and include the crawl start event in your sign-off package timeline.
Level 3 — Compliance Validation: Did Policies and Permissions Survive?
Technical and functional validation confirm the farm is present and operational. Compliance validation confirms it is correctly configured. This is the layer that matters to security teams, compliance officers, and auditors — and it is the one most likely to surface unexpected changes introduced by the database-attach process.
Running the Site Compliance Scan
Get-SPSiteCompliance.ps1 scans every site collection across specified web applications and checks three compliance dimensions: storage quotas, permissions model, and policy settings.
# Get-SPSiteCompliance.ps1 — site-level compliance audit# Checks storage quotas, permission inheritance, and policy settings$params = @{ WebApplicationUrls = @( "https://intranet.contoso.com", "https://portal.contoso.com" ) OutputPath = "C:\MigrationValidation\PostMigration-Compliance.csv" FlagExceededQuotas = $true FlagUniquePerms = $true}.\Get-SPSiteCompliance.ps1 @params# Sample output:## SiteUrl QuotaStatus PermissionsInherited ExternalSharing PolicyCompliance# ------- ----------- -------------------- --------------- ----------------# https://intranet.contoso.com/sites/hr OK True Disabled OK# https://intranet.contoso.com/sites/legal Exceeded False (12 unique) Disabled OK# https://portal.contoso.com/sites/deptA OK True Disabled OK# https://portal.contoso.com/sites/project1 OK False (3 unique) Enabled WARNING
QuotaStatus: Exceeded means the site collection has consumed more storage than its allocated quota. This is common post-migration and often indicates that quotas were configured differently on SP2019 — or that the quota policy applied at the web application level on SPSE is tighter than the source farm’s settings.
PolicyCompliance: WARNING for project1 here indicates that external sharing is enabled — a setting that needs verification before the site is declared compliant, particularly if the source SP2019 environment was on-premises with no external sharing.
Comparing Compliance State Before and After Migration
The site compliance scan tells you the current state. Compare-SPCompliance.ps1 tells you whether that state matches the pre-migration baseline recorded from SP2019.
If you generated a compliance report from the SP2019 farm before cutover (the equivalent of running this script against the source), you now have both sides of the comparison.
# Compare-SPCompliance.ps1 — before/after compliance comparison# Flags regressions in quota, permissions, and policy settings$params = @{ PreMigrationReport = "C:\MigrationValidation\PreMigration-Compliance.csv" PostMigrationReport = "C:\MigrationValidation\PostMigration-Compliance.csv" OutputPath = "C:\MigrationValidation\Compliance-Comparison.csv" ReportRegressionsOnly = $true}.\Compare-SPCompliance.ps1 @params# Sample output:## SiteUrl Dimension Before After Delta# ------- --------- ------ ----- -----# https://intranet.contoso.com/sites/legal QuotaStatus OK Exceeded REGRESSION# https://portal.contoso.com/sites/project1 ExternalSharing Disabled Enabled REGRESSION# https://portal.contoso.com/sites/deptB UniquePermissions False True (7 added) REGRESSION
REGRESSION in the Delta column means the compliance state on SPSE is worse than what was recorded on SP2019. These are the entries that need investigation and remediation before the compliance layer of the sign-off package is complete.
The unique permissions drift on deptB is a common artefact of the database-attach process. Subsites that had unique permissions in a database backed up at a different time than their parent site can arrive with permission configurations the parent site no longer recognises as inherited. Validate each regression, correct the configuration, and document the resolution.
Health Cards — The Per-Agency Validation Deliverable
The three validation levels above produce outputs for the admin and the compliance team. Health cards are the outputs for everyone else — department heads, business unit leads, and agency IT liaisons who need to know their team’s sites are live, accessible, and compliant, but who are not going to open a CSV file and read a table.
Generate-AgencyHealthCards.ps1 takes the outputs of the inventory scan and compliance audit and produces a formatted health card per agency or department.
# Generate-AgencyHealthCards.ps1 — per-agency health card reports# Requires a department-to-site-collection mapping CSV as input$params = @{ AgencyMappingFile = "C:\MigrationConfig\Agency-SiteMapping.csv" InventoryReport = "C:\MigrationValidation\PostMigration-Inventory.csv" ComplianceReport = "C:\MigrationValidation\PostMigration-Compliance.csv" OutputDirectory = "C:\MigrationValidation\HealthCards" OutputFormat = "HTML" ReportDate = (Get-Date -Format "yyyy-MM-dd")}.\Generate-AgencyHealthCards.ps1 @params# Output per agency (e.g., HealthCard-DeptFinance-2025-09-14.html):## AgencyName TotalSites SitesMigrated ComplianceStatus StorageUsedGB LastCrawled# ---------- ---------- ------------- ---------------- ------------- -----------# Finance 12 12 OK 44.2 GB Pending crawl# Legal 8 8 WARNING (1 site) 28.7 GB Pending crawl# HR 15 14 OK 61.0 GB Pending crawl
What a health card shows the department head:
- All sites in their area, with migration status (Migrated / Not Found)
- Storage usage and quota status
- Compliance flags — quota, permissions, and policy — with green/amber/red indicators
- Search status — whether the sites are indexed and searchable
- Open issues requiring admin follow-up, with a resolution date estimate
- Card generation date and validation schema version
The AgencyMappingFile is a CSV that maps site collection URLs to agency or department names. For organisations with 50+ departments, this CSV approach scales cleanly — you run the script once and it generates one card per agency without manual per-department invocations.
Health cards are appropriate for emailing directly to department heads. They require no SharePoint knowledge to read and answer the one question a business lead cares about: are my team’s sites working correctly?
Building a clean, stakeholder-appropriate health card output from scratch is 4–6 hours of formatting and export work. Generate-AgencyHealthCards.ps1 produces the full set in minutes from the reports you have already generated.
The Migration Executive Summary — Closing the Project Formally
The health cards handle the department layer. The executive summary handles the leadership layer.
Get-MigrationExecutiveSummary.ps1 generates the document that a CIO or IT Director reads to confirm the migration succeeded and close the project. It aggregates data from the inventory report, compliance comparison, and validation outputs into a single structured summary. Most admins are uncomfortable writing executive summaries — the script removes the need by generating one from the validation data you have already collected.
# Get-MigrationExecutiveSummary.ps1 — executive migration summary# Aggregates inventory, compliance, and search validation results$params = @{ InventoryReport = "C:\MigrationValidation\PostMigration-Inventory.csv" SnapshotComparison = "C:\MigrationValidation\Snapshot-Comparison.csv" ComplianceReport = "C:\MigrationValidation\Compliance-Comparison.csv" SearchAuditReport = "C:\MigrationValidation\SearchHealth-Audit.csv" MigrationStartDate = "2025-09-01" CutoverDate = "2025-09-14" PreparedBy = "SharePoint Administration Team" OutputPath = "C:\MigrationValidation\Migration-ExecutiveSummary.html"}.\Get-MigrationExecutiveSummary.ps1 @params# Sample summary output:## Metric Value# ------ -----# Total DBs Planned 28# Total DBs Migrated 27# Migration Success Rate 96.4%# Total Site Collections 294# Sites Migrated 291# Cutover Date 14 September 2025# Validation Completion 15 September 2025# Open Issues 3 (1 Critical, 2 Warning)# Technical Validation PASS# Functional Validation PENDING (full crawl in progress)# Compliance Validation PASS (3 regressions documented)# Prepared By SharePoint Administration Team
The HTML output is formatted for email delivery to leadership — structured sections, a summary table, and a status block showing each validation layer’s result. The PM attaches the HTML file to the change record and emails the summary table to the CIO, IT Director, and project sponsor.
MigrationSuccessRate drives the executive conversation. A 96.4% success rate means 27 of 28 databases migrated cleanly. The one exception is documented with a remediation status — which is exactly what stakeholders need to hear. The number closes the project budget line. The documented exception prevents it from becoming an unresolved question six months later.
Handling Discrepancies Found in Validation
The validation scripts will find something. That is not a failure — it is the point. A discrepancy found at 7 a.m. by your scripts is better than one found at 3 p.m. by a department head.
When a script flags an issue, the response follows three triage categories:
1. Missing databases or site collections. Check the mount log from Post #8 — Cutover Playbook for the specific database. Was it in scope? Was there a mount error that was logged and bypassed? Check the SQL restore log to confirm the database exists on the SPSE SQL instance and was not skipped. If it was never mounted due to a cutover error, mount it now. If it was explicitly deferred, document the deferral in the sign-off package. Do not communicate a database as missing to stakeholders before you know whether it was in scope for this migration window.
2. Compliance drift. Evaluate severity. A storage quota change is low risk and easily corrected with Set-SPSite -Url ... -MaxSize. A permission model change affecting a sensitive legal or HR site collection requires immediate investigation and potentially a compliance incident notification depending on your organisation’s policies. If unique permissions were added to subsites that should be inheriting, verify the membership of those unique permission groups before declaring the site compliant.
3. Search health failures. Most are resolved by a full crawl. Document the finding, confirm the full crawl is running, and schedule a re-run of Get-SPSearchHealthAudit.ps1 the following morning. Search health should reach a green state within 24–48 hours of cutover for most farm sizes. If content sources are still showing errors after the first full crawl completes, engage with the search topology configuration covered in Post #10 — Search Architecture.
Every discrepancy found by the validation scripts is better than one found by a user six months later. Document it, assign it, resolve it — that is what the sign-off package is for.
The sign-off package is not only submitted when everything is perfect. It is submitted when every finding is either resolved or formally accepted as a known issue with a remediation plan. That distinction matters: a package with three documented, owned exceptions is a legitimate sign-off. A verbal “all good” with zero documentation is not.
Assembling the Migration Sign-Off Package
Every script in this post generates one component of the sign-off package. Here is how those components map to the deliverables and their audiences.
| Document | Generated By | Audience | Status Criteria |
|---|---|---|---|
| Post-migration inventory report | Get-SPMigrationInventory.ps1 | Admin / PM | All expected DBs present, MountStatus: Mounted |
| Snapshot comparison report | Compare-MigrationSnapshots.ps1 | Admin / PM | Zero Critical discrepancies; Warnings documented |
| Mount compatibility audit | Test-SPMountCompatibility.ps1 | Admin | All IsCompatible: True; exceptions remediated |
| Search health audit | Get-SPSearchHealthAudit.ps1 | Admin | Full crawl initiated; rerun shows Completed status |
| Site compliance report | Get-SPSiteCompliance.ps1 | Admin / Compliance | Regressions identified and assigned |
| Pre/post compliance comparison | Compare-SPCompliance.ps1 | Admin / Compliance | All regressions resolved or formally accepted |
| Agency health cards | Generate-AgencyHealthCards.ps1 | Department Leads | Distributed to department heads with open issues noted |
| Executive summary | Get-MigrationExecutiveSummary.ps1 | CIO / IT Director / PM | Technical and Compliance layers PASS; Functional PASS after crawl |
Delivery workflow: The admin compiles all eight report files into a single dated folder (e.g., Migration-SignOff-2025-09-15/) and hands it to the PM. The PM attaches the folder to the change record, emails the executive summary HTML to leadership, and distributes health cards to department heads. The migration project is formally closed when:
- The CIO or IT Director acknowledges the executive summary (reply email or formal sign-off in the ITSM system)
- All Critical discrepancies are resolved and documented
- The change record is closed in the ITSM tool
- Health cards have been delivered and any department-level issues are tracked
That is a closed migration. Not “it’s done, trust us” — a documented, signed, filed artefact that survives the next audit.

Post-Migration Validation Checklist
Work through this checklist after every migration. It maps directly to the three validation levels and the sign-off package above.
Technical Validation
Get-SPMigrationInventory.ps1run against all web applications — output saved- All expected content databases show
MountStatus: Mounted - All site collection counts are non-zero for mounted databases
Compare-MigrationSnapshots.ps1run — pre/post snapshot comparison complete- Zero
Criticaldiscrepancies; allWarningentries investigated and documented Test-SPMountCompatibility.ps1run against all content databases- All databases show
IsCompatible: True, or schema upgrade performed and re-verified
Functional Validation
Get-SPSearchHealthAudit.ps1run — search health baseline recorded- Full crawl triggered on all content sources
Get-SPSearchHealthAudit.ps1re-run after crawl completes — all sources showCompleted- Representative sites manually verified: intranet, department portals, MySites
- Document library upload/download verified on at least three critical sites
- Authentication verified by a non-admin user account
Compliance Validation
Get-SPSiteCompliance.ps1run against all web applications — output saved- All
QuotaStatus: Exceededentries investigated and storage quotas adjusted or accepted - External sharing settings verified against pre-migration policy
Compare-SPCompliance.ps1run — pre/post compliance comparison complete- All
REGRESSIONentries either resolved or formally documented as accepted exceptions Generate-AgencyHealthCards.ps1run — health cards generated for all departments- Health cards distributed to department heads
Get-MigrationExecutiveSummary.ps1run — executive summary generated and reviewed- Executive summary delivered to CIO / IT Director
- Change record updated and closed in ITSM system
Get the Complete Migration Toolkit
Every script in this post — and every script across all eleven posts in this series — is included in the Complete SP2019 → SPSE Migration Toolkit.
The eight validation scripts covered here represent 30–40 hours of development and testing time if built from scratch: parameter validation, error handling, structured CSV and HTML output, cross-script data formats so the outputs chain together cleanly, and testing against real production environments on both SP2019 and SPSE. The toolkit includes all of that, documented, with per-script READMEs covering every parameter and example invocation.
| What you get | Detail |
|---|---|
| 30+ production-ready scripts | All scripts from Posts #1–12, tested on SP2019 and SPSE |
| Per-script READMEs | Parameters, prerequisites, example usage, expected output |
| Error handling and logging | Try/catch throughout, structured log output, no silent failures |
| Sign-off package templates | Report templates, agency mapping CSV example, executive summary HTML |
The eight validation scripts alone — the health cards, inventory comparison, compliance reports, and executive summary — are what you would otherwise spend a week building the first time you need them. You will need them the first time. They are less useful on your first migration project and essential on every one after it.
Contact sudharsan_1985@live.in to get the Complete SP2019 → SPSE Migration Toolkit.
Not ready for the full toolkit? Individual script sets are available for individual migration phases. Start with Post #1: The Complete SharePoint 2019 → SPSE Migration Guide if you are earlier in the series.
Conclusion
The migration window is over. The databases are mounted. The sites are loading. You have been running on adrenaline for the better part of a day.
Now do the ten percent of the work that turns a successful technical event into a closed project.
The three-level validation model — Technical, Functional, Compliance — gives you a complete picture of what succeeded, what needs follow-up, and what can be signed off today. The eight scripts produce every artefact in the sign-off package: the inventory comparison that confirms nothing was left behind, the compliance reports that satisfy the auditor, the health cards that answer the department heads, and the executive summary that lets the CIO close the budget line.
A migration that can be documented is one that can be defended. Run the scripts. Build the package. Close the project.
There is one post left in this series. Post #12: Lessons Learned — What Went Wrong in Our SP2019 → SPSE Migration covers the failures, edge cases, and unexpected problems that surfaced across the full migration journey — the things that the official documentation doesn’t mention and that experience teaches the hard way. If you are planning a migration rather than completing one, Post #12 is where to start.
Post 11 of 12 in the SharePoint 2019 → Subscription Edition Migration series.