Отказ от использования современного интерфейса списков и библиотек
В 2016 г. был представлен новый "современный" интерфейс для SharePoint с полной переработкой расширяемости, специальных возможностей и адаптивного дизайна пользовательского интерфейса. С тех пор современный интерфейс использовался в качестве основы для обновлений в SharePoint и OneDrive. При этом классический режим остается поддерживаемым и доступным. Большинство списков и библиотек прекрасно работают в современном интерфейсе, но также существуют списки, которые работают неправильно или для них отсутствуют функции при использовании в современном интерфейсе. Часто это связано с пользовательскими настройками списка (например, JSLink) или страницы формы списка (например, при использовании нескольких веб-частей). SharePoint обнаруживает наиболее несовместимые пользовательские настройки и отображает затронутые списки и библиотеки с помощью классического интерфейса. При этом другие списки и библиотеки сайта отображаются с помощью современного интерфейса. Если недопустимо переключаться между современным и классическим интерфейсом, можно отказаться от использования современного интерфейса для списков и библиотек. В этой статье вы ознакомитесь с доступными вариантами отказа от использования, способами определения списков и библиотек, для которых лучше отказаться от современного интерфейса, а также о том, как оптимальным образом отказаться от его использования.
Варианты отказа от использования современного интерфейса для списков и библиотек
Отказ от использования на уровне семейства веб-сайтов
Отказаться от использования "современного" интерфейса для семейства веб-сайтов можно путем включения функции с идентификатором E3540C7D-6BEA-403C-A224-1A12EAFEE4C4. Чтобы включить или отключить необходимую функцию, используйте указанный ниже PnP PowerShell:
# Connect to a site
$cred = Get-Credential
Connect-PnPOnline -Url https://[tenant].sharepoint.com/sites/siteurl -Credentials $cred
# Opt out from modern lists and libraries at site collection level
Enable-PnPFeature -Identity E3540C7D-6BEA-403C-A224-1A12EAFEE4C4 -Scope Site
# And again enable modern lists and libraries at site collection level
#Disable-PnPFeature -Identity E3540C7D-6BEA-403C-A224-1A12EAFEE4C4 -Scope Site
Отказ от использования на уровне веб-сайта
Отказаться от использования "современного" интерфейса для веб-сайта можно путем включения функции с идентификатором 52E14B6F-B1BB-4969-B89B-C4FAA56745EF. Чтобы включить или отключить необходимую функцию, используйте указанный ниже PnP PowerShell:
# Connect to a site
$cred = Get-Credential
Connect-PnPOnline -Url https://[tenant].sharepoint.com/sites/siteurl -Credentials $cred
# Opt out from modern lists and libraries at web level
Enable-PnPFeature -Identity 52E14B6F-B1BB-4969-B89B-C4FAA56745EF -Scope Web
# And again enable modern lists and libraries at web level
#Disable-PnPFeature -Identity 52E14B6F-B1BB-4969-B89B-C4FAA56745EF -Scope Web
Примечание.
PnP PowerShell — это решение с открытым исходным кодом, поддержка которого предоставляется активным сообществом. Для инструментов с открытым исходным кодом не существует соглашения об уровне обслуживания в отношении поддержки корпорацией Майкрософт.
Отказ от использования на уровне списка
Чтобы управлять интерфейсом на уровне библиотеки, можно перейти в Параметры списка>Дополнительные параметры и изменить поведение.
То же самое можно выполнить с помощью PnP PowerShell, как показано в этом фрагменте кода:
# Connect to a site
$cred = Get-Credential
Connect-PnPOnline -Url https://[tenant].sharepoint.com/sites/siteurl -Credentials $cred
# Get the list to update
$list = Get-PnPList -Identity "Shared Documents" -Includes ListExperienceOptions
# Set the list experience (0 = Auto, 1 = modern, 2 = classic)
$list.ListExperienceOptions = 2
$list.Update()
Invoke-PnPQuery
Примечание.
- Параметры на уровне библиотеки переопределяют параметры на уровне веб-сайта или семейства веб-сайтов.
Способ определения списков и библиотек для отказа от использования современного интерфейса
Отказ от использования современного интерфейса требуется только в определенных случаях, как описано во введении этой статьи. В предыдущей главе показано, как осуществить отказ от использования, но как узнать, какие списки и библиотеки являются кандидатами на отказ от использования современного интерфейса?
Сканер модернизации SharePoint предоставит необходимые ответы: если вы запустите сканер в режиме "Full scan" (Полное сканирование) или "Modern list experience readiness" (Готовность к современному интерфейсу списков), сканер соберет все данные о ваших списках. С помощью созданного отчета Excel Modern UI List Readiness (Готовность к современному интерфейсу списков) можно найти списки с пользовательскими настройками, как описано в статье Анализ и использование данных сканера.
Найденные списки будут уже представлены в классической версии благодаря механизму возврата к классическому интерфейсу SharePoint. Но если вы хотите полностью применить классический пользовательский интерфейс, можно отказаться от использования современного интерфейса списков и библиотек для всего семейства веб-сайтов. Для упрощения этой процедуры сканер создает CSV-файл с именем SitesWithCustomizations.csv, в котором перечислены все семейства веб-сайтов, содержащие один или нескольких списков, для которых можно отказаться от использования современного интерфейса.
Этот CSV-файл является простым списком URL-адресов семейств веб-сайтов без заголовка, как показано в примере ниже:
"https://contoso.sharepoint.com/sites/siteA"
"https://contoso.sharepoint.com/sites/siteB"
"https://contoso.sharepoint.com/sites/siteC"
Оптимальный способ отказа от использования для выбранных семейств веб-сайтов
Чтобы отказаться от использования современных списков и библиотек для списка, веб-сайта или семейства веб-сайтов, можно использовать описанные выше варианты. Если используется сканер, чтобы создать список семейств веб-сайтов, предназначенных для отказа от использования современного интерфейса, затем можно использовать указанный ниже скрипт PnP PowerShell для выполнения "массового" отказа от использования.
<#
.SYNOPSIS
Enables or disables the modern list and library experience at site collection level. The script can handle a single site collection or a list of site collections provided via a CSV file.
To get the CSV file you can run the Modernization Scanner, version 2.3 or higher, and use the "Lists and Library" mode (see https://aka.ms/sppnp-modernizationscanner) or alternatively
create the file yourselves:
"https://contoso.sharepoint.com/sites/siteA"
"https://contoso.sharepoint.com/sites/siteB"
"https://contoso.sharepoint.com/sites/siteC"
.EXAMPLE
PS C:\> .\SetModernListUsage.ps1
#>
#region Logging and generic functions
function LogWrite
{
param([string] $log , [string] $ForegroundColor)
$global:strmWrtLog.writeLine($log)
if([string]::IsNullOrEmpty($ForegroundColor))
{
Write-Host $log
}
else
{
Write-Host $log -ForegroundColor $ForegroundColor
}
}
function LogError
{
param([string] $log)
$global:strmWrtError.writeLine($log)
}
function UsageLog
{
try
{
$cc = Get-PnPContext
$cc.Load($cc.Web)
$cc.ClientTag = "SPDev:ModernListUsage"
$cc.ExecuteQuery()
}
catch [Exception] { }
}
#endregion
function SiteCollectionUsesModernLists
{
param([string] $siteCollectionUrl,
[Boolean] $useModern,
$credentials,
$tenantContext,
[string] $adminUPN)
#region Ensure access to the site collection, if needed promote the calling account to site collection admin
# Check if we can access the site...if not let's 'promote' ourselves as site admin
$adminClaim = "i:0#.f|membership|$adminUPN"
$adminWasAdded = $false
$siteContext = $null
$siteCollectionUrl = $siteCollectionUrl.TrimEnd("/");
Try
{
LogWrite "User running script: $adminUPN"
LogWrite "Connecting to site $siteCollectionUrl"
$siteContext = Connect-PnPOnline -Url $siteCollectionUrl -Credentials $credentials -Verbose -ReturnConnection
}
Catch [Exception]
{
# If Access Denied then use tenant API to add current tenant admin user as site collection admin to the current site
if ($_.Exception.Response.StatusCode -eq "Unauthorized")
{
LogWrite "Temporarily adding user $adminUPN as site collection admin"
Set-PnPTenantSite -Url $siteCollectionUrl -Owners @($adminUPN) -Connection $tenantContext
$adminWasAdded = $true
LogWrite "Second attempt to connect to site $siteCollectionUrl"
$siteContext = Connect-PnPOnline -Url $siteCollectionUrl -Credentials $credentials -Verbose -ReturnConnection
}
else
{
$ErrorMessage = $_.Exception.Message
LogWrite "Error for site $siteCollectionUrl : $ErrorMessage" Red
LogError $ErrorMessage
return
}
}
#endregion
Try
{
#region Adding admin
# Check if current tenant admin is part of the site collection admins, if not add the account
$siteAdmins = $null
if ($adminWasAdded -eq $false)
{
try
{
# Eat exceptions here...resulting $siteAdmins variable will be empty which will trigger the needed actions
$siteAdmins = Get-PnPSiteCollectionAdmin -Connection $siteContext -ErrorAction Ignore
}
catch [Exception] { }
$adminNeedToBeAdded = $true
foreach($admin in $siteAdmins)
{
if ($admin.LoginName -eq $adminClaim)
{
$adminNeedToBeAdded = $false
break
}
}
if ($adminNeedToBeAdded)
{
LogWrite "Temporarily adding user $adminUPN as site collection admin"
Set-PnPTenantSite -Url $siteCollectionUrl -Owners @($adminUPN) -Connection $tenantContext
$adminWasAdded = $true
}
}
UsageLog
#endregion
#region Enable/disable the modern list experience at site collection level
if ($useModern)
{
LogWrite "Disabling the modern list blocking feature"
Disable-PnPFeature -Identity "E3540C7D-6BEA-403C-A224-1A12EAFEE4C4" -Scope Site -Force -Connection $siteContext
}
else
{
LogWrite "Enabling the modern list blocking feature"
Enable-PnPFeature -Identity "E3540C7D-6BEA-403C-A224-1A12EAFEE4C4" -Scope Site -Force -Connection $siteContext
}
#endregion
#region Cleanup updated permissions
LogWrite "Configuration is done, let's cleanup the configured permissions"
# Remove the added site collection admin - obviously this needs to be the final step in the script :-)
if ($adminWasAdded)
{
LogWrite "Remove $adminUPN from site collection administrators"
Remove-PnPSiteCollectionAdmin -Owners @($adminUPN) -Connection $siteContext
}
#endregion
LogWrite "Configuration done for site collection $siteCollectionUrl" Green
# Disconnect PnP Powershell from site
Disconnect-PnPOnline
}
Catch [Exception]
{
$ErrorMessage = $_.Exception.Message
LogWrite "Error: $ErrorMessage" Red
LogError $ErrorMessage
#region Cleanup updated permissions on error
# Configuration did not complete...remove the added tenant admin to restore site permissions as final step in the cleanup
if ($adminWasAdded)
{
try
{
# Final step, remove the added site collection admin
Remove-PnPSiteCollectionAdmin -Owners @($adminUPN) -Connection $siteContext
}
catch [Exception] { }
}
#endregion
LogWrite "Configuration failed for site collection $siteCollectionUrl" Red
}
}
#######################################################
# MAIN section #
#######################################################
# OVERRIDES
# If you want to automate the run and make the script ask less questions, feel free to hardcode these 2 values below. Otherwise they'll be asked from the user or parsed from the values they input
# Tenant admin url
$tenantAdminUrl = "" # e.g. "https://contoso-admin.sharepoint.com"
# If you use credential manager then specify the used credential manager entry, if left blank you'll be asked for a user/pwd
$credentialManagerCredentialToUse = ""
#region Setup Logging
$date = Get-Date
$logfile = ((Get-Item -Path ".\" -Verbose).FullName + "\ModernListUsage_log_" + $date.ToFileTime() + ".txt")
$global:strmWrtLog=[System.IO.StreamWriter]$logfile
$global:Errorfile = ((Get-Item -Path ".\" -Verbose).FullName + "\ModernListUsage_error_" + $date.ToFileTime() + ".txt")
$global:strmWrtError=[System.IO.StreamWriter]$Errorfile
#endregion
#region Load needed PowerShell modules
# Ensure PnP PowerShell is loaded
$minimumVersion = New-Object System.Version("3.4.1812.2")
if (-not (Get-InstalledModule -Name SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -ErrorAction Ignore))
{
Install-Module SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -Scope CurrentUser
}
Import-Module SharePointPnPPowerShellOnline -DisableNameChecking -MinimumVersion $minimumVersion
#endregion
#region Gather set modern list usage run input
# Url of the site collection to remediate
$siteCollectionUrlToConfigure = ""
$enableModern = $false
# Get the input information
$siteURLFile = Read-Host -Prompt "Input either single site collection URL (e.g. https://contoso.sharepoint.com/sites/teamsite1) or name of .CSV file (e.g. SitesWithCustomizations.csv) ?"
if (-not $siteURLFile.EndsWith(".csv"))
{
$siteCollectionUrlToConfigure = $siteURLFile
}
# If we are using a CSV, we'll need to get the tenant admin url from the user or use the hardcoded one
else
{
if ($tenantAdminUrl -eq $null -or $tenantAdminUrl.Length -le 0)
{
$tenantAdminUrl = Read-Host -Prompt "Input the tenant admin site URL (like https://contoso-admin.sharepoint.com)"
}
}
$enableModernString = Read-Host -Prompt "Do you want to enable modern lists and libraries for this site collection? Enter True for yes, False otherwise"
try
{
$enableModern = [System.Convert]::ToBoolean($enableModernString)
}
catch [FormatException]
{
$enableModern = $false
}
# We'll parse the tenantAdminUrl from site url (unless it's set already!)
if ($tenantAdminUrl -eq $null -or $tenantAdminUrl.Length -le 0)
{
if ($siteURLFile.IndexOf("/teams") -gt 0)
{
$tenantAdminUrl = $siteURLFile.Substring(0, $siteURLFile.IndexOf("/teams")).Replace(".sharepoint.", "-admin.sharepoint.")
}
else
{
$tenantAdminUrl = $siteURLFile.Substring(0, $siteURLFile.IndexOf("/sites")).Replace(".sharepoint.", "-admin.sharepoint.")
}
}
# Get the tenant admin credentials.
$credentials = $null
$adminUPN = $null
if(![String]::IsNullOrEmpty($credentialManagerCredentialToUse) -and (Get-PnPStoredCredential -Name $credentialManagerCredentialToUse) -ne $null)
{
$adminUPN = (Get-PnPStoredCredential -Name $credentialManagerCredentialToUse).UserName
$credentials = $credentialManagerCredentialToUse
}
else
{
# Prompts for credentials, if not found in the Windows Credential Manager.
$adminUPN = Read-Host -Prompt "Please enter admin UPN (e.g. admin@contoso.onmicrosoft.com)"
$pass = Read-host -AsSecureString "Please enter admin password"
$credentials = new-object management.automation.pscredential $adminUPN,$pass
}
if($credentials -eq $null)
{
Write-Host "Error: No credentials supplied." -ForegroundColor Red
exit 1
}
#endregion
#region Connect to SharePoint
# Get a tenant admin connection, will be reused in the remainder of the script
LogWrite "Connect to tenant admin site $tenantAdminUrl"
$tenantContext = Connect-PnPOnline -Url $tenantAdminUrl -Credentials $credentials -Verbose -ReturnConnection
#endregion
#region Configure the site(s)
if (-not $siteURLFile.EndsWith(".csv"))
{
# Remediate the given site collection
SiteCollectionUsesModernLists $siteCollectionUrlToConfigure $enableModern $credentials $tenantContext $adminUPN
}
else
{
$csvRows = Import-Csv $siteURLFile -Header SiteCollectionUrl
foreach($row in $csvRows)
{
if($row.SiteCollectionUrl -ne "")
{
$siteUrl = $row.SiteCollectionUrl
SiteCollectionUsesModernLists $siteUrl $enableModern $credentials $tenantContext $adminUPN
}
}
}
#endregion
#region Close log files
if ($global:strmWrtLog -ne $NULL)
{
$global:strmWrtLog.Close()
$global:strmWrtLog.Dispose()
}
if ($global:strmWrtError -ne $NULL)
{
$global:strmWrtError.Close()
$global:strmWrtError.Dispose()
}
#endregion