For our purposes, we store the config changes in a csv file that Powershell will run. That config file holds things like cache timeout settings for some of our custom apps, a custom branding url, and a switch for debug mode to be enabled for specific apps.
That config file can contain anything you might want, but it will need three columns. They are: Name, Owner, and Value
Ours looks like this:
Name | Owner | Value |
app.DebugMode | itsp | FALSE |
app.BrandingUrl | itsp | http://somesite.com/sites/common |
app.Cache.CacheTimeout | itsp | 1 |
app.Cache.IsCacheEnabled | itsp | FALSE |
app.Lists.EventsList | itsp | Events Calendar |
app.Lists.ContactsList | itsp | Contacts |
app.Lists.LinksList | itsp | Local Links |
app.Lists.AssetsList | itsp | Site Assets |
The Powershell is:
# Change this variable to the target Web App
$webAppUrl = "http://somewebapp.com"
$CSVLocation = "F:\Temp\ConfigMods.csv"
# Add Snapin if it is not already loaded
if ((Get-PSSnapin | ? {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null)
{
Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}
# Import configuration
$mods = Import-CSV $CSVLocation
$webApp = Get-SPWebApplication $webAppUrl
# Get the mods that need to be checked
$ownerstodelete = $mods | Group-Object owner | Select-Object Name
# For each mod
foreach($owner in $ownerstodelete)
{
# Create an array
$modstodelete = @()
# For each current web mod
foreach($mod in $webApp.WebConfigModifications)
{
# If mod is marked
if($mod.Owner -eq $owner.Name)
{
# Add to the array
$modstodelete += $mod
}
}
Write-Host "Removing $($modstodelete.Count) web.config modifications from $($webAppUrl)" -ForegroundColor Yellow
# Foreach mode to be deleted
foreach($delmod in $modstodelete)
{
# Delete the mod
$webApp.WebConfigModifications.Remove($delmod) > $null
Write-Host " + Deleted mod $($delmod.Value)" -ForegroundColor Red
}
}
# Reset sequence
$i = 0;
Write-Host ""
Write-Host "Adding $($mods.Count) web.config modifications to $($webAppUrl)" -ForegroundColor Yellow
# For each mod to add
foreach($modEntry in $mods)
{
# Create the mod value
$modValue = [system.string]::format(“<add key=""{0}"" value=""{1}"" />", $modEntry.Name, $modEntry.Value)
# Create the mod object
$mod = New-Object Microsoft.SharePoint.Administration.SPWebConfigModification
$mod.Path = "configuration/appSettings"
$mod.Name = [string]::Format("add[@key='{0}']", $modEntry.Name)
$mod.Sequence = $i++
$mod.Owner = $modEntry.Owner
$mod.Type = 0
$mod.Value = $modValue
# Add the mod to the web app
$webApp.WebConfigModifications.Add($mod)
Write-Host " + Added mod $($modValue)" -ForegroundColor Cyan
}
# Update the web app
$webApp.Update()
# Apply web config changes
$webApp.WebService.ApplyWebConfigModifications()
# Run all Admin timer jobs
net stop SPAdminV4 > $null
Start-SPAdminJob
net start SPAdminV4 > $null
Write-Host ""
Write-Host "Web.config changes have been applied successfully" -ForegroundColor Green