Применяется к
SharePoint Foundation 2013 SP1 SharePoint Server 2016 SharePoint Server 2019 SharePoint Server Subscription Edition

Признаки

После установки следующих обновлений для системы безопасности за октябрь Майкрософт SharePoint Server некоторые сценарии рабочих процессов Майкрософт SharePoint 2010 могут быть заблокированы. Кроме того, теги событий "6ksbk" регистрируются в журналах единой системы ведения журнала SharePoint (ULS). 

Причина

Чтобы повысить безопасность рабочих процессов SharePoint, SharePoint теперь поддерживает только кодировку символов UTF-8 для XOML-файлов рабочих процессов. 

Примечание: Средства рабочих процессов SharePoint, такие как SharePoint Designer, Майкрософт 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-файлов рабочего процесса.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.