Kirjaudu sisään Microsoft-tilillä
Kirjaudu sisään tai luo tili.
Hei,
Käytä toista tiliä.
Sinulla on useita tilejä
Valitse tili, jolla haluat kirjautua sisään.

Oireet

Kun olet asentanut seuraavat lokakuun suojauspäivitykset Microsoft SharePoint Serveriin, jotkin Microsoft SharePoint 2010 -työnkulun skenaariot saatetaan estää. Lisäksi 6ksbk-tapahtumatunnisteet kirjataan SharePoint Unified Logging System (ULS) -lokeihin. 

Syy

SharePoint vahvistaa SharePoint-työnkulkujen suojausta tukemalla nyt vain UTF-8-merkkikoodausta työnkulun .xoml-tiedostoissa. 

Huomautus: SharePoint-työnkulun työkalut, kuten SharePoint Designer, Microsoft Visual Studio ja Nintex, luovat työnkulun .xoml-tiedostoja oletusarvoisesti käyttämällä UTF-8-merkkikoodausta. Tämä suojausparannus ei vaikuta asiakkaisiin, elleivät he ole muokanneet työnkulun .xoml-tiedostoja manuaalisesti ja muuntaneet niitä eri merkkikoodauksi. Tämä ongelma on dokumentoitu tässä KB-artikkelissa erittäin harvinaisesta mahdollisuudesta, että asiakkaat ovat päättäneet tehdä tämän.

Vaihtoehtoinen menetelmä

Jos olet muokannut työnkulun .xoml-tiedostoa manuaalisesti ja muuntanut sen muuksi merkkikoodauksi kuin UTF-8: ksi, sinun on muokattava tiedostoa uudelleen muuntaaksesi sen takaisin UTF-8:ksi. Varmista, että tiedoston XML-määritys määrittää koodauksen UTF-8:ksi, tallentaa tiedoston UTF-8-merkkikoodausmuotoon tekstieditorin avulla ja sitten määrittää sen uudelleen.

Seuraavaa PowerShell-komentosarjaa voidaan käyttää SharePoint-hallintaliittymässä sharepoint-sivustokokoelman työnkulun .xoml-tiedostojen skannaamiseen sen määrittämiseksi, vaikuttaako muutos niihin. IsGoodWorkflow tuloste on True työnkulun .xoml-tiedostoille, jotka käyttävät UTF-8-merkkikoodausta ja ovat yhteensopivia tämän muutoksen kanssa. IsGoodWorkflow tuloste on False työnkulun .xoml-tiedostoille, jotka eivät käytä UTF-8-merkkikoodausta ja joita on muokattava.

<#
.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

Muutoshistoria

Seuraavassa taulukossa on yhteenveto tämän ohjeaiheen tärkeimmistä muutoksista.

Päivän

Kuvaus

22. marraskuuta 2022

Lisäsin syy-osioon huomautuksen ja päivitit Vaihtoehtoinen menetelmä -osion PowerShell-komentosarjalla ja skannasit työnkulun .xoml-tiedostot.

Tarvitsetko lisäohjeita?

Haluatko lisää vaihtoehtoja?

Tutustu tilausetuihin, selaa harjoituskursseja, opi suojaamaan laitteesi ja paljon muuta.

Osallistumalla yhteisöihin voit kysyä kysymyksiä ja vastata niihin, antaa palautetta sekä kuulla lisää asiantuntijoilta, joilla on runsaasti tietoa.

Oliko näistä tiedoista hyötyä?

Kuinka tyytyväinen olet käännöksen laatuun?
Mikä vaikutti kokemukseesi?
Kun valitset Lähetä, palautettasi käytetään Microsoftin tuotteiden ja palveluiden parantamiseen. IT-järjestelmänvalvojasi voi kerätä nämä tiedot. Tietosuojatiedot.

Kiitos palautteesta!

×