When a user leaves an organisation, their account is usually cleaned up – either by disabling or deleting it. In Sharepoint this cleaning up is not automatic – generally Sharepoint hangs on to user accounts so that information about that user is still linked to the documents the user worked on. One of the side effects of this is that any alerts that user may have set up will remain, at least in Sharepoint 2007. This leads to a lot of undeliverable messages going to Site Administrators. Manually removing the alerts for a user requires visiting each site that has alerts, going to the site settings, User Alerts, finding the user and deleting their alerts. I wrote the following PowerShell script to remove all alerts for a given user in one step. The script requires my supporting functions script (Download SPFunctions) – you need to save this in the same directory as the script below. It works in a similar way to my Edit-SPAdmins script – it allows you to select a Web Application via GUID (don’t worry, it lists all the Web Applications and their GUIDs), and then loops through all the site collections and sites, removing the users alerts as it goes. So – on with the script:
# Remove alerts for a given user from all SharePoint sites in a web application # Usage: delete-spalert.ps1 # Example: delete-spalert.ps1 DOMAINUser # Validate arguments if ($args.Count -lt 1) { Write-Warning "Usage: alerts.ps1 " Write-Warning "Username must be in DOMAINuser format" exit } # check that arguement is in correct format including domain if ($args[0] -inotmatch '^w+[\]w+$') { Write-Warning "Username must be in DOMAINUser format" exit } # Load Sharepoint functions .SPFunctions.ps1; # store arguement in variable $myuser = $args[0] # Preamble cls; write-host "################################################################################### This application adds or removes alerts for a user in a specified web application Here is a list of all Web Applications on the farm" -foregroundcolor yellow; # List the GUIDs of all web apps on this farm List-SPWebApp-GUID; write-host "Please copy the GUID for the web application you wish to use by selecting then clicking the right mouse button." -foregroundcolor yellow; write-host " Note that the Central Admin site collection has no name, but does have a GUID! Don't select this one by accident! " -foregroundcolor red; Write-Host "You can paste the GUID by clicking the Right mouse button again" -ForegroundColor yellow; # Prompt user for GUID to use $guid = Read-Host -Prompt "GUID"; $guid = $guid.Trim(); # Check GUID for correct format Write-Host "Checking GUID"; switch(Check-GUID($guid)){ "False" { Write-Host "Error: Invalid GUID. Exiting..." -ForegroundColor red; return;} } # Get the specified web app $webapp = Get-SPWebApp($guid); # Check that webapp has been got and if not inform user Write-Host "The following Web App will be affected: $($webapp.name)" Write-Host "You will be removing alerts for the following user: $myuser" $continue = Read-Host -Prompt "Continue? (y|n)>"; switch($continue){ "y" {break;} default {Write-Host "Exiting..." -ForegroundColor red; return;} } $alertcount = 0 # For each site collection remove all alerts for the given user $time = Measure-Command { foreach ($site in $webapp.Sites) { # get the collection of webs $webs = $site.AllWebs foreach ($web in $webs) { # get the alerts $alerts = $web.Alerts # if more than 0 alerts, iterate through these alerts to see if there is one for the user if ($alerts.Count -gt 0) { $myalerts = @() $mysites += $web.Url foreach ($alert in $alerts) { if ($alert.User.LoginName -eq $myuser) { echo "Deleting $($alert.Title)" $myalerts += $alert $alertcount++ } } # now we have alerts for this site, we can delete them foreach ($alertdel in $myalerts) { $alerts.Delete($alertdel.ID) } } } } } echo "Deleted $alertcount alerts in $($time.TotalSeconds) seconds"