2012-07-12 30 views
12

私たちはお客様のためにYAWF(Yet Another Workflow Framework)を設定しています。私たちは単純なワークフロープロセスを持っていますが、これはコンポーネントのバージョン履歴を除いて、私たちが必要とするように正確に動作します。Tridionワークフロー - コンポーネントのバージョン履歴が正しくありません

バージョン履歴では、コンポーネントを作成または更新したユーザーの名前ではなく、「Tridion Content Manager System NT Author」のみが表示されます。

これは、YAWFを実行するために使用されるMTSユーザーアカウントと思われます。しかし、実際にはバージョン履歴に表示するにはユーザー名が必要です。

YAWFが正しく設定されていない可能性がありますか?

他の誰かがこの問題を抱えているのですか、それともどのように解決できるか考えていますか?

私たちは、それはあなたのワークフローの最後のステップを実行するアカウントのだろうTridionの2011年(まだSP1)

答えて

4

を使用していますか?

あなたはそれがYAWFだと確信しているようですが、それを試してみましたか?

+0

ワークフローの最後のタイプは自動アクティビティですか? –

+0

@Igor正確には、自動アクティビティは通常、ローカルシステムによって実行されます。 – Quirijn

+0

私のワークフローの最後のアクティビティは自動的です。つまり、ワークフローを実行するすべてのコンポーネントには正確なバージョン履歴がありません。このようなワークフロープロセスを使用する場合、コンポーネントの作成者をバージョン履歴に表示させるにはどうしますか? –

3

通常、すべてのアクティビティが終了した後にのみチェックインが行われるため、1つのバージョンでさまざまな人が働いている可能性があります。

この問題を回避するには、アクティビティの実行者を繰り返して、終了メッセージにコメントを挿入します。

別のオプションは、著者を偽装することがあります

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

' use TDSE 

Set oTDSE = Nothing 
0

(私は、これは古い質問です実現が、私は最近、コアサービスの観点から、この同じ問題で戦ったし、私が撮ったルートを共有したいと思いましたおそらく誰かが、これを本番環境に導入する前に間違っていたかもしれないところを指摘するでしょう)。

Core Serviceでいくつかのアプローチを試した結果、前回の自動アクティビティに対するワークフローとカスタムロジックに最終的な手動アクティビティを追加することに決めました。自動アクティビティのコアサービスロジックでは、現在の自動アクティビティ(最終的な手動アクティビティインスタンスを返す)を終了し、元の著者を偽装し、最終アクティビティインスタンスを作成者として開始し、最終アクティビティインスタンスを終了します(著者)。

私はSessionAwareCoreServiceClientを使用しており、Content Managerマシン上で実行しています。

Impersonation Users

:私は(そこに偽装を使用して、セキュリティへの影響が考えられますので、確認してください、それはあなたの環境のために理にかなっている可能性が)TridionのContent Managerの設定ユーティリティで偽装ユーザーに「NT AUTHORITY \システム」を追加する必要がありました

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); 
} 

:(私は最初、マニュアル活動から元の著者を検索し、現在のアクティビティインスタンスを取得するようないくつかの物事を残してきたと私はいくつかのコンテキストを与えるために使用してSessionAwareCoreServiceClientを追加しましたが)のコードは次のようになりますうまくいけば私は何もしていないひどくばかげていて、おそらくこの答えは、他のさまざまな質問/ブログ/リファレンスからまとめて、試行錯誤(ワークフローで面倒なことがあります)を少し行わなければならなかったような人に役立ちます。

0

これは予想される動作です。ワークフローの最後のアクティビティが[自動]の場合。これは常にによって実行されます。Tridion Content ManagerシステムNT作成者。ワークフローサービスエージェントが実行されているユーザー。回避策として、J stuartsソリューションを使用することができます。私も似たようなことをしました。

別のアクティビティatlastを自動として追加しました。コンテンツを元々作成したユーザーがこのアクティビティを実行しました。そのようにして、コンテンツは著者の詳細でチェックインされます。 ただし、ワークフローで偽装するには、TridionマシンにユーザータイプWindowsの偽装ユーザーNT AUTHORITY \ SYSTEMが含まれていることを確認してください。

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(); 
      } 
関連する問題