Příznaky
Po instalaci následujících říjnových aktualizací zabezpečení pro Microsoft SharePoint Server můžou být blokované některé scénáře Microsoft pracovních postupů SharePointu 2010. Kromě toho se značky událostí "6ksbk" protokolují v protokolech systému uls (Unified Logging System) SharePointu.
Příčina
Aby se posílilo zabezpečení sharepointových pracovních postupů, Podporuje teď SharePoint pouze kódování znaků UTF-8 pro soubory .xoml pracovního postupu.
Poznámka: Nástroje pracovního postupu SharePointu, jako je SharePoint Designer, Microsoft Visual Studio a Nintex, vytvářejí soubory .xoml pracovního postupu pomocí kódování znaků UTF-8 ve výchozím nastavení. Toto vylepšení zabezpečení nebude mít vliv na zákazníky, pokud ručně neupraví soubory .xoml pracovního postupu a nepřevedou je na jiné kódování znaků. Tento problém je zdokumentován v tomto článku znalostní báze o mimořádně vzácné možnosti, že se k tomu zákazníci mohli rozhodli.
Alternativní řešení
Pokud jste soubor .xoml pracovního postupu upravili ručně a převedli ho na jiné kódování znaků než UTF-8, budete ho muset znovu upravit, abyste ho převedli zpátky na UTF-8. Ujistěte se, že deklarace XML souboru definuje kódování jako UTF-8, uložte soubor ve formátu kódování znaků UTF-8 v textovém editoru a pak ho znovu nasaďte.
Následující skript PowerShellu je možné použít v prostředí SharePoint Management Shell ke kontrole souborů .xoml pracovního postupu v kolekci webů SharePointu a určení, jestli jsou touto změnou ovlivněny. Výstup IsGoodWorkflow bude True pro soubory .xoml pracovního postupu, které používají kódování znaků UTF-8 a jsou s touto změnou kompatibilní. Výstup IsGoodWorkflow bude False pro soubory .xoml pracovního postupu, které nepoužívají kódování znaků UTF-8 a je potřeba je upravit.
<#
.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
Historie změn
Následující tabulka shrnuje některé z nejdůležitějších změn tohoto tématu.
Datum |
Popis |
---|---|
úterý 22. listopadu 2022 |
V části Příčina byla přidána poznámka a část Alternativní řešení byla aktualizována skriptem PowerShellu pro kontrolu souborů .xoml pracovního postupu. |