Migrating data to SharePoint Online requires ensuring that all files, metadata, and permissions are correctly transferred. PnP PowerShell allows you to validate migration integrity by comparing file sizes, metadata, permissions, and version history before and after the migration.
Key Aspects of Migration Validation
✔ File Integrity – Ensure files are not corrupted or missing after migration.
✔ Metadata Validation – Verify metadata such as created date, modified date, author, and version history.
✔ Permissions Check – Confirm that user access rights remain unchanged.
✔ Site Structure Comparison – Validate that document libraries, lists, and folders match the source.
✔ Audit Logs & Reporting – Generate reports to track validation progress.
Step 1: Connect to SharePoint Online
Before validating migration integrity, establish a connection to both the source and destination SharePoint Online sites.
$sourceSite = "https://oldtenant.sharepoint.com/sites/SourceSite"
$destSite = "https://newtenant.sharepoint.com/sites/DestinationSite"
# Connect to Source SharePoint
Connect-PnPOnline -Url $sourceSite -Interactive
# Connect to Destination SharePoint
Connect-PnPOnline -Url $destSite -Interactive
✔ Ensures access to both old and new environments.
Step 2: Validate File Count in Document Libraries
Compare the number of files in Source and Destination document libraries.
$sourceLibrary = "Documents"
$destLibrary = "Documents"
# Get file count from source
$sourceFiles = Get-PnPListItem -List $sourceLibrary
$sourceCount = $sourceFiles.Count
# Get file count from destination
$destFiles = Get-PnPListItem -List $destLibrary
$destCount = $destFiles.Count
if ($sourceCount -eq $destCount) {
Write-Host " File Count Matches: $sourceCount files"
} else {
Write-Host " File Count Mismatch! Source: $sourceCount, Destination: $destCount"
}
✔ Ensures that no files are missing after migration.
Step 3: Validate File Size and Hash Checksums
Compare file sizes to detect incomplete or corrupted files.
function Get-FileHashValue {
param ($fileUrl)
$file = Get-PnPFile -Url $fileUrl -AsFile -Path "C:\Temp\FileCheck.tmp" -Force
return (Get-FileHash -Path "C:\Temp\FileCheck.tmp").Hash
}
$sourceFileUrl = "/sites/SourceSite/Shared Documents/Report.pdf"
$destFileUrl = "/sites/DestinationSite/Shared Documents/Report.pdf"
$sourceHash = Get-FileHashValue -fileUrl $sourceFileUrl
$destHash = Get-FileHashValue -fileUrl $destFileUrl
if ($sourceHash -eq $destHash) {
Write-Host " File Integrity Verified: Report.pdf"
} else {
Write-Host " File Integrity Issue Detected: Report.pdf"
}
✔ Ensures files match exactly using a hash comparison.
Step 4: Validate Metadata Integrity
Compare metadata such as Created By, Modified By, and timestamps.
$sourceFile = Get-PnPListItem -List "Documents" -Id 1
$destFile = Get-PnPListItem -List "Documents" -Id 1
if ($sourceFile["Author"].Email -eq $destFile["Author"].Email -and
$sourceFile["Modified"].ToString() -eq $destFile["Modified"].ToString()) {
Write-Host " Metadata Integrity Verified"
} else {
Write-Host " Metadata Mismatch Detected!"
}
✔ Ensures metadata integrity is maintained.
Step 5: Validate Permissions After Migration
Check if user permissions on a document remain unchanged.
$sourcePermissions = Get-PnPListItemPermission -List "Documents" -Identity 1
$destPermissions = Get-PnPListItemPermission -List "Documents" -Identity 1
if ($sourcePermissions -eq $destPermissions) {
Write-Host " Permissions Match"
} else {
Write-Host " Permissions Mismatch Detected!"
}
✔ Prevents unintentional access changes.
Step 6: Validate Version History
Ensure document versions are retained after migration.
$sourceVersions = (Get-PnPFileVersion -Url "/sites/SourceSite/Shared Documents/Report.pdf").Count
$destVersions = (Get-PnPFileVersion -Url "/sites/DestinationSite/Shared Documents/Report.pdf").Count
if ($sourceVersions -eq $destVersions) {
Write-Host "✅ Version History Matches"
} else {
Write-Host " Version History Discrepancy!"
}
✔ Ensures version control is preserved.
Step 7: Generate a Validation Report
Export migration validation results to a CSV report.
$report = @()
$report += [PSCustomObject]@{
File_Name = "Report.pdf"
File_Integrity = if ($sourceHash -eq $destHash) {"Pass"} else {"Fail"}
Metadata_Integrity = if ($sourceFile["Author"].Email -eq $destFile["Author"].Email) {"Pass"} else {"Fail"}
Permission_Integrity = if ($sourcePermissions -eq $destPermissions) {"Pass"} else {"Fail"}
Version_History = if ($sourceVersions -eq $destVersions) {"Pass"} else {"Fail"}
}
$report | Export-Csv -Path "C:\MigrationValidationReport.csv" -NoTypeInformation
Write-Host " Validation Report Generated: C:\MigrationValidationReport.csv"
✔ Saves a detailed migration validation report for audit purposes.