Как запустить рабочий процесс Sharepoint из кода? - PullRequest
1 голос
/ 29 апреля 2010

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

Если я создаю новый элемент в этом списке через интерфейс Sharepoint, он отправляет электронное письмо.

У меня есть небольшое консольное приложение, предназначенное для установки элемента списка через API Sharepoint. Это выполняется как запланированное задание на ежедневной основе (цель списка - назначить кого-либо для ежедневного ротации) в середине ночи. Запланированное задание запускается с учетными данными администратора семейства сайтов для сайта.

Элемент списка добавлен, но рабочий процесс не запущен. В журнале я получаю следующее сообщение:

Declarative workflows cannot automatically start if the triggering action was performed by System Account. Canceling workflow auto-start.

Похоже, что элемент списка добавляется системной учетной записью, а не пользователем, который выполняет код. Что мне нужно сделать, чтобы мой код взаимодействовал с Sharepoint, используя тот же идентификатор, что и приложение?

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

Рассмотрите возможность явного олицетворения одного из ваших пользователей SharePoint (в данном случае администратора семейства сайтов). Я ответил на аналогичный вопрос здесь: Метод UpdateListItem и системная учетная запись

После того, как вы создали объект SPSite, используя контекст олицетворенного пользователя, все операции с этим объектом и его дочерними элементами будут выполняться от имени этого пользователя.

0 голосов
/ 25 июля 2011

Возможно, лучше настроить запуск второго рабочего процесса вручную, а затем запустить его программно (что может сделать ваша системная учетная запись):

Возможно, есть лучший способ сделать это, но у меня это сработало:

// Look through all potential workflows for the correct one:
foreach (Microsoft.SharePoint.Workflow.SPWorkflowAssociation flowAssoc in SPContext.Current.Web.Lists["YourListName"].WorkflowAssociations) {
    if (flowAssoc.Enabled && flowAssoc.AllowManual && (flowAssoc.Name.Trim() == workflowNameToLookFor.Trim())) {
        // Start the workflow on the current item:
        SPContext.Current.Site.WorkflowManager.StartWorkflow(SPContext.Current.Web.Lists["YourListName"].Items[itemIndex], flowAssoc, flowAssoc.AssociationData, true);
    }
}
...