Sintomi
Dopo aver installato i seguenti aggiornamenti della sicurezza di ottobre per Microsoft SharePoint Server, alcuni scenari di flussi di lavoro di Microsoft SharePoint 2010 potrebbero essere bloccati. Inoltre, i tag evento "6ksbk" vengono registrati nei log del sistema di registrazione unificato di SharePoint.
Causa
Per rafforzare la sicurezza dei flussi di lavoro di SharePoint, SharePoint supporta ora solo la codifica dei caratteri UTF-8 per i file XOML del flusso di lavoro.
Nota: Gli strumenti del flusso di lavoro di SharePoint, ad esempio SharePoint Designer, Microsoft Visual Studio e Nintex, consentono di creare file xoml del flusso di lavoro usando la codifica dei caratteri UTF-8 per impostazione predefinita. I clienti non saranno interessati da questo miglioramento della sicurezza a meno che non abbiano modificato manualmente i file XOML del flusso di lavoro e non li abbiano convertiti in una codifica di caratteri diversa. Questo problema è documentato in questo articolo della Knowledge Base sulla possibilità estremamente rara che i clienti abbiano scelto di eseguire questa operazione.
Soluzione alternativa
Se è stato modificato manualmente un file xoml del flusso di lavoro e lo si è convertito in una codifica di caratteri diversa da UTF-8, sarà necessario modificare nuovamente il file per convertirlo di nuovo in UTF-8. Verificare che la dichiarazione XML del file definisca la codifica UTF-8, salvare il file nel formato di codifica dei caratteri UTF-8 con l'editor di testo e quindi ridistribuirlo.
Lo script di PowerShell seguente può essere usato in SharePoint Management Shell per analizzare i file con estensione xoml del flusso di lavoro in una raccolta siti di SharePoint per determinare se sono interessati da questa modifica. L'output IsGoodWorkflow verrà True per i file con estensione xoml del flusso di lavoro che usano la codifica dei caratteri UTF-8 e sono compatibili con questa modifica. L'output IsGoodWorkflow verrà False per i file con estensione xoml del flusso di lavoro che non usano la codifica dei caratteri UTF-8 e che devono essere modificati.
<#
.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
Cronologia delle modifiche
La tabella seguente riepiloga alcune delle modifiche più importanti apportate a questo argomento.
Data |
Descrizione |
---|---|
22 novembre 2022 |
È stata aggiunta una nota nella sezione "Causa" e aggiornata la sezione "Soluzione alternativa" con uno script di PowerShell per analizzare i file xoml del flusso di lavoro. |