When maintenance or updates are complete, or if you've mistakenly locked site collections, you'll need to unlock them.
Here’s how you can use PowerShell to unlock all site collections within a SharePoint 2019 on-premises web application efficiently.
Prerequisites
- Environment: The script should be run in the SharePoint Management Shell.
- Permissions: You must have administrative rights to manage site collections.
Script Configuration
Configure the following variables before executing the script:
- $webAppUrl: Enter the URL of your SharePoint web application (e.g., http://your-webapp-url).
- $outputFile: Specify the path for saving the CSV report (e.g., C:\UnlockedSitesReport.csv).
How the Script Functions
- Load SharePoint Snap-In: Ensures the SharePoint PowerShell snap-in is available.
- Define Variables: Sets up the web application URL and the path for the CSV output.
- Initialize Report Array: Prepares $siteStatusList for storing unlock status information.
- Loop Through Site Collections:
- For each site:
- Checks if the site is already unlocked (-not ($site.ReadOnly -or $site.WriteLocked)).
- If locked, it removes the restrictions by setting both ReadOnly and WriteLocked to false.
- Records the site's URL, unlock status, and the timestamp.
- For each site:
- Export to CSV: Generates a report of the unlock actions taken.
CSV Report Details
- URL: URL of each site collection.
- LockStatus: Whether the site was "Already Unlocked" or "Unlocked" during script execution.
- TimeUnlocked: The time when the unlock occurred or was verified.
The Script
# Load SharePoint PowerShell snap-in if not loaded
if ((Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null) {
Add-PSSnapin Microsoft.SharePoint.PowerShell
}
# Define the URL of your web application
$webAppUrl = "http://your-webapp-url"
# Define the output CSV file path
$outputFile = "C:\UnlockedSitesReport.csv"
# Initialize an array to store site information
$siteStatusList = @()
# Get the Web Application object
$webApp = Get-SPWebApplication $webAppUrl
# Iterate through each site collection in the web application
foreach ($site in $webApp.Sites) {
try {
# Check if the site is already unlocked (not ReadOnly and not WriteLocked)
$isAlreadyUnlocked = -not ($site.ReadOnly -or $site.WriteLocked)
$lockStatus = if ($isAlreadyUnlocked) { "Already Unlocked" } else { "Unlocked" }
# If not already unlocked, remove the lock by setting ReadOnly and WriteLocked to false
if (!$isAlreadyUnlocked) {
$site.ReadOnly = $false
$site.WriteLocked = $false
$site.Update()
}
# Collect site information for the CSV report
$siteStatusList += [PSCustomObject]@{
URL = $site.Url
LockStatus = $lockStatus
TimeUnlocked = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}
Write-Host "$lockStatus for site collection:" $site.Url -ForegroundColor Green
}
catch {
Write-Host "Failed to process site collection:" $site.Url -ForegroundColor Red
}
finally {
# Dispose of the site object to free up resources
$site.Dispose()
}
}
# Export the site status list to a CSV file
$siteStatusList | Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8
Write-Host "All site collections in the web application have been processed. Report saved to $outputFile" -ForegroundColor Cyan
Additional Resources
For more scripts and tools tailored for SharePoint management, visit my GitHub repository at: MuckyRat/SharePoint-Server-UnlockSites.
This script serves as an essential tool for SharePoint administrators needing to restore access to their site collections after a period of lock-down, ensuring users can resume their work without delay.
Remember, always test scripts in a safe environment before applying them in production.