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

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.

További segítségre van szüksége?

További lehetőségeket szeretne?

Fedezze fel az előfizetés előnyeit, böngésszen az oktatóanyagok között, ismerje meg, hogyan teheti biztonságossá eszközét, és így tovább.

A közösségek segítségével kérdéseket tehet fel és válaszolhat meg, visszajelzést adhat, és részletes ismeretekkel rendelkező szakértőktől hallhat.