En el editor de flujo de trabajo del diseñador sharepoint, ¿cómo obtengo el nombre de usuario de iniciadores de flujo de trabajo?

StackOverflow https://stackoverflow.com/questions/131238

Pregunta

En el editor de flujo de trabajo del diseñador de Sharepoint, deseo recuperar el nombre de usuario / nombre del iniciador del flujo de trabajo (es decir, quién lo inició o activó el flujo de trabajo); esto es relativamente fácil de hacer con productos de terceros como Nintex Workflow 2007 (donde Usaría algo como {Común: Iniciador}), pero parece que no puedo encontrar ninguna manera de hacerlo usando el diseñador de puntos compartidos y MOSS 2007.

Update

No parece que esta característica bastante obvia sea compatible con OOTB, así que terminé escribiendo una actividad personalizada (como lo sugiere una de las respuestas). He enumerado el código de actividades aquí como referencia, aunque sospecho que probablemente haya algunas instancias de esto flotando en los blogs, ya que es una solución bastante trivial:

public partial class LookupInitiatorInfo : Activity
{
    public static DependencyProperty __ActivationPropertiesProperty =
        DependencyProperty.Register("__ActivationProperties",
        typeof(Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties),
        typeof(LookupInitiatorInfo));

    public static DependencyProperty __ContextProperty =
        DependencyProperty.Register("__Context", typeof (WorkflowContext),
        typeof (LookupInitiatorInfo));

    public static DependencyProperty PropertyValueVariableProperty =
        DependencyProperty.Register("PropertyValueVariable", typeof (string),    
        typeof(LookupInitiatorInfo));

    public static DependencyProperty UserPropertyProperty = 
        DependencyProperty.Register("UserProperty", typeof (string),
        typeof (LookupInitiatorInfo));

    public LookupInitiatorInfo()
    {
        InitializeComponent();
    }

    [Description("ActivationProperties")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties
    {
        get { return ((Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)(base.GetValue(__ActivationPropertiesProperty))); }
        set { base.SetValue(__ActivationPropertiesProperty, value); }
    }

    [Description("Context")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public WorkflowContext __Context
    {
        get { return ((WorkflowContext)(base.GetValue(__ContextProperty))); }
        set { base.SetValue(__ContextProperty, value); }
    }

    [Description("UserProperty")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public string UserProperty
    {
        get { return ((string) (base.GetValue(UserPropertyProperty))); }
        set { base.SetValue(UserPropertyProperty, value); }
    }

    [Description("PropertyValueVariable")]
    [ValidationOption(ValidationOption.Required)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public string PropertyValueVariable
    {
        get { return ((string) (base.GetValue(PropertyValueVariableProperty))); }
        set { base.SetValue(PropertyValueVariableProperty, value); }
    }

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
    {
        // value values for the UserProperty (in most cases you
        // would use LoginName or Name)

        //Sid
        //ID
        //LoginName
        //Name
        //IsDomainGroup
        //Email
        //RawSid
        //Notes

        try
        {
            string err = string.Empty;

            if (__ActivationProperties == null)
            {
                err = "__ActivationProperties was null";
            }
            else
            {
                SPUser user = __ActivationProperties.OriginatorUser;

                if (user != null && UserProperty != null)
                {
                    PropertyInfo property = typeof (SPUser).GetProperty(UserProperty);
                    if (property != null)
                    {
                        object value = property.GetValue(user, null);
                        PropertyValueVariable = (value != null) ? value.ToString() : "";
                    }
                    else
                    {
                        err = string.Format("no property found with the name \"{0}\"", UserProperty);
                    }
                }
                else
                {
                    err = "__ActivationProperties.OriginatorUser was null";
                }
            }
            if (!string.IsNullOrEmpty(err))
                Common.LogExceptionToWorkflowHistory(new ArgumentOutOfRangeException(err), executionContext,
                                                     WorkflowInstanceId);
        }
        catch (Exception e)
        {
            Common.LogExceptionToWorkflowHistory(e, executionContext, WorkflowInstanceId);
        }

        return ActivityExecutionStatus.Closed;
    }
}

Y luego conéctelo con el siguiente archivo .action xml:

<?xml version="1.0" encoding="utf-8"?>
<WorkflowInfo Language="en-us">
<Actions>
    <Action Name="Lookup initiator user property"
 ClassName="XXX.ActivityLibrary.LookupInitiatorInfo"
 Assembly="XXX.ActivityLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXX"
 AppliesTo="all"
 Category="WormaldWorkflow Custom Actions">
        <RuleDesigner Sentence="Lookup initating users property named %1 and store in %2">
            <FieldBind Field="UserProperty" DesignerType="TextArea" Id="1" Text="LoginName" />              
            <FieldBind Field="PropertyValueVariable" DesignerType="ParameterNames" Text="variable" Id="2"/>
        </RuleDesigner>
        <Parameters>
            <Parameter Name="__Context" Type="Microsoft.Sharepoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In"/>
            <Parameter Name="__ActivationProperties" Type="Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties, Microsoft.SharePoint" Direction="In"/>
            <Parameter Name="UserProperty" Type="System.String, mscorlib" Direction="In" />
            <Parameter Name="PropertyValueVariable" Type="System.String, mscorlib" Direction="Out" />
        </Parameters>
    </Action>
</Actions>
</WorkflowInfo>
¿Fue útil?

Solución

No creo que esto sea posible hacerlo en SharePoint Designer fuera de la caja. Probablemente podría escribir una acción personalizada para obtener el originador, pero no creo que esté expuesto a través de la interfaz de flujo de trabajo SPD.

Lo mejor que probablemente podría hacer es obtener el usuario que creó o modificó el elemento en la lista, pero esto no manejaría los casos en los que el flujo de trabajo se ejecutó manualmente.

Otros consejos

Para aquellos que usan Google en este artículo y ahora usan SharePoint 2010, la variable de iniciador de flujo de trabajo ahora es compatible con OOTB en SharePoint Designer.

La fuente de datos sería " Contexto del flujo de trabajo " y el campo es, por supuesto, "iniciador" y puede elegir devolverlo como " Nombre para mostrar " ;, " Correo electrónico " ;, " Nombre de inicio de sesión " o el " Número de ID de usuario "

Puedo pensar en una solución simple pero no muy sofisticada para esta usando solo SPD. Solo en los pasos del flujo de trabajo, cree un elemento de prueba en una lista secundaria (probablemente una lista de tareas que almacena las propiedades de workflowId y itemId para referencia) y luego realice una búsqueda en su flujo de trabajo en esa lista para ver quién es el creador de ese elemento. el valor sería el iniciador de flujo de trabajo actual.

La solución de actividad personalizada solo funciona si está trabajando con musgo, si solo tiene wss 3.0 puede poner un paso más en su flujo de trabajo y establecer un campo de comentario personalizado con cualquier información, esto hace que la última persona modificada cambie y se convierte en el mismo que el iniciador de flujo de trabajo, luego puede usar el campo ModifiedBy para tomar cualquier decisión que necesite.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top