Update: Use PowerShell to make an entire web application read-only

For those who have been following my posts for a while, they’re probably wondering why I’m blogging about something I’ve already done.

The answer is simple: I found a better way!

In the 7 months since I wrote a post on how to make an entire web application read-only, I’ve learned quite a bit about PowerShell, and the ForEach-Object cmdlet. I now have a better version of the advanced function I showed off back in March, and this one has a new switch parameter (-AllContentWebApplications) which obviously allows you to run the Set-SPSiteLockState function against all web applications (excluding Central Admin).

I like this version a LOT better, and it’s much cleaner. If you only need to run the function against a single web app, that functionality still exists – just exclude the switch param.

Here it is!

function Set-SPSiteLockState {
	Use this PowerShell script to set the Lock State of a SharePoint Web Application to Unlock, ReadOnly, NoAdditions or NoAccess.
	This PowerShell script uses Set-SPSiteAdministration to set the Lock State of a SharePoint Web Application.
	C:\PS>Set-SPSiteLockState -WebAppUrl http://intranet -LockState ReadOnly
	This example sets all site collections in a web application at http://intranet to read-only.
	C:\PS>Set-SPSiteLockState -AllContentWebApplications -LockState ReadOnly
	This example sets all web applications to read-only.
	Name: Set-SPSiteLockState
	Author: Ryan Dennis
	Last Edit: 10/14/2011
	Keywords: Set Lock State, Set-SPSiteAdministration, Set-SPSiteLockState
#Requires -Version 2.0
[string]$LockState=(Read-Host "Please enter a Lock State (Examples: Unlock, NoAccess, ReadOnly)"),
Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
Start-SPAssignment -Global
Write-Host "Setting all web applications to $($LockState)..."
$WebApp = Get-SPWebApplication
	$WebApp | ForEach-Object{
	$AllSites = $WebApp | Get-SPSite -Limit All -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
		$AllSites | ForEach-Object{
		Set-SPSiteAdministration -LockState $LockState -Identity $_.url
$WebApp = Get-SPWebApplication $WebAppUrl
$AllSites = $WebApp | Get-SPSite -Limit All -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
Write-Host "Setting $WebAppUrl to $lockState..." -ForegroundColor Yellow
$AllSites | ForEach-Object { Set-SPSiteAdministration -LockState $lockState -Identity $_.url }

Stop-SPAssignment -Global
Write-Host "Finished!" -ForegroundColor Green