الأعراض
بعد تثبيت تحديثات أمان أكتوبر التالية Microsoft SharePoint Server، قد يتم حظر بعض سيناريوهات سير عمل SharePoint 2010 Microsoft. بالإضافة إلى ذلك، يتم تسجيل علامات الحدث "6ksbk" في سجلات نظام التسجيل الموحد ل SharePoint (ULS).
-
وصف تحديث الأمان ل SharePoint Foundation 2013: 11 أكتوبر 2022 (KB5002284)
-
وصف تحديث الأمان ل SharePoint Enterprise Server 2016: 11 أكتوبر 2022 (KB5002287)
-
وصف تحديث الأمان SharePoint Server 2019: 11 أكتوبر 2022 (KB5002278)
-
وصف تحديث الأمان إصدار الاشتراك من SharePoint Server: 11 أكتوبر 2022 (KB5002290)
السبب
لتعزيز أمان مهام سير عمل 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 لسير العمل. |