В настоящее время мы работаем над проектом с участием sharepoint. Мы создали веб-шаблон, содержащий определенный контент, который мы хотели бы дублировать каждый раз при создании нового веб-сайта. Мы настроили создание веб-пользовательского элемента управления, работающего в веб-части. Это создает сеть из шаблона, устанавливает необходимые разрешения и добавляет некоторые функции.
Эта проблема:
Мы хотели бы настроить оповещение для группы безопасности DOMAIN \ sharepoint с включенной электронной почтой. Мы используем этот код VB.Net:
Dim user As SPUser = w.EnsureUser("DOMAIN\sharepoint")
Dim alert As SPAlert = w.Alerts.Add()
alert.User = user
alert.AlertType = SPAlertType.List
alert.List = w.Lists("Information")
alert.Title = w.Title & " - " & alert.Title
alert.Properties("eventtypeindex") = "2"
alert.AlertFrequency = SPAlertFrequency.Daily
alert.Update(False)
Это работает для пользователей, которые являются администраторами домена, но не работает для людей, которые имеют полный контроль только на уровне этого сайта. Однако они могут войти и вручную добавить оповещение после создания сайта. У меня нет проблем при создании этого с моим собственным логином, но я являюсь членом администраторов домена и, следовательно, администратором всех сайтов sharepoint. Ошибка, которую получают только пользователи, имеющие полный доступ к этому сайту, - это ошибка «Доступ запрещен».
Изменить: я никогда не говорил, что хочу от этого. Я хотел бы знать, есть ли способ обойти это, или я могу создать какой-нибудь eventReceiver, который будет использоваться при создании самой сети для добавления предупреждения.
РЕДАКТИРОВАТЬ 2:
Я изменил код на следующий и теперь получаю сообщение об ошибке
Dim authorizedCode As SPSecurity.CodeToRunElevated = New SPSecurity.CodeToRunElevated(AddressOf AddAlert)
SPSecurity.RunWithElevatedPrivileges(authorizedCode)
Dim new_site As New SPSite(SPContext.Current.Site.ID, sysToken)
Dim web As SPWeb = new_site.AllWebs(w.ID)
Dim user As SPUser = web.EnsureUser("DOMAIN\sharepoint")
Dim alert As SPAlert = web.Alerts.Add()
alert.User = user
alert.AlertType = SPAlertType.List
alert.List = web.Lists("Information")
alert.Title = web.Title & " - " & alert.Title
alert.Properties("eventtypeindex") = "2"
alert.AlertFrequency = SPAlertFrequency.Daily
alert.Update(False)
куда sysToken
получается в
Public Sub AddAlert()
Dim lolcatKiller As SPSite = New SPSite(SPContext.Current.Site.ID)
sysToken = lolcatKiller.SystemAccount.UserToken
End Sub
Но я получаю исключение
System.Runtime.InteropServices.COMException: The security validation for this page is invalid.
Насколько я могу судить, я все еще нахожусь в контексте системного пользователя
Обход действительно существует. Оберните код RunWithElevatedPrivileges.
Для SP2010 мне удалось исправить это, убедившись, что заполнитель «PlaceholderFormDigest» не находится внутри раздела скрытых заполнителей.
Они должны быть на странице и работать:
<asp:ContentPlaceHolder id="PlaceHolderFormDigest" runat="server"> <SharePoint:FormDigest runat="server" /> </asp:ContentPlaceHolder> <input type="text" name="__spText1" title="text" style="display:none;" /> <input type="text" name="__spText2" title="text" style="display:none;" />
для этого исключения используйте: web.AllowUnsafeUpdates = true;