Sharepoint 2013 从提供程序托管的加载项启动SharePoint 2010工作流

Sharepoint 2013 从提供程序托管的加载项启动SharePoint 2010工作流,sharepoint-2013,workflow,permission-denied,Sharepoint 2013,Workflow,Permission Denied,我到处都找遍了,但仍然无法解决我的问题。脚本: 我有一个列表,我将在其中创建必须匿名的项目。因此,我们使用提供商托管的SharePoint加载项来使用AppOnly权限创建列表项。创建列表项后,必须运行SharePoint 2010工作流。原因是它将通过电子邮件发送外部电子邮件地址。不幸的是,当加载项创建列表项时,因为它是由应用程序而不是用户创建的,所以工作流不会自动启动。所以我想,简单!我将只向加载项添加代码,一旦创建了项目,它就会触发工作流。 好吧,问题就从这里开始。当我尝试启动2010工作

我到处都找遍了,但仍然无法解决我的问题。脚本: 我有一个列表,我将在其中创建必须匿名的项目。因此,我们使用提供商托管的SharePoint加载项来使用AppOnly权限创建列表项。创建列表项后,必须运行SharePoint 2010工作流。原因是它将通过电子邮件发送外部电子邮件地址。不幸的是,当加载项创建列表项时,因为它是由应用程序而不是用户创建的,所以工作流不会自动启动。所以我想,简单!我将只向加载项添加代码,一旦创建了项目,它就会触发工作流。 好吧,问题就从这里开始。当我尝试启动2010工作流时,出现“权限被拒绝”错误。因此,我认为一个简单的解决办法是创建2013年工作流,授予it应用程序权限,并让它在应用程序步骤中启动2010年工作流。我可以启动2013工作流,但它在尝试启动2010工作流时停止,并出现权限被拒绝错误。 所以我被卡住了!以下是启动2010工作流的代码:

public static void Start2010Workflow(ClientContext clientContext, string listName, int itemId, string workflowName, Dictionary<string, object> wfParams)
{
    var web = clientContext.Web;
    var workflowServicesManager = new WorkflowServicesManager(clientContext, web);
    var workflowInteropService = workflowServicesManager.GetWorkflowInteropService();
    clientContext.Load(web);
    clientContext.Load(workflowInteropService);
    clientContext.ExecuteQuery();       
    List sharePointList = web.Lists.GetByTitle(listName);
    ListItem sharePointListItem = sharePointList.GetItemById(itemId);
    clientContext.Load(sharePointList);
    clientContext.Load(sharePointListItem);
    clientContext.ExecuteQuery();

    Guid itemGuid = Guid.Empty;
    if (sharePointListItem.FieldValues.ContainsKey("GUID"))
    {
        object temp = sharePointListItem.FieldValues["GUID"];
        if (temp != null)
            itemGuid = (Guid)temp;
    }
    var wfServManager = new WorkflowServicesManager(clientContext, clientContext.Web);
    var wfInteropService = wfServManager.GetWorkflowInteropService();
    clientContext.Load(wfInteropService);
    clientContext.ExecuteQuery();
    //Start the Workflow
    ClientResult<Guid> resultGuid = wfInteropService.StartWorkflow(workflowName, new Guid(), sharePointList.Id, itemGuid, wfParams);

    clientContext.ExecuteQuery();
}
没有成功

有没有人真的能让它工作起来?或者提供另一种解决方案


谢谢

我在onprem环境中遇到了相同的异常,所以情况不完全相同,我没有测试SPO。。。由于我没有找到任何其他解决方案,我采用了以下变通方法

查找加载项使用IIS->Application Pools->Identity domain\username运行的服务帐户 授予此帐户所需的权限,以便在需要启动工作流的网站集中启动工作流 在您的代码中,在不使用TokenHelper的情况下重新创建ClientContext,例如new ClientContextclientContext.Url 将上述代码用于新的ClientContext 这应该可以解决问题。。。我知道这离理想还很远,而且一开始也不是由提供商托管插件的想法,但必须让它工作起来。任何其他想法将不胜感激

SecureString password = new SecureString();
foreach (char c in "MyP@5sW0rD89@12".ToCharArray()) password.AppendChar(c);
Context.Credentials = new SharePointOnlineCredentials("user1@contoso.onmicrosoft.com", password);