Symptomer
Når du har installert følgende sikkerhetsoppdateringer for Microsoft SharePoint Server for oktober, kan noen Microsoft SharePoint 2010-arbeidsflytscenarioer være blokkert. I tillegg logges hendelseskoder for «6ksbk» i logger for SharePoint Unified Logging System (ULS).
Årsak
For å styrke sikkerheten til SharePoint-arbeidsflyter støtter SharePoint nå bare UTF-8-tegnkoding for XOML-filer i arbeidsflyten.
Obs!: SharePoint-arbeidsflytverktøy som SharePoint Designer, Microsoft Visual Studio og Nintex oppretter XOML-filer for arbeidsflyt ved hjelp av UTF-8-tegnkoding som standard. Kunder blir ikke påvirket av denne sikkerhetsforbedringen med mindre de har redigert XOML-filene i arbeidsflyten manuelt og konvertert dem til en annen tegnkoding. Dette problemet er dokumentert i denne KB-artikkelen om den svært sjeldne muligheten for at kunder kan ha valgt å gjøre dette.
Løsning
Hvis du har redigert en XOML-fil for arbeidsflyt manuelt og konvertert den til en annen tegnkoding enn UTF-8, må du redigere filen på nytt for å konvertere den tilbake til UTF-8. Kontroller at filens XML-deklarasjon definerer kodingen som UTF-8, lagre filen i UTF-8-tegnkodingsformatet med tekstredigeringsprogrammet, og distribuere den deretter på nytt.
Følgende PowerShell-skript kan brukes i administrasjonsskallet for SharePoint til å skanne XOML-filene for arbeidsflyten i en SharePoint-områdesamling for å finne ut om de påvirkes av denne endringen. Utdataene for IsGoodWorkflow blir True for XOML-filer for arbeidsflyt som bruker UTF-8-tegnkoding og som er kompatible med denne endringen. Utdataene for IsGoodWorkflow blir False for XOML-filer for arbeidsflyt som ikke bruker UTF-8-tegnkoding og må endres.
<#
.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
Endringslogg
Tabellen nedenfor oppsummerer noen av de viktigste endringene i dette emnet.
Dato |
Beskrivelse |
---|---|
22. november 2022 kl. |
La til et notat i «Årsak»-delen og oppdaterte «Løsning»-delen med et PowerShell-skript for å skanne XOML-filene i arbeidsflyten. |