Недавно мне попался в руки проект, в котором я принимал участие в роли 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