Недавно мне попался в руки проект, в котором я принимал участие в роли 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-ов.
А так вообще делать не надо. нужно просто получить сайт с токеном системной учетной записи.
ReplyDelete