2012-08-08 66 views
1

我们正在使用sharepoint 2007以编程方式创建SPAlert时访问被拒绝错误

我们创建了以编程方式创建警报的自定义页面。

我们面临的问题是,如果登录的用户是网站集管理员,那么只有电子邮件被触发。

网站集管理员以外的用户拥有完全控制权或访问权限的网站,他们将获得访问被拒绝错误。

我们尝试使用SPSecurity.RunWithElevatedPrivileges,但在这种情况下,Access Denied错误也越来越多。

对于下面的代码,我们没有得到拒绝访问错误,但在这种情况下,电子邮件没有得到触发,

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
Guid siteId = SPContext.Current.Site.ID; 
Guid webId = SPContext.Current.Web.ID; 
using (SPSite oSite = new SPSite(siteId)) 
{ 
using (SPWeb oWeb = oSite.OpenWeb(webId)) 
{ 
oWeb.AllowUnsafeUpdates = true; 
SPUser oUser = oWeb.CurrentUser; 
SPUser user = oWeb.EnsureUser(oUser.ToString()); 
SPList oList = oWeb.Lists[strLibraryName]; 
SPAlert oAlert = user.Alerts.Add(); 
oAlert.Filter ="<Eq><FieldRef Name="+strCol+"><Value type='Text'>" + strColValue + "</Value></Eq>"; 
oAlert.Title = "test alert"; 
oAlert.AlertType = SPAlertType.List; 
oAlert.EventType = SPEventType.All; 
oAlert.List = oList; 
oAlert.AlertFrequency = SPAlertFrequency.Immediate; 
oAlert.AlwaysNotify = true; 
oAlert.Update(true); 
} 
} 
}); 

请让我知道什么是该解决方案或者我们如何可以添加/删除用户网站集合管理员在运行时以编程方式运行

+0

您可能会看到是否需要oWeb.AllowUnsafeUpdates。这取决于您在//代码中创建警报的情况。 – buck 2012-08-08 16:25:57

+0

嗨,降压,我更新了创建警报代码的问题 感谢您花时间了解问题 – Rushikesh 2012-08-09 08:11:12

+0

其中一个问题是您的oUser变量。由于您在设置时处于提升的权限块内部,因此oUser是您的应用程序池帐户,而不是当前登录的用户。也许尝试移动声明并将其分配到使用语句之上。这可能是唯一的问题 - 警报正在成功创建,但它是针对错误的帐户,因此该帐户没有收到电子邮件。如果所有这些都在事件接收器中,则可以使用以下代码行来获取实际用户:SPUser user = oWeb.Users.GetByID(properties.CurrentUserId); – buck 2012-08-09 22:10:27

回答

0

将声明和赋值放在using语句之上。我认为警报正在成功创建,但它是针对错误的帐户,因此您没有收到电子邮件。如果这一切是一个事件接收器里面,您可以使用此行来获取实际的用户:

SPUser user = oWeb.Users.GetByID(properties.CurrentUserId); 
+0

嗨降压,问题现在解决。问题是因为EnsureUser()方法。我刚刚删除了SPUser用户= oWeb.EnsureUser(oUser.ToString());行和所有工作正常。 非常感谢.. – Rushikesh 2012-08-13 07:25:30

+0

该行中声明的变量用于其他行,因此删除它会导致编译错误。也许您可以发布工作代码,以便其他查看此代码的人可以看到解决方案。 – buck 2012-08-13 18:23:43

0

的问题是与EnsureUser()方法,因此删除它并张贴下面的工作代码..

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
Guid siteId = SPContext.Current.Site.ID; 
Guid webId = SPContext.Current.Web.ID; 
using (SPSite oSite = new SPSite(siteId)) 
{ 
using (SPWeb oWeb = oSite.OpenWeb(webId)) 
{ 
oWeb.AllowUnsafeUpdates = true; 
SPUser oUser = oWeb.CurrentUser; 
SPList oList = oWeb.Lists[strLibraryName]; 
SPAlert oAlert = oUser.Alerts.Add(); 
oAlert.Filter ="<Eq><FieldRef Name="+strCol+"><Value type='Text'>" + strColValue + "</Value></Eq>"; 
oAlert.Title = "test alert"; 
oAlert.AlertType = SPAlertType.List; 
oAlert.EventType = SPEventType.All; 
oAlert.List = oList; 
oAlert.AlertFrequency = SPAlertFrequency.Immediate; 
oAlert.AlwaysNotify = true; 
oAlert.Update(true); 
} 
} 
});