Príznaky
Po inštalácii nasledujúcich októbrových aktualizácií zabezpečenia pre Microsoft SharePoint Server môžu byť niektoré scenáre pracovného postupu Microsoft SharePointu 2010 zablokované. Okrem toho sa značky udalostí "6ksbk" zapisujú do denníkov ULS (Unified Logging System) služby SharePoint.
Príčina
Aby sa posilnilo zabezpečenie pracovných postupov SharePointu, SharePoint teraz podporuje iba kódovanie znakov UTF-8 pre súbory .xoml pracovného postupu.
Poznámka: Nástroje pracovného postupu SharePointu, ako napríklad SharePoint Designer, Microsoft Visual Studio a Nintex, predvolene vytvárajú súbory pracovného postupu .xoml pomocou kódovania znakov UTF-8. Toto zlepšenie zabezpečenia nebude mať vplyv na zákazníkov, pokiaľ manuálne neupravujú svoje súbory .xoml pracovného postupu a neskonvertujú ich na iné kódovanie znakov. Tento problém je zdokumentovaný v tomto článku DATABÁZY KB o veľmi zriedkavých možnostiach, že zákazníci sa rozhodli tak urobiť.
Alternatívne riešenie
Ak ste manuálne upravili súbor .xoml pracovného postupu a skonvertovali ho na iné znaky ako UTF-8, súbor budete musieť znova upraviť, aby ste ho skonvertovali späť na UTF-8. Uistite sa, že deklarácia XML súboru definuje kódovanie ako UTF-8, uložte súbor vo formáte kódovania UTF-8 pomocou textového editora a potom ho znova nasadiť.
Nasledujúci skript prostredia PowerShell možno použiť v prostredí správy služby SharePoint na skenovanie súborov .xoml pracovného postupu v kolekcii lokalít SharePoint a zistiť, či sa na ne táto zmena vzťahuje. Výstup IsGoodWorkflow bude True pre súbory .xoml pracovného postupu, ktoré používajú kódovanie znakov UTF-8 a sú kompatibilné s touto zmenou. Výstup IsGoodWorkflow bude False pre súbory .xoml pracovného postupu, ktoré nepoužívajú kódovanie znakov UTF-8 a je potrebné ich upraviť.
<#
.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
História zmien
Nasledujúca tabuľka obsahuje súhrn niektorých najdôležitejších zmien tejto témy.
Dátum |
Popis |
---|---|
22. novembra 2022 |
Pridali poznámku v časti Príčina a aktualizovali časť Alternatívne riešenie pomocou skriptu prostredia PowerShell na kontrolu súborov .xoml pracovného postupu. |