Síntomas
Después de instalar las siguientes actualizaciones de seguridad de octubre para Microsoft SharePoint Server, es posible que algunos escenarios de flujo de trabajo de Microsoft SharePoint 2010 estén bloqueados. Además, las etiquetas de eventos "6ksbk" se registran en los registros del Sistema de registro unificado (ULS) de SharePoint.
Causa
Para reforzar la seguridad de los flujos de trabajo de SharePoint, SharePoint ahora solo admite la codificación de caracteres UTF-8 para archivos .xoml de flujo de trabajo.
Nota: Herramientas de flujo de trabajo de SharePoint como SharePoint Designer, Microsoft Visual Studio y Nintex crean archivos .xoml de flujo de trabajo con codificación de caracteres UTF-8 de forma predeterminada. Los clientes no se verán afectados por esta mejora de seguridad a menos que hayan editado manualmente sus archivos .xoml de flujo de trabajo y los hayan convertido en una codificación de caracteres diferente. Este problema se documenta en este artículo de KB sobre la muy rara posibilidad de que los clientes hayan elegido hacerlo.
Solución alternativa
Si ha editado manualmente un archivo .xoml de flujo de trabajo y lo ha convertido en una codificación de caracteres distinta de UTF-8, tendrá que volver a editar el archivo para convertirlo de nuevo a UTF-8. Asegúrese de que la declaración XML del archivo define la codificación como UTF-8, guarde el archivo en el formato de codificación de caracteres UTF-8 con el editor de texto y vuelva a implementarlo.
El siguiente script de PowerShell se puede usar en el Shell de administración de SharePoint para examinar los archivos .xoml de flujo de trabajo en una colección de sitios de SharePoint para determinar si se ven afectados por este cambio. El resultado IsGoodWorkflow será True para los archivos .xoml de flujo de trabajo que usan la codificación de caracteres UTF-8 y son compatibles con este cambio. El resultadoIsGoodWorkflow será False para los archivos .xoml de flujo de trabajo que no usan codificación de caracteres UTF-8 y deben modificarse.
<#
.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
Historial de cambios
En la tabla siguiente se resumen algunos de los cambios más importantes de este tema.
Fecha |
Descripción |
---|---|
22 de noviembre de 2022 |
Se ha agregado una nota en la sección de "Causa" y se ha actualizado la sección "Solución alternativa" con un script de PowerShell para examinar los archivos .xoml del flujo de trabajo. |