Лучший отвечающий
Программная выдача прав на создание элементов в списке.

Вопрос
-
Добрый день!
Имеется два списка: "Активные заявки" и "Архив заявок". Есть группа "Инициаторы", у которой есть права на создание и редактирование элементов в списке "Активные заявки" и только просмотр элементов в списке "Архив заявок". В форме редактирования активной заявки я сделал чекбокс (отметка о выполнении заявки). Если отметка есть, то срабатывает мой собственный обработчик сохранения CloseRequest. В этом обработчике создаётся копия текущей заявки в "Архиве заявок", после чего исходная заявка удаляется. Ниже приведён код обработчика:
private void CloseRequest(object sender, EventArgs e) { if (completed != null) { if (completed.Checked) { SPSecurity.RunWithElevatedPrivileges(delegate() { SPContext current = SPContext.Current; SPWeb web = current.Web; SPListItem curitem = current.ListItem; SPList archive = web.GetList("Lists/Archive/"); SPListItem item = archive.AddItem(); item["Title"] = curitem["Title"]; item["Categor"] = curitem["Categor"]; item["FullDescription"] = curitem["FullDescription"]; item["PersonName"] = curitem["PersonName"]; item["Subdivision"] = curitem["Subdivision"]; item["Room"] = curitem["Room"]; item["Phone"] = curitem["Phone"]; item["Status"] = "Закрыта"; item["Executor"] = curitem["Executor"]; item["DispatcherNote"] = curitem["DispatcherNote"]; item["WorkStartTime"] = curitem["WorkStartTime"]; item["WorkTime"] = curitem["WorkTime"]; item["ExecutorComment"] = curitem["ExecutorComment"]; item.Update(); curitem.Delete(); }); } } }
Проблема в том, что этот код не срабатывает (несмотря на то, что используется SPSecurity.RunWithElevatedPrivileges), если у инициатора нет прав на создание элементов в списке "Архив заявок" (если дать ему права, то всё нормально работает). Уже искал информацию, но никак не могу разобраться, в чём проблема.22 января 2014 г. 6:22
Ответы
-
А он и не должен работать. Плохо искали.
Поставьте себе SPCOP (из галереи расширений VS) он быстро расскажет где вы не правы.
http://docs.spcaf.com/v4/SPC020206_AvoidCallToRunWithElevatedPrivileges.html
http://docs.spcaf.com/v4/SPC050201_InstantiateNewSPSiteInRunWithElevatedPrivileges.html
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 22 января 2014 г. 8:32
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 23 января 2014 г. 5:59
22 января 2014 г. 8:19 -
Спасибо за ссылки, разобрался. Также не обошлось без AllowUnsafeUpdates.
После исправления код выглядит так:
private void CloseRequest(object sender, EventArgs e) { if (completed != null) { if (completed.Checked) { SPContext current = SPContext.Current; SPSite site = current.Site; SPListItem curitem = current.ListItem; SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite elevatedSite = new SPSite(site.ID)) { SPWeb elevatedWeb = elevatedSite.RootWeb; elevatedWeb.AllowUnsafeUpdates = true; SPList archive = elevatedWeb.GetList("Lists/Archive/"); SPListItem item = archive.AddItem(); item["Title"] = curitem["Title"]; item["Categor"] = curitem["Categor"]; item["FullDescription"] = curitem["FullDescription"]; item["PersonName"] = curitem["PersonName"]; item["Subdivision"] = curitem["Subdivision"]; item["Room"] = curitem["Room"]; item["Phone"] = curitem["Phone"]; item["Status"] = "Закрыта"; item["Executor"] = curitem["Executor"]; item["DispatcherNote"] = curitem["DispatcherNote"]; item["WorkStartTime"] = curitem["WorkStartTime"]; item["WorkTime"] = curitem["WorkTime"]; item["ExecutorComment"] = curitem["ExecutorComment"]; item.Update(); curitem.Delete(); elevatedWeb.AllowUnsafeUpdates = false; elevatedWeb.Dispose(); } }); site.Dispose(); } } }
- Предложено в качестве ответа Kaplin VladimirModerator 23 января 2014 г. 6:45
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 23 января 2014 г. 6:53
23 января 2014 г. 6:30
Все ответы
-
А он и не должен работать. Плохо искали.
Поставьте себе SPCOP (из галереи расширений VS) он быстро расскажет где вы не правы.
http://docs.spcaf.com/v4/SPC020206_AvoidCallToRunWithElevatedPrivileges.html
http://docs.spcaf.com/v4/SPC050201_InstantiateNewSPSiteInRunWithElevatedPrivileges.html
- Предложено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 22 января 2014 г. 8:32
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 23 января 2014 г. 5:59
22 января 2014 г. 8:19 -
Искал-то может быть и неплохо, просто было несколько непонятно. Я правильно понимаю, что нужно внутри делегата обязательно создавать новый объект SPSite и работать уже с ним?22 января 2014 г. 14:20
-
да...22 января 2014 г. 21:13
-
Спасибо за ссылки, разобрался. Также не обошлось без AllowUnsafeUpdates.
После исправления код выглядит так:
private void CloseRequest(object sender, EventArgs e) { if (completed != null) { if (completed.Checked) { SPContext current = SPContext.Current; SPSite site = current.Site; SPListItem curitem = current.ListItem; SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite elevatedSite = new SPSite(site.ID)) { SPWeb elevatedWeb = elevatedSite.RootWeb; elevatedWeb.AllowUnsafeUpdates = true; SPList archive = elevatedWeb.GetList("Lists/Archive/"); SPListItem item = archive.AddItem(); item["Title"] = curitem["Title"]; item["Categor"] = curitem["Categor"]; item["FullDescription"] = curitem["FullDescription"]; item["PersonName"] = curitem["PersonName"]; item["Subdivision"] = curitem["Subdivision"]; item["Room"] = curitem["Room"]; item["Phone"] = curitem["Phone"]; item["Status"] = "Закрыта"; item["Executor"] = curitem["Executor"]; item["DispatcherNote"] = curitem["DispatcherNote"]; item["WorkStartTime"] = curitem["WorkStartTime"]; item["WorkTime"] = curitem["WorkTime"]; item["ExecutorComment"] = curitem["ExecutorComment"]; item.Update(); curitem.Delete(); elevatedWeb.AllowUnsafeUpdates = false; elevatedWeb.Dispose(); } }); site.Dispose(); } } }
- Предложено в качестве ответа Kaplin VladimirModerator 23 января 2014 г. 6:45
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 23 января 2014 г. 6:53
23 января 2014 г. 6:30 -
*facepalm*
В коде немеряно ошибок. Поставьте spcop, посмотрите на что он ругается.Business Solutions Architect, SharePoint Expert, Trainer, Speaker and Author http://gandjustas.blogspot.com/ Join Russian SharePoint Community at https://www.facebook.com/groups/sharepointrussian/
23 января 2014 г. 7:17 -
Видимо, Вы просто не можете не выпендриваться. Знаете, ВНЕЗАПНО не у всех сразу появляется такой же опыт в шарике, как у Вас. Но всё равно спасибо за помощь.24 января 2014 г. 3:15
-
Я уже дважды написал что надо поставить spcop и посмотреть на что он ругается. Вы этого так и не сделали. Опыт тут не при чем.
Business Solutions Architect, SharePoint Expert, Trainer, Speaker and Author http://gandjustas.blogspot.com/ Join Russian SharePoint Community at https://www.facebook.com/groups/sharepointrussian/
24 января 2014 г. 5:58 -
С чего Вы взяли, что я его не поставил? Я просто не сказал об этом.24 января 2014 г. 10:49
-
В RunWithElevatedPrivileges всегда требуется переоткрывать SPSite SPWeb!
Для SPContext не надо вызывать Dispose!
При работе с классами IDisposable вместо вызова Dispose используйте using(){} !!!
8 февраля 2014 г. 12:01