Finding a workflow using an activity


Had an issue come up where we wanted to find all the workflows in a SharePoint 2007 environment that were using a certain workflow activity.  Each list has a workflow association collection that tells you the workflows that are configured for the list.  From the workflow association, we were able to find that each workflow association has a BaseTemplate object that points to the assembly and class name for the workflow.  With that information, we were able to use reflection to get the ActivityCollection

Here’s an example of what that code looks like.  This finds both SharePoint Designer and Visual Studio based workflows (also includes the OOB workflows).  The output is comma-delimited, showing the following data :

URL of the web, List Title, Workflow Association Name, type of Workflow Activity.

Once you get the output, you can open the comma-delimited file in Excel, and filter out whatever data you want.  For example, you could filter out the workflows on a particular web.  You could also find any workflow association that uses a CodeActivity.

   1: //Prior to this, you loop through the SPLists in each SPWeb you care about
   2: foreach (SPWorkflowAssociation wa in list.WorkflowAssociations)
   3: {
   4:     //Grab the XML from the BaseTemplate of the workflow association
   5:     XmlDocument templateXML = new XmlDocument();
   6:     templateXML.LoadXml(wa.BaseTemplate.Xml);
   7:  
   8:     //Grab the name of the assembly and the class that the workflow association is pointing to
   9:     string assemblyName = templateXML.GetElementsByTagName("WorkflowTemplateIdSet")[0].Attributes["CodeBesideAssm"].Value;
  10:     string className = templateXML.GetElementsByTagName("WorkflowTemplateIdSet")[0].Attributes["CodeBesideClass"].Value;
  11:  
  12:     //Load the assembly
  13:     Assembly assm = Assembly.Load(assemblyName);
  14:  
  15:     //Loop through the modules in the assembly
  16:     foreach (Module mod in assm.GetLoadedModules())
  17:     {
  18:         //Loop through the types in the module
  19:         foreach (Type type in mod.GetTypes())
  20:         {
  21:             //Grab the Properties out of the type
  22:             object objs = null;
  23:             objs = type.InvokeMember("Properties", BindingFlags.CreateInstance, null, null, null);
  24:             
  25:             try
  26:             {
  27:                 //Cast the object as a WorkflowActivity, grab the Activities collection
  28:                 ActivityCollection activities = ((System.Workflow.Activities.SequentialWorkflowActivity)objs).Activities;
  29:  
  30:                 //Loop through the activities and write them out
  31:                 foreach (Activity act in activities)
  32:                 {
  33:                     Console.WriteLine(web.Url + ", " + list.Title + " , " + wa.Name + ", " + act.GetType().ToString());
  34:                 }
  35:             }
  36:             catch { continue; }
  37:  
  38:         }    //end foreach on objects
  39:  
  40:     }    //end foreach modules
  41:  
  42: }  //end Workflow Association Loop
Comments (2)
  1. this code is very good – nice work

  2. Suki says:

    Thank this code is very good

    you view website: http://www.dacsanngon.co Thanks!

Comments are closed.

Skip to main content