Applies ToSharePoint Foundation 2013 SP1 SharePoint Server 2016 SharePoint Server 2019 SharePoint Server Subscription Edition

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.

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.

Comunitățile vă ajută să adresați întrebări și să răspundeți la întrebări, să oferiți feedback și să primiți feedback de la experți cu cunoștințe bogate.