Ознаки
Після інсталяції наведених нижче оновлень системи безпеки для корпорація Майкрософт SharePoint Server деякі сценарії робочого циклу корпорація Майкрософт SharePoint 2010 можуть бути заблоковані. Крім того, позначки подій "6ksbk" реєструються в журналах системи єдиного журналювання SharePoint (ULS).
Причина
Щоб посилити безпеку робочих циклів SharePoint, SharePoint тепер підтримує лише кодування символів UTF-8 для файлів робочих циклів .xoml.
Примітка.: Засоби робочого циклу SharePoint, як-от SharePoint Designer, корпорація Майкрософт 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. |