Wednesday, 16 April 2014

Stop all running workflow instances

Create a console app with following configuration:

App.Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="WebApplicationName" value="SharePoint - 80"/>
  </appSettings>
</configuration>


Program.cs
using System;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;
using System.Configuration;

namespace RemoveAllRunningWorkflows
{
    class Program
    {
        static void Main(string[] args)
        {           
            string WebApp = ConfigurationSettings.AppSettings["WebApplicationName"];

            SPServiceCollection services = SPFarm.Local.Services;

            foreach (SPService curService in services)
            {
                if (curService is SPWebService)
                {
                    SPWebService webService = (SPWebService)curService;
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        foreach (SPWebApplication webApp in webService.WebApplications)
                        {
                            if (string.Equals(webApp.Name, WebApp, StringComparison.OrdinalIgnoreCase))
                            {
                                SPSiteCollection sites = webApp.Sites;
                                foreach (SPSite site in sites)
                                {
                                    foreach (SPWeb oWeb in site.AllWebs)
                                    {
                                        if (site.Url.ToString().ToLower().Contains("/personal/") || site.Url.ToString().ToLower().Contains("/sites/help") || oWeb.WebTemplate.ToString().Equals("SPSMSITEHOST") || oWeb.WebTemplate.ToString().Equals("CENTRALADMIN"))
                                        {
                                            //Skip
                                        }
                                        else
                                        {                                          
                                            int intC = oWeb.Lists.Count;
                                           
                                            for (int i = intC - 1; i >= 0; i--)
                                            {
                                                SPList list = oWeb.Lists[i];

                                                if (list.BaseTemplate.Equals(SPListTemplateType.Announcements) || list.BaseTemplate.Equals(SPListTemplateType.DocumentLibrary) || list.BaseTemplate.Equals(SPListTemplateType.GenericList))
                                                {
                                                    foreach (SPListItem oItem in list.Items)
                                                    {
                                                        SPWorkflowCollection itemWorkflowCollection = oItem.Workflows;
                                                        foreach (SPWorkflow itemWorkflow in itemWorkflowCollection)
                                                        {
                                                            if (!itemWorkflow.IsCompleted && itemWorkflow.InternalState == SPWorkflowState.Running)
                                                            {
                                                                foreach (SPWorkflowTask taskWorkflow in itemWorkflow.Tasks)
                                                                {
                                                                    if (taskWorkflow["PercentComplete"].ToString() != "1")
                                                                    {
                                                                        taskWorkflow["Status"] = "Canceled";
                                                                        taskWorkflow["PercentComplete"] = 1;

                                                                        oWeb.AllowUnsafeUpdates = true;

                                                                        taskWorkflow.Update();
                                                                        oWeb.AllowUnsafeUpdates = false;

                                                                    }
                                                                }
                                                                Console.WriteLine("Workflow Cancelled -->  WebURL: " + oWeb.Url + "  List: " + list.Title + "  ItemID: " + oItem.ID + "  ItemTitle: " + oItem.Title);
                                                                SPWorkflowManager.CancelWorkflow(itemWorkflow);
                                                            }

                                                        }
                                                    }
                                                    //list.Update();
                                                }
                                            }

                                            oWeb.Dispose();
                                        }
                                    }
                                    site.Dispose();
                                }
                            }
                        }
                    });
                }
            }
           
            Console.WriteLine("------------------ Exceution Finished: Press key to escape ------------------");
            Console.ReadKey();
        }
    }
}

No comments:

Post a Comment