דלג לתוכן הראשי
היכנס דרך Microsoft
היכנס או צור חשבון.
שלום,
בחר חשבון אחר.
יש לך חשבונות מרובים
בחר את החשבון שברצונך להיכנס באמצעותו.

תסמינים

לאחר התקנת עדכוני האבטחה הבאים לאוקטובר עבור Microsoft SharePoint Server, ייתכן שתרחישים מסוימים של זרימת Microsoft SharePoint 2010 ייחסמו. בנוסף, תגיות אירוע "6ksbk" נרשמות ביומני מערכת הרישום המאוחדת (ULS) של SharePoint. 

סיבה

כדי לחזק את האבטחה של זרימות עבודה של SharePoint, SharePoint תומך כעת בקידוד תווים של UTF-8 בלבד עבור קבצי .xoml של זרימת עבודה. 

הערה: כלי זרימת עבודה של SharePoint כגון SharePoint Designer, Microsoft Visual Studio ו- Nintex יוצרים קבצי .xoml של זרימת עבודה באמצעות קידוד תווים של UTF-8 כברירת מחדל. הלקוחות לא יושפעו משיפורים באבטחה אלה, אלא אם הם ערכו באופן ידני את קבצי .xoml של זרימת העבודה שלהם והמירו אותם לקידוד תווים אחר. בעיה זו מופיעה במאמר KB זה על האפשרות הנו נדירה במיוחד שלקוחות בחרו לעשות זאת.

פתרון עוקף

אם ערכת באופן ידני קובץ .xoml של זרימת עבודה והמרת אותו לקידוד תווים שאינו UTF-8, יהיה עליך לערוך מחדש את הקובץ כדי להמיר אותו בחזרה ל- UTF-8. ודא שהצהרת ה- XML של הקובץ מגדירה את הקידוד כ- UTF-8, שמור את הקובץ בתבנית קידוד תווים של UTF-8 באמצעות עורך הטקסט ולאחר מכן מקם אותו מחדש.

ניתן להשתמש בקובץ ה- Script הבא של 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

הוספת הערה במקטע 'סיבה' ועודכנה את המקטע 'פתרון עוקף' באמצעות קובץ Script של PowerShell לסריקה של קבצי .xoml של זרימת העבודה.

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלך?
בלחיצה על 'שלח', אתה מאפשר למשוב שלך לשפר מוצרים ושירותים של Microsoft. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×