2012-07-12 10 views
12

Tenemos configurado YAWF (otro marco de flujo de trabajo) para uno de nuestros clientes. Tenemos un proceso simple de Workflow, que funciona exactamente como lo requerimos, a excepción del historial de versiones del componente.Flujo de trabajo de Tridion: historial de versiones del componente incorrecto

En el historial de versiones, en lugar del nombre del usuario que ha creado o actualizado el componente, solo vemos "Autor de Tridion Content Manager System NT".

Sospecho que esta es la cuenta de usuario de MTS que se utiliza para ejecutar YAWF. Sin embargo, realmente necesitamos que el nombre del usuario aparezca en el historial de la versión.

Tal vez hemos configurado YAWF incorrectamente?

¿Alguien más ha tenido este problema, o tiene alguna idea de cómo podemos resolverlo?

Estamos utilizando Tridion 2011. (No se ha SP1)

Respuesta

4

¿Sería la cuenta que ejecuta el último paso en el flujo de trabajo?

Parece bastante convencido de que es el YAWF, ¿lo ha intentado sin él?

+0

¿Podría ser que el último tipo en su flujo de trabajo es la actividad automática? –

+0

@Igor Exactamente, las actividades automáticas normalmente las realiza el sistema local, eso sin duda explicaría al autor. – Quirijn

+0

La última actividad en mi flujo de trabajo es automática. Eso significa que cada componente que pasa por el flujo de trabajo no tiene un historial de versiones preciso. ¿Hay alguna forma de hacer que el autor del componente aparezca en el historial de la versión cuando se usa un proceso de flujo de trabajo como este? –

3

En general podría ser que hay diferentes personas que trabajan en una versión, ya que el registro de entrada se produce sólo después de que todas las actividades están terminadas.

se puede trabajar su camino alrededor de este problema mediante la iteración a través de los artistas de actividad, e incluir un comentario en el mensaje de finalización.

Otra opción podría ser la de hacerse pasar por el autor:

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

' use TDSE 

Set oTDSE = Nothing 
0

Comprendo que esto es una vieja pregunta, pero recientemente he luchado con este mismo tema desde una perspectiva Servicio básico y quería compartir la ruta Tomé (y posiblemente alguien me indique dónde podría haber ido mal antes de implementarlo en la producción).

Después de intentar algunos enfoques diferentes con Core Service, decidí agregar una actividad manual final a mis flujos de trabajo y lógica personalizada a la actividad automática anterior. En la lógica del servicio principal de la actividad automática, termino la actividad automática actual (que devuelve la instancia de actividad manual final), represento al autor original, comienzo la instancia de actividad final (como autor) y termino esa instancia de actividad final (nuevamente, como autor).

Estoy utilizando el SessionAwareCoreServiceClient y ejecutándose en el mismo gestor de contenido. He tenido que añadir "NT AUTHORITY \ SYSTEM" para los usuarios de suplantación en la utilidad de configuración de Content Manager Tridion (que podría haber implicaciones de seguridad utilizando Impersonate, así que asegúrese de que tiene sentido para su entorno):

Impersonation Users

el código se ve algo como esto (aunque he dejado fuera algunas cosas como conseguir la instancia de actividad actual, recuperando el autor original de la primera actividad manual y he añadido el uso de SessionAwareCoreServiceClient para dar un poco de contexto):

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

Espero no estar haciendo nada terriblemente estúpido y, posiblemente, esta respuesta ayudará a alguien como yo que tuvo que improvisar de varias otras preguntas/blogs/referencias y realizar un poco de ensayo y error (que puede ser tedioso con el flujo de trabajo).

0

Eso es el comportamiento esperado. Si la última actividad del flujo de trabajo es Automático. Siempre se realiza por Tridion Content Manager System NT Autor. El usuario con el agente de servicio de flujo de trabajo se está ejecutando. Como solución alternativa, puede usar la solución J stuarts. Hice uno similar también.

Se agregó otra actividad atlast como automático. Y realizó esta actividad con el usuario que creó el contenido originalmente. De esta forma, el contenido se registra con los detalles del autor. Sin embargo, para hacerse pasar por el flujo de trabajo, asegúrese de que su máquina Tridion tenga el usuario de suplantación NT AUTHORITY \ SYSTEM con el tipo de usuario 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(); 
      } 
Cuestiones relacionadas