none
Sharepoint 2013. Workflow 2013 in Timer Job RRS feed

  • Вопрос

  • Всем привет. 

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

    В таймер джобе создается элемент в этом списке. После создания эл-та на нем запускается рабочий процесс. Но он сразу прекращается с ошибкой: 

    171a693d-7b50-a70a-0000-000000000000. Details: RequestorId: 171a693d-7b50-a70a-0000-000000000000.
    Details: An unhandled exception occurred during the execution of the workflow
    instance. Exception details: System.ApplicationException: HTTP 401
    {"error":{"code":"-2147024891, System.UnauthorizedAccessException","message":{"lang":"en-US","value":"Access
    denied. You do not have permission to perform this action or access this
    resource."}}}

    ......................

    Подозреваю, что это из-за того, что элемент создается от учетной записи System Account.

    Может кто-нибудь сталкивался с таким? Как это можно обойти?

    14 августа 2014 г. 15:14

Ответы

  • Здравствуйте!
    Так и есть. Попробуйте элемент руками создать - аналогичная ошибка будет.
    Выполняйте код в TimerJob от лица отличного от системной учётной записи SharePoint.

    SPUserToken userToken = null;
            SPSecurity.RunWithElevatedPrivileges(() =>
            {
                using (SPSite site = new SPSite(SPContext.Current.Site.ID))
                {
                    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
                    {
                        userToken = web.AllUsers["domain\\login"].UserToken;
                    }
                }
            });
    
    
    // Создать элемент
    using (SPSite site = new SPSite(SPContext.Current.Site.ID, userToken))
            {
                using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
                {
                    // Создать элемент
                }
            }


    14 августа 2014 г. 15:50

Все ответы

  • Здравствуйте!
    Так и есть. Попробуйте элемент руками создать - аналогичная ошибка будет.
    Выполняйте код в TimerJob от лица отличного от системной учётной записи SharePoint.

    SPUserToken userToken = null;
            SPSecurity.RunWithElevatedPrivileges(() =>
            {
                using (SPSite site = new SPSite(SPContext.Current.Site.ID))
                {
                    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
                    {
                        userToken = web.AllUsers["domain\\login"].UserToken;
                    }
                }
            });
    
    
    // Создать элемент
    using (SPSite site = new SPSite(SPContext.Current.Site.ID, userToken))
            {
                using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
                {
                    // Создать элемент
                }
            }


    14 августа 2014 г. 15:50
  • Alexander, спасибо за ответ.

    У меня только вопрос. А если мне не известен ни один юзер, у которого я бы мог взять токен. Как быть в таком случае? Может можно как то получить Farm Account User и от него создавать эл-т? Или какого нибудь другого системного юзера?

    Кстати, SPContext.Currect в таймер джобах как и в ресиверах null.
    • Изменено Abibok Yura 15 августа 2014 г. 9:22
    15 августа 2014 г. 8:06
  • Как я понимаю Вы создаете тиражируемое решение.
    Если есть инсталлятор - просите ввести данные учётки.

    15 августа 2014 г. 9:40