param( [Parameter(Mandatory = $true)] [Alias('WebUrl')] [string]$SiteUrl, [string]$CssPath = '', [string]$Description = 'MSFT-Custom-Solution:CustomBranding' ) Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-Null $componentId = '035ba968-6488-4d42-86b3-0470ffcc95b9' $location = 'ClientSideExtension.ApplicationCustomizer' $name = 'CustomBranding' $title = 'Custom Branding' function Get-CustomBrandingPropertiesJson { param( [string]$Path ) $config = @{ cssfiles = @() placeholdertop = @{ elements = @() } placeholderbottom = @{ elements = @() } } if ($Path -and $Path.Trim().Length -gt 0) { $config.cssfiles += @{ path = $Path.Trim() } } return ($config | ConvertTo-Json -Depth 10 -Compress) } function Remove-WebScopedComponentActions { param( [Microsoft.SharePoint.SPSite]$CurrentSite, [string]$CurrentComponentId, [string]$CurrentLocation ) $removedCount = 0 foreach ($web in $CurrentSite.AllWebs) { try { $webActions = @($web.UserCustomActions | Where-Object { $_.Location -eq $CurrentLocation -and $_.ClientSideComponentId -and $_.ClientSideComponentId.ToString().ToLower() -eq $CurrentComponentId }) foreach ($webAction in $webActions) { $web.UserCustomActions.Delete($webAction.Id) $removedCount++ } if ($webActions.Count -gt 0) { $web.Update() } } finally { $web.Dispose() } } return $removedCount } $site = Get-SPSite -Identity $SiteUrl try { $removedWebScopedActions = Remove-WebScopedComponentActions -CurrentSite $site -CurrentComponentId $componentId -CurrentLocation $location $existingAction = $site.UserCustomActions | Where-Object { $_.Location -eq $location -and $_.ClientSideComponentId -and $_.ClientSideComponentId.ToString().ToLower() -eq $componentId } | Select-Object -First 1 if ($existingAction) { $action = $existingAction Write-Host 'Aktualisiere vorhandene site-scoped Custom Branding UserCustomAction...' -ForegroundColor Yellow } else { $action = $site.UserCustomActions.Add() Write-Host 'Erstelle neue site-scoped Custom Branding UserCustomAction...' -ForegroundColor Yellow } $action.Name = $name $action.Title = $title $action.Description = $Description $action.Location = $location $action.ClientSideComponentId = [Guid]$componentId $action.ClientSideComponentProperties = Get-CustomBrandingPropertiesJson -Path $CssPath $action.Update() Write-Host 'Custom Branding wurde site-scoped registriert.' -ForegroundColor Green Write-Host ('Entfernte web-scoped Eintraege: ' + $removedWebScopedActions) Write-Host ('Beschreibung: ' + $Description) Write-Host ('Properties: ' + $action.ClientSideComponentProperties) } finally { if ($site) { $site.Dispose() } }