2017-03-06 6 views
0

Derzeit folgenden C# -Code ist mit einem Workflow startenden Workflow, indem Sie Benutzerkonto

private static void StartWorkflow(SPListItem listItem) 
     { 
      SPSecurity.RunWithElevatedPrivileges(delegate() 
      { 
       using (SPSite elevatedSite = new SPSite(listItem.Web.Site.ID)) 
       { 
        using (SPWeb elevatedWeb = elevatedSite.OpenWeb(listItem.Web.ID)) 
        { 
         elevatedWeb.AllowUnsafeUpdates = true; 
         SPWorkflowManager manager = elevatedSite.WorkflowManager; 
         SPListItem elevatedListItem = elevatedWeb.Lists.TryGetList(listItem.ParentList.Title).GetItemById(listItem.ID); 
         foreach (SPWorkflow workflow in manager.GetItemWorkflows(elevatedListItem)) 
         { 
          SPWorkflowAssociation wfAssoc = elevatedListItem.ParentList.WorkflowAssociations.GetAssociationByName(workflow.ParentAssociation.Name, System.Globalization.CultureInfo.CurrentCulture); 
          elevatedListItem.Web.Site.WorkflowManager.StartWorkflow(elevatedListItem, wfAssoc, wfAssoc.AssociationData, true); 
          elevatedListItem.Update(); 
         } 

         // Get the workflow by name that's associated with the list item 
         elevatedWeb.AllowUnsafeUpdates = false; 
        } 
       } 
      }); 
     } 

Dies wird die Workflow-System-Konto starten. Gibt es eine Möglichkeit, dass ich den Workflow starten kann, indem ich Listenelemente verwende, die nach Spalte erstellt wurden? Ich möchte den Workflow mit einem persönlichen Benutzerkonto starten.

Antwort

0

Nach einigen RND habe ich die Lösung für die Frage. Wir müssen das Benutzer-Token an das Web-Objekt übergeben. Hier ist meine Antwort

private void StartWorkflow(SPListItem item, string wfName, SPUserToken userToken) 
     { 
      using (SPSite elevatedSite = new SPSite(item.Web.Site.ID, userToken)) 
      { 
       using (SPWeb elevatedWeb = elevatedSite.OpenWeb()) 
       { 
        SPList parentList = elevatedWeb.Lists.TryGetList(item.ParentList.ToString()); 
        SPWorkflowAssociationCollection associationCollection = parentList.WorkflowAssociations; 
        foreach (SPWorkflowAssociation association in associationCollection) 
        { 
         if (association.Name == wfName) 
         { 
          elevatedSite.WorkflowManager.StartWorkflow(item, association, association.AssociationData); 
          break; 
         } 
        } 
       } 
      } 
     } 
Verwandte Themen