PowerShell: Update SharePoint User Alerts
#PowerShell
#SharePoint
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
$Metadata = @{ | |
Title = "Update SharePoint User Alerts" | |
Filename = "Update-SPUserAlerts.ps1" | |
Description = "" | |
Tags = "powershell, sharepoint, update, user, alerts" | |
Project = "" | |
Author = "Janik von Rotz" | |
AuthorContact = "http://janikvonrotz.ch" | |
CreateDate = "2014-01-02" | |
LastEditDate = "2014-01-02" | |
Url = "" | |
Version = "1.0.0" | |
License = @' | |
This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Switzerland License. | |
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ch/ or | |
send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. | |
'@ | |
} | |
#> | |
try{ | |
#--------------------------------------------------# | |
# modules | |
#--------------------------------------------------# | |
if((Get-PSSnapin 'Microsoft.SharePoint.PowerShell' -ErrorAction SilentlyContinue) -eq $null){Add-PSSnapin 'Microsoft.SharePoint.PowerShell'} | |
Import-Module ActiveDirectory | |
#--------------------------------------------------# | |
# settings | |
#--------------------------------------------------# | |
$Alerts = @( | |
@{ | |
ID = 1 | |
ListUrl = "http://sharepoint.domain.ch/site/subsite/Lists/ListName/view.aspx" | |
SubscriberADUsersAndGroups = "ADGroup","ADUser" | |
Title = "`"Benachrichtigunggg `$Username`"" | |
AlertType = [Microsoft.SharePoint.SPAlertType]::List | |
DeliveryChannels = [Microsoft.SharePoint.SPAlertDeliveryChannels]::Email | |
EventType = [Microsoft.SharePoint.SPEventType]::Add | |
AlertFrequency = [Microsoft.SharePoint.SPAlertFrequency]::Immediate | |
ListViewName = "View 2014" | |
FilterIndex = 8 | |
} | |
) | |
#--------------------------------------------------# | |
# function | |
#--------------------------------------------------# | |
function New-UnifiedAlertObject{ | |
param( | |
$Title, | |
$AlertType, | |
$DeliveryChannels, | |
$EventType, | |
$AlertFrequency, | |
$ListViewID, | |
$FilterIndex | |
) | |
New-Object PSObject -Property @{ | |
Title = $Title | |
AlertType = $AlertType | |
DeliveryChannels = $DeliveryChannels | |
EventType = $EventType | |
AlertFrequency = $AlertFrequency | |
ListViewID = $ListViewID | |
AlertFilterIndex = $AlertFilterIndex | |
} | |
} | |
#--------------------------------------------------# | |
# main | |
#--------------------------------------------------# | |
$Alerts | %{ | |
# set vars | |
$Message = "Update alerts with ID: $($_.ID)`n" | |
$Alert = $_ | |
# get sp site | |
$SPWeb = Get-SPWeb (Get-SPUrl $_.ListUrl).WebUrl | |
# get name of the list | |
$ListName = (Get-SPUrl $_.ListUrl).Url -replace ".*/","" | |
# get the sp list object | |
$SPList = $SPWeb.Lists[$ListName] | |
$SPUsers = Get-SPUser -Web $SPWeb.Site.Url | |
# get the id of the list view by name | |
$SPListViewID = ($SPList.Views | where{$_.title -eq $SPListViewName -and $_.title -ne ""} | select -First 1).ID | |
# get existing alerts | |
$ExistingAlerts = $SPWeb.Alerts | where{$_.Properties["alertid"] -eq $Alert.ID} | |
# cycle throught all users and update, create or delete their alerts | |
$UserWithAlerts = $_.SubscriberADUsersAndGroups | %{ | |
Get-ADObject -Filter {Name -eq $_} | %{ | |
if($_.ObjectClass -eq "user"){ | |
Get-ADUser $_.DistinguishedName | |
}elseif($_.ObjectClass -eq "group"){ | |
Get-ADGroupMember $_.DistinguishedName -Recursive | Get-ADUser | |
} | |
} | %{ | |
$ADUser = $_ | |
$SPUsers | where{$_.SID -eq $ADUser.SID} | %{$SPWeb.EnsureUser($_.Name)} | |
} | |
} | %{ | |
# create alert title | |
$Username = $_.DisplayName | |
$AlertTitle = Invoke-Command -ScriptBlock ([ScriptBlock]::Create($Alert.Title)) | |
# check if already alert exists with this id | |
$AlertIS = $_.Alerts | where{$_.Properties["alertid"] -eq $Alert.ID} | select -First 1 | |
# if exists update this alert | |
if($AlertIS){ | |
# create alert objects to compare | |
$AlertObjectIS = New-UnifiedAlertObject -Title $AlertIS.title ` | |
-AlertType $AlertIS.AlertType ` | |
-DeliveryChannels $AlertIS.DeliveryChannels ` | |
-EventType $AlertIS.EventType ` | |
-AlertFrequency $AlertIS.AlertFrequency ` | |
-ListViewID $AlertIS.Properties["filterindex"] ` | |
-FilterIndex $AlertIS.Properties["filterindex"] | |
$AlertObjectTo = New-UnifiedAlertObject -Title $AlertTitle ` | |
-AlertType $Alert.AlertType ` | |
-DeliveryChannels $Alert.DeliveryChannels ` | |
-EventType $Alert.EventType ` | |
-AlertFrequency $Alert.AlertFrequency ` | |
-ListViewID $SPListViewID ` | |
-FilterIndex $Alert.FilterIndex | |
# only update changed attributes | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property Title, AlertType, DeliveryChannels, EventType, AlertFrequency, ListViewID, FilterIndex){ | |
$Message += "Update alert with ID: $($Alert.ID) for user: $($_.DisplayName)`n" | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property Title){$AlertIS.Title = $AlertObjectTo.Title} | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property AlertType){$AlertIS.AlertType = $AlertObjectTo.AlertType} | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property DeliveryChannels){$AlertIS.DeliveryChannels = $AlertObjectTo.DeliveryChannels} | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property EventType){$AlertIS.EventType = $AlertObjectTo.EventType} | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property AlertFrequency){$AlertIS.AlertFrequency = $AlertObjectTo.AlertFrequency} | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property ListViewID){$AlertIS.Properties["viewid"] = $AlertObjectTo.ListViewID} | |
if(Compare-Object -ReferenceObject $AlertObjectTo -DifferenceObject $AlertObjectIS -Property FilterIndex){$AlertIS.Properties["filterindex"] = $AlertObjectTo.FilterIndex} | |
# update changes | |
$AlertIS.Update() | |
} | |
}else{ | |
# create a new alert object | |
$Message += "Create alert with ID: $($Alert.ID) for user: $($_.DisplayName)`n" | |
$NewAlert = $_.Alerts.Add() | |
# add attributes | |
$NewAlert.Properties.Add("alertid",$Alert.ID) | |
$NewAlert.Title = $AlertTitle | |
if($SPListViewID){ | |
$NewAlert.Properties.Add("filterindex",$Alert.FilterIndex) | |
$NewAlert.Properties.Add("viewid",$SPListViewID) | |
} | |
$NewAlert.AlertType = $Alert.AlertType | |
$NewAlert.List = $SPList | |
$NewAlert.DeliveryChannels = $Alert.DeliveryChannels | |
$NewAlert.EventType = $Alert.EventType | |
$NewAlert.AlertFrequency = $Alert.AlertFrequency | |
# create the alert | |
$NewAlert.Update() | |
} | |
# pipe the users to check alerts to delete | |
$_ | |
} | |
# username array | |
$UserWithAlerts = $UserWithAlerts | %{"$($_.UserLogin)"} | |
# delete alerts | |
$ExistingAlerts | where{$UserWithAlerts -notcontains $_.User} | %{ | |
$Message += "Delete alert with ID: $($Alert.ID) for user: $($_.User)`n" | |
$SPWeb.Alerts.Delete($_.ID) | |
} | |
Write-PPEventLog -Message $Message -Source "Update SharePoint User Alerts" -WriteMessage | |
} | |
}catch{ | |
Write-PPErrorEventLog -Source "Update SharePoint User Alerts" -ClearErrorVariable | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-16"?> | |
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> | |
<RegistrationInfo> | |
<Date>2013-03-20T14:18:21.6393172</Date> | |
<Author>Janik von Rotz (http://janikvonrotz.ch)</Author> | |
<Description>Update SharePoint User Alerts</Description> | |
</RegistrationInfo> | |
<Triggers> | |
<CalendarTrigger> | |
<StartBoundary>2013-01-01T03:00:00</StartBoundary> | |
<Enabled>true</Enabled> | |
<ScheduleByDay> | |
<DaysInterval>1</DaysInterval> | |
</ScheduleByDay> | |
</CalendarTrigger> | |
</Triggers> | |
<Settings> | |
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> | |
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> | |
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> | |
<AllowHardTerminate>true</AllowHardTerminate> | |
<StartWhenAvailable>false</StartWhenAvailable> | |
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> | |
<IdleSettings> | |
<StopOnIdleEnd>true</StopOnIdleEnd> | |
<RestartOnIdle>false</RestartOnIdle> | |
</IdleSettings> | |
<AllowStartOnDemand>true</AllowStartOnDemand> | |
<Enabled>true</Enabled> | |
<Hidden>false</Hidden> | |
<RunOnlyIfIdle>false</RunOnlyIfIdle> | |
<WakeToRun>false</WakeToRun> | |
<ExecutionTimeLimit>P3D</ExecutionTimeLimit> | |
<Priority>7</Priority> | |
</Settings> | |
<Actions Context="Author"> | |
<Exec> | |
<Command>$PSapps.PowerShell</Command> | |
<Arguments>$(Get-ChildItem -Path $PSscripts.Path -Filter "Update-SPUserAlerts.ps1" -Recurse).Fullname</Arguments> | |
<WorkingDirectory>$PSProfile.Path</WorkingDirectory> | |
</Exec> | |
</Actions> | |
</Task> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment