我们目前正在开展一个涉及 SharePoint 的项目。我们创建了一个模板网站,其中包含我们希望每次创建新网站时都复制的特定内容。我们已设置了一个在 Web 部件中运行的创建 Web 用户控件。这将从模板创建网站、设置必要的权限并添加一些功能。
问题:
我们希望为启用电子邮件的安全组 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 站点的管理员。仅对此站点拥有完全控制权的用户收到的错误是“访问被拒绝”错误。
编辑:我从未真正说明过我想要什么。我想知道是否有办法避免这种情况,或者我是否可以创建某种类型的事件接收器,以便在创建 Web 本身时添加警报。
编辑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.
据我所知,我仍然处于系统用户的上下文中
答案1
确实存在规避方法。使用以下代码包装代码:使用高级权限运行。
答案2
对于该异常使用:web.AllowUnsafeUpdates = true;
答案3
对于 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;" />