通过工作流管理器将 SharePoint 2013 升级到 SharePoint 2016

原始 KB 数:   4073758

摘要

将 Microsoft SharePoint 2013 升级到 Microsoft SharePoint 2016 时,无需创建新的工作流管理器安装。 您可以使用 SharePoint 2013 场在新的 SharePoint 2016 场中使用的相同安装。

但是,在某些情况下,您可能需要创建新的工作流管理器安装。 例如,如果要将工作流管理器移动到不同的 Windows 操作系统,或者后端数据库服务器已停止使用。 在这些情况下,按照 工作流管理器灾难恢复 中的步骤操作,以使用旧数据库创建新的工作流管理器安装。 请确保使用工作流管理器数据库的最新副本。

背景

当您将 SharePoint Server 与工作流管理器一起使用时,工作流管理器将保留包含已发布工作流的 SharePoint 网站的记录。 每个站点在工作流管理器中表示为一个 作用域。 工作流管理器还存储工作流定义、所有工作流实例及其状态。

SharePoint 存储 SharePoint 工作流的工作流历史记录和工作流任务信息。 加载 "工作流状态" 页面时,SharePoint 会先调用工作流管理器,以查看工作流是否存在。 为此,它使用工作流实例 ID。 然后,SharePoint 将加载其余的工作流信息。 如果工作流管理器中缺少工作流实例 ID,或者在与工作流管理器通信期间发生错误,则会收到一条错误消息。

通过工作流管理器将 SharePoint 2013 升级到 SharePoint 2016

先决条件

  • 使用 Web 平台安装程序 (Web PI) 安装工作流管理器的最新累积更新。
  • 在 SharePoint 2013 服务器上安装工作流管理器客户端的最新版本,并确保所有工作流都正常运行。
  • 安装 SharePoint 2016 服务器场,并升级所有服务应用程序和内容数据库。
  • 在所有 SharePoint 2016 场服务器上,使用 Web PI 安装工作流管理器客户端的最新版本。

将工作流管理器注册到 SharePoint 2016

为此,请按照下列步骤操作:

  1. 在 SharePoint 2013 服务器场中,转到 "管理中心 > 应用程序管理 > " "管理服务应用程序",然后删除 "工作流服务应用程序代理"。

  2. 在 SharePoint 2016 服务器场中,运行以下 PowerShell cmdlet 以将 SharePoint 2016 与相同的工作流管理器安装结合使用:

    Register-SPWorkflowService -SPSite <SharePoint site URL> -WorkflowHostUri <Workflow service endpoint URL> -force
    

备注

请注意,已在新的 SharePoint 2016 服务器场中升级的内容数据库应已从最新备份中还原。 这有助于防止工作流管理器与内容数据库之间的差异和差距。

升级后可能会遇到的常见问题

问题1:网站 URL 已更改

如果网站 URL 在 SharePoint 2016 中发生更改,但网站 ID 保持不变,则必须使用 SharePoint Designer 从受影响的网站重新发布工作流。

问题2:工作流不能在某些网站上启动

如果工作流不在某些网站上启动,请从受影响的网站重新发布工作流。 或者,运行 " 刷新受信任的安全令牌服务元数据源 计时器作业"。

问题3:工作流失败,并返回 "无法获取应用程序主体权限信息" 错误

症状

请考虑以下情况:

  • 您的服务器场中配置了 SharePoint 2013 工作流和工作流管理器。
  • 你最近在服务器场中将网站连接到以前的工作流管理器的现有实例。

在这种情况下,在您连接到工作流管理器安装之后创建的工作流将成功完成。 但是,在连接到工作流管理器之前创建的工作流不会完成。 相反,它们会在尝试完成或保持挂起状态时被卡住。 对于仍处于挂起状态的工作流,您将收到 HTTP 500 错误。 此外,在 ULS 日志中记录以下条目:

无法获取应用程序主体权限信息。

原因

工作流管理器已具有运行工作流的网站的范围。 由于作用域 SPAuthenticationRealm 在作用域的字段中的值不正确,因此在 ApplicationID SPAppPrincipal 与作用域的值匹配的 SPWeb 对象上不存在任何类 ApplicationID 。 因此,工作流将失败并返回一条错误消息。

