Symptômes
Après avoir installé les mises à jour de sécurité d’octobre suivantes pour Microsoft SharePoint Server, certains scénarios de flux de travail Microsoft SharePoint 2010 peuvent être bloqués. En outre, les balises d’événement « 6ksbk » sont enregistrées dans les journaux du système de journalisation unifié SharePoint (ULS).
Cause
Pour renforcer la sécurité des flux de travail SharePoint, SharePoint prend désormais en charge uniquement l’encodage de caractères UTF-8 pour les fichiers .xoml de flux de travail.
Remarque : Les outils de flux de travail SharePoint tels que SharePoint Designer, Microsoft Visual Studio et Nintex créent des fichiers .xoml relatif au flux de travail à l’aide de l’encodage de caractères UTF-8 par défaut. Les clients ne seront pas affectés par cette amélioration de la sécurité, sauf s’ils ont modifié manuellement leurs fichiers .xoml de workflow et les ont convertis dans un encodage de caractères différent. Ce problème est documenté dans cet article de la Base de connaissances sur la très rare possibilité que les clients aient choisi de le faire.
Solution de contournement
Si vous avez modifié manuellement un fichier .xoml du flux de travail et que vous l’avez converti en un encodage de caractères autre que UTF-8, vous devez modifier à nouveau le fichier pour le convertir en UTF-8. Assurez-vous que la déclaration XML du fichier définit l’encodage en UTF-8, enregistrez le fichier au format d’encodage de caractères UTF-8 avec votre éditeur de texte, puis redéployez-le.
Le script PowerShell suivant peut être utilisé dans SharePoint Management Shell pour analyser les fichiers .xoml du flux de travail dans une collection de sites SharePoint afin de déterminer s’ils sont affectés par cette modification. La IsGoodWorkflow sortie sera True pour les fichiers .xoml du flux de travail qui utilisent l’encodage de caractères UTF-8 et sont compatibles avec cette modification. La sortie IsGoodWorkflow sera False pour les fichiers .xoml du flux de travail qui n’utilisent pas l’encodage de caractères UTF-8 et qui doivent être modifiés.
<#
.SYNOPSIS
Script to check character encoding of workflow .xoml files found in a site collection.
.DESCRIPTION
This script checks the character encoding of workflow .xoml files found in a site collection based
on the security improvement documented here: https://support.microsoft.com/topic/sharepoint-2010-workflows-might-be-blocked-by-enhanced-security-policy-kb5020238-eb91e24d-eea4-4490-a281-86503adc8b27
This could be altered to take an SPWebApplication object, iterate through all SPSite objects in the Sites SPSiteCollection,
and then iterate through all SPWeb subsites in the AllWebs SPWebCollection.
.EXAMPLE
Get-WorkflowStatusForSite -SiteCollectionUrl https://sharepoint
.EXAMPLE
Get-WorkflowStatusForSite -SiteCollectionUrl https://sharepoint -IgnoreSubSites
.INPUTS
None
.OUTPUTS
PSCustomObject with Site, Web, WorkflowFileName and IsGoodWorkflow Result
Site Web WorkflowFileName IsGoodWorkflow
---- --- ---------------- --------------
SPSite Url=http://sharepoint http://sharepoint/WorkflowTest 2010 Log Workflow.xoml True
SPSite Url=http://sharepoint http://sharepoint/WorkflowTest Another Test Log.xoml True
.NOTES
Version .1
#>
param(
[Parameter(Position=2,HelpMessage="The site collection URL to validate.")]
[string]$SiteCollectionUrl,
[Parameter(Position=3,HelpMessage="Ignore subsites below the top-level site in the site collection.")]
[switch]$IgnoreSubSites
)
function IsGoodWorkflow
{
param
(
[Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[System.Xml.XmlReader]$xmlReader
)
try {
$xDoc = [System.Xml.Linq.XDocument]::Load($xmlReader)
if ($null -ne $xDoc -and $null -ne $xDoc.Declaration -and $null -ne $xDoc.Declaration.Encoding)
{
if ($xdoc.Declaration.Encoding.ToLower() -ne "utf-8")
{
return $false
}
}
}
catch
{
return $false
}
return $true
}
function CheckWorkflowFile
{
param
(
[Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[Microsoft.SharePoint.SPFile]$SPFile
)
$xmlReader = [System.Xml.XmlReader]::Create($SPFile.OpenBinaryStream())
if ($null -ne $xmlReader)
{
$isGood = $xmlReader | IsGoodWorkflow
$xmlReader.Close()
$xmlReader.Dispose()
return [PSCustomObject]@{
Site = $SPFile.Item.Web.Site
Web = $SPFile.Item.Web.Url
WorkflowFileName = $SPFile.Name
IsGoodWorkflow = $isGood
}
}
}
function CheckWorkflowsForWeb
{
param
(
[Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[Microsoft.SharePoint.SPWeb]$SPWeb
)
write-host "Checking $SPweb"
$WorkflowsList = $SPWeb.Lists["Workflows"]
$results = @()
if ($WorkflowsList)
{
Write-Host "Found: " $WorkflowsList.Title
foreach ($listItem in $WorkflowsList.Items)
{
if ($listItem.File -and $listItem.File.Name.ToLower().EndsWith(".xoml"))
{
Write-Host "Found Workflow: " $listItem.File.Name
$results += (CheckWorkflowFile $listItem.File)
}
}
}
return $results
}
function CheckWorkflowsForSite
{
param
(
[Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[Microsoft.SharePoint.SPSite]$SPSite,
[switch]$IgnoreSubSites
)
$results = @()
if ($IgnoreSubSites)
{
$SPWeb = $SPSite.RootWeb
$results += CheckWorkflowsForWeb $SPWeb
$SPWeb.Dispose()
}
else
{
foreach ($SPWeb in $SPSite.AllWebs)
{
$results += CheckWorkflowsForWeb $SPWeb
$SPWeb.Dispose()
}
}
return $results
}
if ([string]::IsNullOrEmpty($SiteCollectionUrl))
{
$SiteCollectionUrl = Read-Host "Please provide a site collection URL (Default: http://sharepoint)"
if ([String]::IsNullOrEmpty($SiteCollectionUrl))
{
$SiteCollectionUrl = "http://sharepoint"
}
}
$SPSite = Get-SPSite $SiteCollectionUrl -ErrorAction SilentlyContinue
if ($null -eq $SPSite)
{
Write-Host "Site collection $SiteCollectionUrl not found." -ForegroundColor Red
return;
}
$results = CheckWorkflowsForSite $SPSite
# Dispose of the Site
$SPSite.Dispose()
# Results can be exported to a CSV or manipulated
$results
Historique des modifications
Le tableau suivant récapitule certaines des modifications les plus importantes apportées à cette rubrique.
Date |
Description |
---|---|
22 novembre 2022 |
Ajout d’une note dans la section « Cause » et mise à jour de la section « Solution de contournement » avec un script PowerShell pour analyser les fichiers .xoml du flux de travail. |