تسجيل الدخول باستخدام حساب Microsoft
سجل الدخول أو أنشئ حسابا.
مرحباً،
حدد حسابا مختلفا.
لديك حسابات متعددة
اختر الحساب الذي تريد تسجيل الدخول باستخدامه.

الأعراض

بعد تثبيت تحديثات أمان أكتوبر التالية Microsoft SharePoint Server، قد يتم حظر بعض سيناريوهات سير عمل SharePoint 2010 Microsoft. بالإضافة إلى ذلك، يتم تسجيل علامات الحدث "6ksbk" في سجلات نظام التسجيل الموحد ل SharePoint (ULS). 

السبب

لتعزيز أمان مهام سير عمل SharePoint، يدعم SharePoint الآن ترميز أحرف UTF-8 فقط لملفات .xoml لسير العمل. 

ملاحظة: تنشئ أدوات سير عمل SharePoint مثل SharePoint Designer Microsoft Visual Studio وNntex ملفات سير العمل .xoml باستخدام ترميز أحرف UTF-8 بشكل افتراضي. لن يتأثر العملاء بتحسين الأمان هذا إلا إذا قاموا بتحرير ملفات .xoml لسير العمل يدويا وتحويلها إلى ترميز حرف مختلف. تم توثيق هذه المشكلة في مقالة KB هذه حول احتمال نادر للغاية أن العملاء قد اختاروا القيام بذلك.

الحل البديل

إذا قمت بتحرير ملف .xoml لسير العمل يدويا وتحويله إلى ترميز حرف آخر غير UTF-8، فستحتاج إلى إعادة تحرير الملف لتحويله مرة أخرى إلى UTF-8. تأكد من أن تعريف XML للملف يعرف الترميز على أنه UTF-8، واحفظ الملف بتنسيق ترميز حرف UTF-8 باستخدام محرر النص، ثم أعد توزيعه.

يمكن استخدام البرنامج النصي PowerShell التالي في SharePoint Management Shell لفحص ملفات .xoml لسير العمل في مجموعة مواقع SharePoint المشتركة لتحديد ما إذا كانت متأثرة بهذا التغيير. سيتم True إخراج IsGoodWorkflow لملفات سير العمل .xoml التي تستخدم ترميز حرف UTF-8 وهي متوافقة مع هذا التغيير. سيتم False إخراج IsGoodWorkflow لملفات سير العمل .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 Insider

هل كانت المعلومات مفيدة؟

ما مدى رضاك عن جودة اللغة؟
ما الذي أثّر في تجربتك؟

نشكرك على ملاحظاتك!

×