No editor de fluxo de trabalho do SharePoint Designer como faço para obter o nome de usuário iniciadores de fluxo de trabalho?

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

Pergunta

editor de fluxo de trabalho I do no SharePoint Designer deseja recuperar o nome de usuário / nome do iniciador de fluxo de trabalho (ou seja, que chutou para fora ou provocou o workflow) - este é relativamente fácil de fazer uso de produtos 3rd party, como Nintex Workflow 2007 (onde gostaria de usar algo como {comum: Iniciador}.) - mas eu não consigo encontrar alguma maneira fora da caixa para fazer isso usando o designer de ponto de compartilhamento e MOSS 2007

Atualizar

Ele não se parece com esse recurso bastante óbvio é suportado OOTB, então eu acabei escrevendo uma atividade personalizada (como sugerido por uma das respostas). Eu listei o código atividades aqui para referência embora eu suspeite que há provavelmente algumas instâncias deste flutuando por aí em blogs, como é uma solução 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;
    }
}

E, em seguida, conectar-se com o seguinte arquivo .ação 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>
Foi útil?

Solução

Eu não acho que isso é possível fazer no SharePoint Designer para fora da caixa. Você provavelmente poderia escrever uma ação personalizada para obter o criador, mas eu não acredito que ele é exposto através da interface de workflow SPD em tudo.

O melhor que você provavelmente poderia fazer é obter o usuário que criou ou modificou o item na lista, mas isso não iria lidar com casos em que o fluxo de trabalho foi executado manualmente.

Outras dicas

Para aqueles que OOTB google para este artigo e agora está usando SharePoint 2010, a variável de fluxo de trabalho iniciador é agora suportada no SharePoint Designer.

A fonte de dados seria "Contexto fluxo de trabalho" e no campo, é claro, "Iniciador" e você pode optar por devolvê-lo como o "Display Name", "E-mail", "Nome de login" ou o "User ID Number "

Eu posso pensar em uma simples, mas solução não muito sofisticado para um presente usando apenas SPD. Apenas em passos de fluxo de trabalho criar um item de teste em uma lista secundária (provavelmente uma lista de tarefas que armazena as propriedades workflowId e ItemId para refrence volta) e, em seguida, fazer uma pesquisa no seu fluxo de trabalho nessa lista para ver quem é o criador desse item, que valor seria o iniciador do fluxo de trabalho atual.

A solução atividade personalizada só funcionam se você estiver trabalhando com musgo, se você só tem WSS 3.0 você pode colocar mais um passo em seu fluxo de trabalho e definir um comentário personalizado campo com alguma informação, isso faz a última pessoa modificado para mudança e tornar-se o mesmo que o iniciador do fluxo de trabalho, então você pode usar o campo ModifiedBy para tomar qualquer decisão que você precisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top