Symptomer
Når du har installeret følgende sikkerhedsopdateringer fra oktober til Microsoft SharePoint Server, blokeres nogle Microsoft SharePoint 2010-arbejdsprocesscenarier. Desuden logføres hændelsesmærkerne "6ksbk" i ULS-logfiler (SharePoint Unified Logging System).
Årsag
For at styrke sikkerheden for SharePoint-arbejdsprocesser understøtter SharePoint nu kun UTF-8-tegnkodning for arbejdsproces .xoml-filer.
Bemærk!: SharePoint-arbejdsprocesværktøjer som f.eks. SharePoint Designer, Microsoft Visual Studio og Nintex opretter arbejdsproces .xoml-filer ved hjælp af UTF-8-tegnkodning som standard. Kunder påvirkes ikke af denne sikkerhedsforbedring, medmindre de manuelt har redigeret deres .xoml-arbejdsprocesfiler og konverteret dem til en anden tegnkodning. Dette problem er beskrevet i denne vidensbaseartikel om den yderst sjældne mulighed for, at kunder kan have valgt at gøre dette.
Løsning
Hvis du manuelt har redigeret en .xoml-arbejdsprocesfil og konverteret den til en anden tegnkodning end UTF-8, skal du redigere filen igen for at konvertere den tilbage til UTF-8. Kontrollér, at filens XML-erklæring definerer kodningen som UTF-8, gem filen i UTF-8-tegnkodningsformatet sammen med teksteditoren, og geninstaller den derefter.
Følgende PowerShell-script kan bruges i SharePoint Management Shell til at scanne arbejdsprocessens .xoml-filer i en gruppe af SharePoint-websteder for at afgøre, om de påvirkes af denne ændring. Outputtet IsGoodWorkflow bliver True for arbejdsproces .xoml-filer, der bruger UTF-8-tegnkodning og er kompatible med denne ændring. Det IsGoodWorkflow output bliver False for arbejdsproces .xoml-filer, der ikke bruger UTF-8-tegnkodning og skal ændres.
<#
.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
Ændringsoversigt
Følgende tabel opsummerer nogle af de vigtigste ændringer i dette emne.
Dato |
Beskrivelse |
---|---|
22. november 2022 |
Der er tilføjet en note i sektionen "Årsag" og opdateret afsnittet "Løsning" med et PowerShell-script for at scanne arbejdsprocessens .xoml-filer. |