Symptomen
Nadat u de volgende beveiligingsupdates van oktober voor Microsoft SharePoint Server hebt geïnstalleerd, worden sommige Microsoft SharePoint 2010-werkstroomscenario's mogelijk geblokkeerd. Bovendien worden gebeurtenistags '6ksbk' geregistreerd in ULS-logboeken (Unified Logging System) van SharePoint.
Oorzaak
Om de beveiliging van SharePoint-werkstromen te verbeteren, ondersteunt SharePoint nu alleen UTF-8-tekencodering voor werkstroom.xoml-bestanden.
Opmerking: SharePoint-werkstroomhulpprogramma's, zoals SharePoint Designer, Microsoft Visual Studio en Nintex, maken standaard .xoml-bestanden met UTF-8-tekencodering. Klanten worden niet beïnvloed door deze beveiligingsverbetering, tenzij ze hun werkstroom .xoml-bestanden handmatig hebben bewerkt en geconverteerd naar een andere tekencodering. Dit probleem wordt beschreven in dit KB-artikel over de uiterst zeldzame mogelijkheid dat klanten ervoor hebben gekozen om dit te doen.
Tijdelijke oplossing
Als u een xoml-werkstroombestand handmatig hebt bewerkt en geconverteerd naar een andere tekencodering dan UTF-8, moet u het bestand opnieuw bewerken om het weer te converteren naar UTF-8. Zorg ervoor dat de XML-declaratie van het bestand de codering definieert als UTF-8, sla het bestand op in de UTF-8-tekencoderingsindeling met uw teksteditor en implementeer het opnieuw.
Het volgende PowerShell-script kan worden gebruikt in de SharePoint Management Shell om de xoml-werkstroombestanden in een SharePoint-siteverzameling te scannen om te bepalen of deze worden beïnvloed door deze wijziging. De IsGoodWorkflow uitvoer wordt True voor werkstroom .xoml-bestanden die gebruikmaken van UTF-8-tekencodering en die compatibel zijn met deze wijziging. De uitvoer van IsGoodWorkflow wordt False voor werkstroom.xoml-bestanden die geen UTF-8-tekencodering gebruiken en moeten worden gewijzigd.
<#
.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
Wijzigingsoverzicht
De volgende tabel bevat een overzicht van enkele van de belangrijkste wijzigingen in dit onderwerp.
Datum |
Beschrijving |
---|---|
dinsdag 22 november 2022 |
Er is een opmerking toegevoegd in de sectie Oorzaak en de sectie Tijdelijke oplossing bijgewerkt met een PowerShell-script om de xoml-bestanden van de werkstroom te scannen. |