6

В редакторе рабочих процессов дизайнера Sharepoint я хочу получить имя пользователя/имя инициатора рабочего процесса (то есть кто его выключил или инициировал рабочий процесс) - это относительно легко сделать с использованием сторонних продуктов, таких как Nintex Workflow 2007 (где I будет использовать что-то вроде {Common: инициатора}) - но я не могу найти какой-либо выход из коробки, чтобы сделать это, используя конструктор точки доли и MOSS 2007.В редакторе рабочего процесса конструктора sharepoint, как получить имя пользователя инициатора рабочего процесса?

Update

Это не похоже, эта довольно очевидная функция поддерживается OOTB, поэтому я закончил писать пользовательскую деятельность (как было предложено одним из ответов). Я перечислил код мероприятия здесь для справки, хотя я подозреваю, что есть, вероятно, несколько экземпляров этого плавающих вокруг там на блогах, как это довольно тривиальное решение:

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

А затем подключить его с помощью следующей .action xml file:

<?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> 

ответ

2

Я не думаю, что это можно сделать в SharePoint Designer из коробки. Возможно, вы могли написать собственное действие, чтобы получить создателя, но я не думаю, что он открыт через интерфейс рабочего процесса SPD.

Лучшее, что вы могли бы сделать, это получить пользователя, который создал или изменил элемент в списке, но это не будет обрабатывать случаи, когда рабочий процесс запускается вручную.

+0

теперь поддерживается в SharePoint 2010 OOTB - см. Мой ответ ниже – Bkwdesign 2013-09-19 03:24:38

1

Я могу подумать о простом, но не очень сложном решении для этого, используя только SPD. На этапах рабочего процесса создайте тестовый элемент во вторичном списке (вероятно, список задач, в котором хранятся свойства workflowId и itemId для возврата назад), а затем выполните поиск в рабочем процессе в этом списке, чтобы узнать, кто является создателем этого элемента, что значение будет текущим инициатором рабочего процесса.

4

Для тех, кто google в этой статье и использует SharePoint 2010, переменная инициатора рабочего процесса теперь поддерживается OOTB в SharePoint Designer.

Источником данных будет «Контекст рабочего процесса», и поле, конечно, «Инициатор», и вы можете выбрать его как «Отображаемое имя», «Электронная почта», «Имя входа» или «Идентификатор пользователя» Номер "

0

Решение для настраиваемой деятельности работает только в том случае, если вы работаете с мохом, если у вас есть только wss 3.0, вы можете добавить еще один шаг в свой рабочий процесс и задать настраиваемое поле комментариев с любой информацией, это сделает последнее измененное лицо чтобы изменить и стать таким же, как инициатор рабочего процесса, тогда вы можете использовать поле ModifiedBy, чтобы принять любое решение, которое вам нужно.

Смежные вопросы