You really want to do this instead of directly editing the web.config file. If you change the web.config directly, SharePoint won't know it's actually changed. During the next patch or Config Wizard, SharePoint will overwrite the web.config with what it thinks should be there, which is bad.
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