Oznaki
Po zainstalowaniu następujących październikowych aktualizacji zabezpieczeń dla programu Microsoft SharePoint Server niektóre Microsoft scenariusze przepływu pracy programu SharePoint 2010 mogą zostać zablokowane. Ponadto tagi zdarzeń "6ksbk" są rejestrowane w dziennikach ujednoliconego systemu rejestrowania (ULS) programu SharePoint.
Przyczyna
Aby zwiększyć bezpieczeństwo przepływów pracy programu SharePoint, program SharePoint obsługuje teraz tylko kodowanie znaków UTF-8 dla plików xoml przepływu pracy.
Uwaga: Narzędzia przepływów pracy programu SharePoint, takie jak SharePoint Designer, Microsoft Visual Studio i Nintex, domyślnie tworzą pliki xoml przepływu pracy przy użyciu kodowania znaków UTF-8. Udoskonalenie zabezpieczeń nie wpłynie na klientów, chyba że ręcznie edytowali swoje pliki xoml przepływu pracy i przekonwertowali je na inne kodowanie znaków. Ten problem został udokumentowany w tym artykule z bazy wiedzy na temat niezwykle rzadkiej możliwości wybrania tego przez klientów.
Obejście
Jeśli ręcznie edytowano plik xoml przepływu pracy i przekonwertowano go na kodowanie znaków inne niż UTF-8, musisz ponownie edytować plik, aby przekonwertować go z powrotem na utf-8. Upewnij się, że deklaracja XML pliku definiuje kodowanie jako UTF-8, zapisz plik w formacie kodowania znaków UTF-8 w edytorze tekstów, a następnie przesuń go ponownie.
Poniższego skryptu programu PowerShell można użyć w powłoce zarządzania programu SharePoint w celu przeskanowania plików xoml przepływu pracy w zbiorze witryn programu SharePoint w celu ustalenia, czy zmiana dotyczy ich. Dane wyjściowe IsGoodWorkflow zostaną True dla plików xoml przepływu pracy, które używają kodowania znaków UTF-8 i są zgodne z tą zmianą. Dane wyjściowe IsGoodWorkflow zostaną False dla plików xoml przepływu pracy, które nie używają kodowania znaków UTF-8 i wymagają modyfikacji.
<#
.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
Historia zmian
W poniższej tabeli podsumowano niektóre z najważniejszych zmian w tym temacie.
Data |
Opis |
---|---|
22 listopada 2022 r. |
Dodano notatkę w sekcji "Przyczyna" i zaktualizowano sekcję "Obejście" za pomocą skryptu programu PowerShell w celu zeskanowania plików xoml przepływu pracy. |