12

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

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

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

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

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

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

4

4 回答 4

4

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

你似乎很确信它是 YAWF,你试过没有它吗?

于 2012-07-12T14:10:13.120 回答
3

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

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

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

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

' use TDSE 

Set oTDSE = Nothing
于 2012-07-21T13:34:22.370 回答
0

Thats expected behavior. If workflow's last activity is Automatic. It is always performed by Tridion Content Manager System NT Author.The user with which workflow service agent is running. As a work-around you can use J stuarts solution. I did similar one too.

Added another activity atlast as automatic. And performed this activity with the user who created the content originally. That way content is checked in with author details. However, to impersonate in workflow make sure your Tridion machine has impersonation user NT AUTHORITY\SYSTEM with user type 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();
            }
于 2013-06-19T19:40:00.550 回答
0

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

在使用 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);
}

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

于 2013-06-05T05:56:39.783 回答