[CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$SiteUrl, [Parameter(Mandatory = $true)] [string]$ListTitle, [Parameter(Mandatory = $true)] [string]$ExpiryFieldInternalName, [Guid]$FieldCustomizerComponentId = 'a555f4fc-d6a6-4421-8189-457449d9bbde', [string]$ClassicScriptUrl = '~site/SiteAssets/ExpiryIndicator/ExpiryIndicatorClassic.js', [switch]$SkipClassic ) $isapiPath = Join-Path ([Environment]::GetFolderPath('CommonProgramFiles')) 'microsoft shared\Web Server Extensions\16\ISAPI' Add-Type -Path (Join-Path $isapiPath 'Microsoft.SharePoint.Client.Runtime.dll') Add-Type -Path (Join-Path $isapiPath 'Microsoft.SharePoint.Client.dll') $context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl) $context.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials try { $list = $context.Web.Lists.GetByTitle($ListTitle) $field = $list.Fields.GetByInternalNameOrTitle($ExpiryFieldInternalName) $customActions = $list.UserCustomActions $context.Load($list) $context.Load($field) $context.Load($customActions) $context.ExecuteQuery() if ($field.InternalName -ne $ExpiryFieldInternalName) { Write-Warning "Das Feld wurde über seinen Anzeigenamen gefunden. Verwende künftig den internen Namen '$($field.InternalName)'." } $alreadyBound = $field.ClientSideComponentId -eq $FieldCustomizerComponentId $field.ClientSideComponentId = $FieldCustomizerComponentId if (-not $alreadyBound -or [string]::IsNullOrWhiteSpace($field.ClientSideComponentProperties)) { $field.ClientSideComponentProperties = (@{ expiryField = $field.InternalName } | ConvertTo-Json -Compress) } $field.Update() # Remove old diagnostic registrations and make the V2 Classic # registrations idempotent. $customActions | Where-Object { $_.Name -eq 'ExpiryIndicator.CommandSet' -or $_.Name -eq 'ExpiryIndicator.Classic.ScriptLink' -or $_.Name -eq 'ExpiryIndicator.Classic.Ribbon' } | ForEach-Object { $_.DeleteObject() } $context.ExecuteQuery() if (-not $SkipClassic) { $scriptAction = $list.UserCustomActions.Add() $scriptAction.Name = 'ExpiryIndicator.Classic.ScriptLink' $scriptAction.Title = 'ExpiryIndicator Classic runtime' $scriptAction.Location = 'ScriptLink' $separator = if ($ClassicScriptUrl.Contains('?')) { '&' } else { '?' } $scriptAction.ScriptSrc = $ClassicScriptUrl + $separator + 'expiryField=' + [Uri]::EscapeDataString($field.InternalName) $scriptAction.Sequence = 650 $scriptAction.Update() $ribbonLocation = if ($list.BaseType -eq [Microsoft.SharePoint.Client.BaseType]::DocumentLibrary) { 'Ribbon.Library.Actions.Controls._children' } else { 'Ribbon.List.Actions.Controls._children' } $ribbonXml = @"