Страницы

Tuesday, February 14, 2012

SPSecurity.RunWithElevatedPrivileges в Sharepoint 2010

Недавно мне попался в руки проект, в котором я принимал участие в роли bugfixer-а. Мне попался стандартный блок кода с повышением привилегий при работе списком в EventReciever-е списка:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = properties.OpenSite())
    {
        using (SPWeb web = site.OpenWeb())
        {
С виду этот блок кода выглядел, нормальным, но он не работал. Не долго думая, я включил рефлектор и решил посмотреть, что же тут не так? Данные из рефлектора:
public SPSite OpenSite() 
{ 
    if ((this.m_site == null) && (this.WebUrl != null)) 
    { 
        if (base.EventUserToken != null) 
        { 
            this.m_site = new SPSite(this.WebUrl, base.EventUserToken); 
        } 
        else
        { 
            this.m_site = new SPSite(this.WebUrl); 
        } 
        this.m_siteCreatedByThis = true; 
    } 
    return this.m_site; 
}
public SPWeb OpenWeb()
{
    this.OpenSite();
    if (this.m_site != null)
    {
        return this.m_site.OpenWeb(this.RelativeWebUrl);
    }
    return null;
}

Оказалось, что сайт, открывается всегда с определенным EventUserToken, который в контексте EventReciever всегда был != null.

Будьте осторожны, при использовании методов OpenSite(), OpenWeb() внутри List EventReciever-ов.

1 comment:

  1. А так вообще делать не надо. нужно просто получить сайт с токеном системной учетной записи.

    ReplyDelete