【问题标题】:Tridion Workflow - Component version history incorrectTridion 工作流程 - 组件版本历史不正确
【发布时间】:2012-07-12 05:50:34
【问题描述】:

我们为我们的一位客户设置了 YAWF(Yet Another Workflow Framework)。我们有一个简单的 Workflow 流程,它完全按照我们的要求工作,除了组件版本历史。

在版本历史中,我们只看到“Tridion Content Manager System NT Author”,而不是创建或更新组件的用户名。

我怀疑这是用于执行 YAWF 的 MTS 用户帐户。但是我们确实需要用户名出现在版本历史记录中。

也许我们错误地配置了 YAWF?

有没有其他人遇到过这个问题,或者知道我们如何解决它?

我们正在使用 Tridion 2011。(还没有 SP1)

【问题讨论】:

    标签: tridion


    【解决方案1】:

    这是预期的行为。如果工作流的最后一个活动是自动的。它总是由Tridion Content Manager System NT Author执行。工作流服务代理运行的用户。作为一种解决方法,您可以使用 J stuarts 解决方案。我也做过类似的。

    添加了另一个活动 atlast 作为自动。并与最初创建内容的用户一起执行此活动。这样,内容就会与作者详细信息一起签入。 但是,要在工作流程中进行模拟,请确保您的 Tridion 机器具有模拟用户 NT AUTHORITY\SYSTEM,用户类型为 Windows。

    public void UpdateVersion(string workitemid,string componentid)
        {
            try
            {
                Stopwatch _watch = new Stopwatch();
                _watch.Start();
                Logger.Debug("Entered RPPTridionWorkflow UpdateVersion ");
                WorkItemData workItem = (WorkItemData)CoreServiceClient.Read(workitemid, options);
                ProcessInstanceData processInstance =
                    (ProcessInstanceData)CoreServiceClient.Read(workItem.Process.IdRef, options);
                ActivityData creatorActivityData = getActivityDataBasedOnName(workitemid, "Content Creation");
                if (creatorActivityData != null)
                {
                    LinkToUserData linktoAuthorUser = creatorActivityData.Owner;
                    UserData authorUser = (UserData)CoreServiceClient.Read(linktoAuthorUser.IdRef, options);
                    CoreServiceClient.Impersonate(authorUser.Title);
                }
                ActivityData[] ieActivities = processInstance.Activities;
                int currentActivity = ieActivities.Length - 1;
                if (ieActivities != null)
                {
                    ActivityInstanceData activityInstance =
                       (ActivityInstanceData)CoreServiceClient.Read(processInstance.Activities[currentActivity].Id, options);
    
                    ActivityFinishData finishData = new ActivityFinishData();
                    finishData.Message = "Finished automatically and upded version info for component checked in";
                    CoreServiceClient.FinishActivity(activityInstance.Id, finishData, options);
                    CoreServiceClient.Close();
                }
    

    【讨论】:

      【解决方案2】:

      我意识到这是一个老问题,但我最近从核心服务的角度与同样的问题作斗争,并想分享我采取的路线(可能有人会在我将它部署到之前指出我可能出错的地方生产)。

      在使用 Core Service 尝试了几种不同的方法后,我决定将最终手动活动添加到我的工作流中,并将自定义逻辑添加到前面的自动活动中。在自动活动的核心服务逻辑中,我完成当前的自动活动(返回最终的手动活动实例),模拟原始作者,启动最终的活动实例(作为作者)并完成最终的活动实例(再次,作为作者)。

      我正在使用 SessionAwareCoreServiceClient 并在 Content Manager 机器本身上运行。我必须在 Tridion Content Manager 配置实用程序的 Impersonation Users 中添加“NT AUTHORITY\SYSTEM”(使用 Impersonate 可能存在安全隐患,因此请确保它对您的环境有意义):

      代码看起来像这样(虽然我省略了一些东西,比如获取当前活动实例,从第一个手动活动中检索原始作者,并且我添加了 using SessionAwareCoreServiceClient 以提供一些上下文):

      using (SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient())
      {
          ActivityFinishData activityFinish = new ActivityFinishData()
          {
              Message = message,
              NextAssignee = new LinkToTrusteeData() { IdRef = authorUser.IdRef }
          };
      
          // Finish current automatic activity
          ActivityInstanceData finalActivity = client.FinishActivity(activityInstance.Id, activityFinish, new ReadOptions());
      
          // Impersonate original author
          client.Impersonate(authorUser.Title);
      
          // Start final (manual) activity as author - if you don't start it, then non-Administrators can't finish them.
          client.StartActivity(finalActivity.Id, null);
          // Finish final (manual) activity as author
          client.FinishActivity(finalActivity.Id, activityFinish, null);
      }
      

      希望我没有做任何太愚蠢的事情,并且可能这个答案会帮助像我这样不得不从各种其他问题/博客/参考资料中拼凑起来并进行一些试验和错误的人(这可以得到繁琐的工作流程)。

      【讨论】:

        【解决方案3】:

        一般来说,可能有不同的人在开发一个版本,因为只有在所有活动完成后才会进行签入。

        您可以通过遍历活动执行者来解决此问题,并在完成消息中添加评论。

        另一种选择可能是冒充作者:

        Set oTDSE = CreateObject("TDS.TDSE") 
        oTDSE.Impersonate("[Author]") 
        oTDSE.Initialize() 
        
        ' use TDSE 
        
        Set oTDSE = Nothing
        

        【讨论】:

          【解决方案4】:

          那会是在您的工作流程中执行最后一步的帐户吗?

          您似乎很确信这是 YAWF,您是否尝试过不使用它?

          【讨论】:

          • 会不会是您工作流程中的最后一种类型是自动活动?
          • @Igor 没错,自动活动通常由本地系统执行,这肯定会解释作者。
          • 我工作流程中的最后一个活动是自动的。这意味着通过工作流的每个组件都没有准确的版本历史记录。使用这样的工作流程时,是否有办法让组件的作者出现在版本历史记录中?
          • 谢谢杰里米。只是想问一下 GUI 扩展有什么帮助?
          • 我没有玩过这个,但是我们可以在最终的活动中冒充用户,以便该用户执行“FinishActivity”指令吗?或者您可以添加一个由事件系统自动启动和完成的手动活动。
          猜你喜欢
          • 2014-11-06
          • 1970-01-01
          • 2023-02-01
          • 2013-07-26
          • 1970-01-01
          • 2012-05-19
          • 2021-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多