解决方案

若要解决此问题,请使用以下 PowerShell 命令注册新 SPAppPrincipal 对象。 对 SPWeb 其 ID 与 ApplicationID SPWeb 工作流管理器中的对象范围内存储的值相匹配的对象执行此操作。

#Variables
$webUrl = "http://sp.contoso.com/sites/teamsite/teamweb"
$oldAuthRealm = "58a2b173-0f88-4bff-935b-bf3778cd0524" #authentication realm expected by Workflow Manager
$newAuthRealm = "48834d17-d729-471e-b0d0-a0ec83b49de0" #authentication realm of current farm

#Get the SPWeb and SPSite objects, and the id of the web
$web = Get-SPWeb $webUrl
$site = $web.site
$clientId = $web.Id

#Create the old and new app principal ids
$oldAppId = "$clientId@$oldAuthRealm"
$newAppId = "$clientId@$newAuthRealm"

#Register the app principal with the old authentication realm
Register-SPAppPrincipal -DisplayName "Old Workflow" -Site $web -NameIdentifier $oldAppId

#Set permissions for the app principal
$oldAppPrincipal = Get-SPAppPrincipal -Site $web -NameIdentifier $oldAppId
Set-SPAppPrincipalPermission -Site $web -AppPrincipal $oldAppPrincipal -Scope SiteCollection -Right FullControl
Set-SPAppPrincipalPermission -Site $web -AppPrincipal $oldAppPrincipal -Scope Site -Right FullControl

#List the app principals with the old and new authentication realms in the ids
Get-SPAppPrincipal -Site $web -NameIdentifier $oldAppId | fl
Get-SPAppPrincipal -Site $web -NameIdentifier $newAppId | fl

详细信息

若要获取 SPAuthenticationRealm ApplicationID 范围中存储的值,请按照以下步骤操作:

  1. 运行以下 SQL 查询:

    SELECT *
    FROM [WFResourceManagementDB].[dbo].[Scopes] WITH (NOLOCK)
    WHERE Description like '%<WebID>%'
    

    备注

    <WebID> 是对象 ID 的占位符 SPWeb

  2. 在查询结果中,单击 "" 列中的值, SecuritySettings 以在 SQL Server Management Studio 中的单独选项卡上打开 XML。

  3. 在 XML 文件中,找到 ApplicationID 包含值的元素。 例如,找到以下元素:

    <ApplicationId>SPWeb_object_ID@SPAuthenticationRealm</ApplicationId>

    备注

    出现在 @ 符号 ( @ ) 前面的 GUID 是对象的 ID SPWeb ,在 at 符号处显示的 guid 是 SPAuthenticationRealm 值。

或者,可以 SPAuthenticationRealm 在 ULS 日志中查找值,如以下示例日志条目:

日期/时间 w3wp.exe (SPWFE01: 0x51FC) 0x1298 SharePoint Foundation 身份验证授权 an3eg 中无法获取应用程序主体权限信息。 AppId = i:0i.t | sp-1 |<SPWeb object ID>@<SPAuthenticationRealm>

日期/时间 w3wp.exe (SPWFE01: 0x51FC) 0x1298 SharePoint Foundation 常规8nca 中型应用程序错误当 access/site/teamsite/teamweb/_vti_bin/client.svc 时,错误 = 未将对象引用设置到对象的实例。 在 SPServiceContext HttpContext 上下文) serviceContext ThrowIfAppNotExits Microsoft.SharePoint.ApplicationRuntime.SPRequestModule.IniHttpContext context (EnsureTenantPermissions allowFullReset HttpContext context) (,Boolean tCurrent,Boolean TCurrentAppPrincipalToken) (Microsoft.SharePoint.SPAppRequestContext.Iniat ApplicationRuntime SPRequestModule PostAuthenticateRequestHandler Object oSender,EventArgs ea () System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Exe# A9 ( cuteStep System.Web.HttpApplication.ExeIExecutionStep 步骤,Boolean (completedSynchronously&