Simptome
După ce instalați următoarele actualizări de securitate din octombrie pentru Microsoft SharePoint Server, unele scenarii de flux de lucru Microsoft SharePoint 2010 pot fi blocate. În plus, etichetele de evenimente "6ksbk" sunt înregistrate în jurnalele SharePoint Unified Logging System (ULS).
Cauza
Pentru a consolida securitatea fluxurilor de lucru SharePoint, SharePoint acceptă acum doar codificarea UTF-8 caractere pentru fișierele .xoml ale fluxului de lucru.
Notă: Instrumentele de flux de lucru SharePoint, cum ar fi SharePoint Designer, Microsoft Visual Studio și Nintex creează fișiere .xoml flux de lucru utilizând codificarea de caractere UTF-8 în mod implicit. Clienții nu vor fi afectați de această îmbunătățire de securitate decât dacă au editat manual fișierele .xoml ale fluxului de lucru și le-au convertit într-o codificare de caractere diferită. Această problemă este documentată în acest articol din Baza de informații despre posibilitatea extrem de rară ca clienții să fi ales să facă acest lucru.
Soluție de evitare
Dacă ați editat manual un fișier .xoml de flux de lucru și l-ați transformat într-o codificare de caractere diferită de UTF-8, va trebui să editați din nou fișierul pentru a-l converti înapoi la UTF-8. Asigurați-vă că declarația XML a fișierului definește codificarea ca UTF-8, salvați fișierul în formatul de codificare a caracterelor UTF-8 cu editorul de text, apoi reimplementați-l.
Următorul script PowerShell poate fi utilizat în componenta de administrare SharePoint pentru a scana fișierele .xoml ale fluxului de lucru dintr-o colecție de site-uri SharePoint pentru a determina dacă sunt afectate de această modificare. Rezultatul IsGoodWorkflow va fi True pentru fișierele .xoml de flux de lucru care utilizează codificarea de caractere UTF-8 și sunt compatibile cu această modificare. Rezultatul IsGoodWorkflow va fi False pentru fișierele .xoml de flux de lucru care nu utilizează codificarea de caractere UTF-8 și trebuie modificate.
<#
.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
Istoricul modificărilor
Următorul tabel rezumă unele dintre cele mai importante modificări ale acestui subiect.
Dată |
Descriere |
---|---|
22 noiembrie 2022 |
Am adăugat o notă în secțiunea "Cauză" și am actualizat secțiunea "Soluție de evitare" cu un script PowerShell pentru a scana fișierele .xoml ale fluxului de lucru. |