Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Συμπτώματα

Μετά την εγκατάσταση των ακόλουθων ενημερώσεων ασφαλείας του Οκτωβρίου για 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 της ροής εργασιών.

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.

Σας βοήθησαν αυτές οι πληροφορίες;

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;
Πατώντας "Υποβολή" τα σχόλια σας θα χρησιμοποιηθούν για τη βελτίωση των προϊόντων και των υπηρεσιών της Microsoft. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×