Symptome
Nachdem Sie die folgenden Sicherheitsupdates vom Oktober für Microsoft SharePoint Server installiert haben, sind möglicherweise einige Microsoft SharePoint 2010-Workflowszenarien blockiert. Darüber hinaus werden „6ksbk“-Ereignistags in SharePoint ULS-Protokollen (Unified Logging System) protokolliert.
Ursache
Um die Sicherheit von SharePoint-Workflows zu erhöhen, unterstützt SharePoint jetzt nur die UTF-8-Zeichencodierung für Workflow-XOML-Dateien.
Hinweis: SharePoint-Workflowtools wie SharePoint Designer, Microsoft Visual Studio und Nintex erstellen standardmäßig xoml-Workflowdateien mit UTF-8-Zeichencodierung. Kunden sind von dieser Sicherheitsverbesserung nur betroffen, wenn sie ihre Xoml-Workflowdateien manuell bearbeitet und in eine andere Zeichencodierung konvertiert haben. Dieses Problem ist in diesem KB-Artikel über die äußerst seltenen Möglichkeiten dokumentiert, die Kunden möglicherweise gewählt haben, dies zu tun.
Problemumgehung
Wenn Sie eine Workflow-XOML-Datei manuell bearbeitet und in eine andere Zeichencodierung als UTF-8 konvertiert haben, müssen Sie die Datei erneut bearbeiten, um sie wieder in UTF-8 zu konvertieren. Stellen Sie sicher, dass die XML-Deklaration der Datei die Codierung als UTF-8 definiert, speichern Sie die Datei im UTF-8-Zeichencodierungsformat mit Ihrem Text-Editor, und stellen Sie sie dann erneut bereit.
Das folgende PowerShell-Skript kann in der SharePoint-Verwaltungsshell verwendet werden, um die xoml-Workflowdateien in einer SharePoint-Websitesammlung zu überprüfen, um festzustellen, ob sie von dieser Änderung betroffen sind. Die IsGoodWorkflow Ausgabe wird zu True für Workflow-XOML-Dateien, die UTF-8-Zeichencodierung verwenden und mit dieser Änderung kompatibel sind. Der IsGoodWorkflow Ausgabe wird zu False für Workflow-XOML-Dateien, die keine UTF-8-Zeichencodierung verwenden und geändert werden müssen.
<#
.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
Änderungsverlauf
In der folgenden Tabelle sind einige der wichtigsten Änderungen an diesem Thema zusammengefasst.
Datum |
Beschreibung |
---|---|
22. November 2022 |
Im Abschnitt "Ursache" wurde eine Notiz hinzugefügt und der Abschnitt "Problemumgehung" mit einem PowerShell-Skript aktualisiert, um die xoml-Workflowdateien zu überprüfen. |