Симптоми
След като инсталирате следните актуализации на защитата от октомври за Microsoft SharePoint Server, някои сценарии за работен поток на SharePoint 2010 Microsoft може да са блокирани. Освен това етикетите на събития "6ksbk" се записват в регистрационните файлове на единната система за регистриране на SharePoint (ULS).
Причина
За да се засили защитата на работните потоци на SharePoint, SharePoint вече поддържа само UTF-8 кодиране за .xoml файлове на работния поток.
Забележка: Инструменти за работен поток на SharePoint, като sharePoint Designer, Microsoft Visual Studio и Nintex, създават .xoml файлове на работния поток с помощта на UTF-8 кодиране на знаци по подразбиране. Клиентите няма да бъдат засегнати от това подобрение на защитата, освен ако не са редактирали ръчно своите .xoml файлове на работния поток и не ги конвертират в друго кодиране на знаците. Този проблем е документиран в тази статия от Базата знания за изключително рядка възможност клиентите да са избрали да направят това.
Заобиколно решение
Ако сте редактирали ръчно .xoml файл на работен поток и сте го конвертирали в кодиране, различно от UTF-8, ще трябва да редактирате отново файла, за да го конвертирате обратно в UTF-8. Уверете се, че XML декларацията на файла дефинира кодирането като UTF-8, запишете файла във формат на UTF-8 знаково кодиране с вашия текстов редактор и след това го разположете повторно.
Следващият скрипт на PowerShell може да се използва в обвивката на SharePoint за управление, за да сканирате .xoml файловете на работния поток в колекция от сайтове на SharePoint, за да определите дали те са засегнати от тази промяна. Изходът от IsGoodWorkflow ще бъде True за .xoml файлове на работния поток, които използват UTF-8 кодиране на знаци и са съвместими с тази промяна. Резултатът от IsGoodWorkflow ще бъде False за .xoml файлове на работния поток, които не използват UTF-8 кодиране на знаци и трябва да бъдат променени.
<#
.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
Хронология на промените
Следващата таблица обобщава някои от най-важните промени в тази тема.
Дата |
Описание |
---|---|
22 ноември 2022 г. |
Добавена бележка в секцията "Причина" и актуализирала секцията "Заобиколно решение" със скрипт на PowerShell за сканиране на .xoml файловете на работния поток. |