访问被拒绝使用SPUserToken更新列表项时出现异常

时间:2014-05-26 09:48:39

标签: sharepoint

我尝试使用未经授权的用户(仅具有读权限)对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;
                }
            }
        });

    }

提前谢谢。

2 个答案:

答案 0 :(得分:2)

为了能够使用site.AllWebs,用户必须拥有对网站的完全控制权。而不是使用AllWebs尝试使用以下代码获取子站点 -

SPWebCollection subwebs = CurrentSite.OpenWeb()。GetSubwebsForCurrentUser();

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.getsubwebsforcurrentuser%28v=office.12%29.aspx

http://social.msdn.microsoft.com/Forums/sharepoint/en-US/e7ff284f-fe4b-42fb-8b21-a475e331a18c/access-denied-for-user-with-contribute-rights?forum=sharepointdevelopmentlegacy

此外,您将无法使用只读权限更新listitem。

答案 1 :(得分:0)

如果唯一的要求是设置Created By / Modified By字段 - 您应该能够使用SystemUpdate而不是Update来覆盖默认值。但您仍然需要运行此RunWithElevatedPrivileges模式而不是UserToken

虽然我不确定如果在此更新(事件接收器或工作流)之后有任何其他依赖操作会发生什么,我不确定它将使用什么上下文(即,如果SharePoint内部将使用当前SPWeb.CurrentUser对象。