Tünetek
Miután telepítette Microsoft SharePoint Server következő októberi biztonsági frissítéseit, előfordulhat, hogy bizonyos Microsoft SharePoint 2010-munkafolyamatok le lesznek tiltva. Emellett a "6ksbk" eseménycímkéket a rendszer a SharePoint Egyesített naplózási rendszer (ULS) naplóiban naplózza.
A jelenség oka
A SharePoint-munkafolyamatok biztonságának megerősítése érdekében a SharePoint mostantól csak az UTF-8 karakterkódolást támogatja a munkafolyamat .xoml fájljaihoz.
Megjegyzés: A SharePoint munkafolyamat-eszközei, például a SharePoint Designer, a Microsoft a Visual Studio és a Nintex alapértelmezés szerint UTF-8 karakterkódolással hoznak létre .xoml munkafolyamat-fájlokat. A biztonsági fejlesztések nem érintik az ügyfeleket, hacsak nem szerkesztették manuálisan a munkafolyamat .xoml fájljait, és nem konvertálták őket más karakterkódolásra. Ez a probléma ebben a tudásbáziscikkben található, amely azt a rendkívül ritka lehetőséget ismerteti, hogy az ügyfelek esetleg ezt a lehetőséget választották.
Kerülő megoldás
Ha manuálisan szerkesztett egy .xoml munkafolyamat-fájlt, és nem UTF-8 karakterkódolásra konvertálta, újra kell szerkesztenie a fájlt, hogy visszakonvertálja UTF-8-ra. Győződjön meg arról, hogy a fájl XML-deklarációja az UTF-8 kódolást határozza meg, mentse a fájlt UTF-8 karakterkódolási formátumban a szövegszerkesztővel, majd helyezze újra üzembe.
A SharePoint Felügyeleti rendszerhéjban a következő PowerShell-szkripttel megvizsgálhatja a SharePoint-webhelycsoport .xoml munkafolyamat-fájljait annak megállapításához, hogy érinti-e őket ez a változás. A IsGoodWorkflow kimenete True lesz az UTF-8 karakterkódolást használó, és ezzel a módosítással kompatibilis .xoml munkafolyamat-fájlokhoz. A IsGoodWorkflow kimenete False lesz az UTF-8 karakterkódolást nem használó, és módosítani kívánt .xoml munkafolyamat-fájlokhoz.
<#
.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
Változások jegyzéke
Az alábbi táblázat összefoglalja a témakör legfontosabb módosításait.
Dátum |
Ismertetés |
---|---|
2022. november 22. |
Az "Ok" szakaszban megjegyzést fűztek hozzá, és frissítették a "Kerülő megoldás" szakaszt egy PowerShell-szkripttel a munkafolyamat .xoml fájljainak vizsgálatához. |