Web 创建上的 SharePoint 警报

Web 创建上的 SharePoint 警报

我们目前正在开展一个涉及 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;" />

相关内容