我尝试使用未经授权的用户(仅具有读权限)对Sharepoint 2010列表执行某些操作,并且我获得了拒绝访问权限的异常。 是否可以在不改变用户权限的情况下完成。 请在下面找到我的代码:
public void StartWorkFlow(int itemID, int wfTemplateID, String entityName, String userShortname)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPUser spUser;
using (site = new SPSite(siteUrl))
{
using (web = site.RootWeb)
{
spUser = web.EnsureUser(userShortname);
}
}
using (site = new SPSite(siteUrl, spUser.UserToken))
{
using (web = site.AllWebs["WPrs"])
{
list = web.Lists["Workflow Template"];
SPListItem item = list.Items.GetItemById(wfTemplateID);
SPList processList = web.Lists["List Process " + item["Template_x0020_Name"]];
SPListItem newInstance = processList.Items.Add();
newInstance["Template_x0020_Name"] = item["Template_x0020_Name"];
newInstance["Template_x0020_Description"] = item["Template_x0020_Description"];
newInstance["Date_x0020_De_x0020_Publication"] = item["Date_x0020_De_x0020_Publication"];
newInstance["Item_x0020_Id"] = itemID;
newInstance["Item_x0020_Extradata"] = entityName.ToLower() + "||Parameter||" + "";
newInstance["CTName"] = Utility.GetInstance().GetSuperItemNameBySubItemName(entityName);
web.AllowUnsafeUpdates = true;
newInstance.Update();
web.AllowUnsafeUpdates = false;
}
}
});
}
提前谢谢。
答案 0 :(得分:2)
为了能够使用site.AllWebs,用户必须拥有对网站的完全控制权。而不是使用AllWebs尝试使用以下代码获取子站点 -
SPWebCollection subwebs = CurrentSite.OpenWeb()。GetSubwebsForCurrentUser();
此外,您将无法使用只读权限更新listitem。
答案 1 :(得分:0)
如果唯一的要求是设置Created By / Modified By字段 - 您应该能够使用SystemUpdate而不是Update来覆盖默认值。但您仍然需要运行此RunWithElevatedPrivileges
模式而不是UserToken
虽然我不确定如果在此更新(事件接收器或工作流)之后有任何其他依赖操作会发生什么,我不确定它将使用什么上下文(即,如果SharePoint内部将使用当前SPWeb.CurrentUser
对象。