Symtom
När du har installerat följande säkerhetsuppdateringar för oktober för Microsoft SharePoint Server kan vissa Microsoft SharePoint 2010-arbetsflödesscenarier blockeras. Dessutom loggas händelsetaggar för "6ksbk" i ULS-loggar (SharePoint Unified Logging System).
Orsak
För att öka säkerheten för SharePoint-arbetsflöden har SharePoint nu stöd för endast UTF-8-teckenkodning för arbetsflödes-.xoml-filer.
Obs!: SharePoint-arbetsflödesverktyg som SharePoint Designer, Microsoft Visual Studio och Nintex skapar arbetsflödes-.xoml-filer med UTF-8-teckenkodning som standard. Kunderna påverkas inte av den här säkerhetsförbättringen om de inte har redigerat arbetsflödets XOML-filer manuellt och konverterat dem till en annan teckenkodning. Det här problemet beskrivs i den här KB-artikeln om den extremt sällsynta möjligheten som kunder kan ha valt att göra detta.
Tillfällig lösning
Om du har redigerat en manuellt .xoml-fil och konverterat den till en annan teckenkodning än UTF-8 måste du redigera filen igen för att konvertera tillbaka den till UTF-8. Kontrollera att filens XML-deklaration definierar kodningen som UTF-8, spara filen i teckenkodningsformatet UTF-8 med textredigeraren och distribuera den sedan igen.
Följande PowerShell-skript kan användas i SharePoint Management Shell för att genomsöka arbetsflödets .xoml-filer i en SharePoint-webbplatssamling för att avgöra om de påverkas av den här ändringen. Det IsGoodWorkflow utdata blir True för arbetsflödes-.xoml-filer som använder UTF-8-teckenkodning och är kompatibla med den här ändringen. Det IsGoodWorkflow utdata kommer att False för arbetsflödes-XOML-filer som inte använder UTF-8-teckenkodning och måste ändras.
<#
.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
Ändringshistorik
I följande tabell sammanfattas några av de viktigaste ändringarna i det här avsnittet.
Datum |
Beskrivning |
---|---|
den 22 november 2022 |
Lade till en anteckning i avsnittet "Orsak" och uppdaterade avsnittet "Lösning" med ett PowerShell-skript för att söka igenom arbetsflödets .xoml-filer. |