Перегружая методы класса SPWorkflowEventReceiver, мы можем обрабатывать события, связанные с рабочими процессами, например, запуск и остановку РП. Единственный источник данных о РП, для которого произошло событие, это объект типа SPWorkflowEventProperties.
Кроме InstanceId и WebUrl никаких других данных, идентифицирующих РП, не предоставляется. Нормальные люди для получения экземпляра РП используют конструктор SPWorkflow(SPWeb, Guid).
Не заметив сначала этот конструктор, я решил лезть в БД содержимого для извлечения необходимой информации. Всё же забывать о БД не стоит, потому как она может пригодиться для получения, например, всех РП, запущенных на элементах узла: выбираем записи по ИД узла, группируем по ИД списка и элемента. Можно ещё и по статусу отфильтровать. Будет работать быстрее, чем обход всех списков и элементов.
Не заметив сначала этот конструктор, я решил лезть в БД содержимого для извлечения необходимой информации. Всё же забывать о БД не стоит, потому как она может пригодиться для получения, например, всех РП, запущенных на элементах узла: выбираем записи по ИД узла, группируем по ИД списка и элемента. Можно ещё и по статусу отфильтровать. Будет работать быстрее, чем обход всех списков и элементов.
using (var connection = new SqlConnection(web.Site.ContentDatabase.DatabaseConnectionString)) { string commandText = "select ListId, ItemId, Id from Workflow where WebId='" + web.ID + "'"; using (var command = new SqlCommand(commandText, connection)) { connection.Open(); using (var reader = command.ExecuteReader()) { if (reader.Read()) { Guid listId = (Guid)reader["ListId"]; int itemId = (int)reader["ItemId"]; Guid workflowId = (Guid)reader["Id"]; // группируем, как надо, и возвращаем результат } } } }