Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sharepoint 在SPItemEventReceiver ItemAdded中,当参与者加入时,如何设置项目的更改权限?_Sharepoint_Sharepoint 2007_Wss 3.0 - Fatal编程技术网

Sharepoint 在SPItemEventReceiver ItemAdded中,当参与者加入时,如何设置项目的更改权限?

Sharepoint 在SPItemEventReceiver ItemAdded中,当参与者加入时,如何设置项目的更改权限?,sharepoint,sharepoint-2007,wss-3.0,Sharepoint,Sharepoint 2007,Wss 3.0,嗯。我试图编写一个事件接收器,让用户完全控制他们上传的任何文件。只要我以管理员身份登录,我就可以让代码正常工作。同一代码获得一个系统。UnauthorizedAccessException:>访问被拒绝。(来自HRESULT的异常:x80070005E_ACCESSDENIED))我以参与者身份登录并上载文件时的异常 我尝试了一些“解决方案”和其他各种方法来解决这个问题,如下面的注释代码所示。从我所读到的内容来看,有必要在提升特权的同时以某种方式重新创建该对象,以便在所讨论的对象上拥有这些特权。

嗯。我试图编写一个事件接收器,让用户完全控制他们上传的任何文件。只要我以管理员身份登录,我就可以让代码正常工作。同一代码获得一个
系统。UnauthorizedAccessException:>访问被拒绝。(来自HRESULT的异常:x80070005E_ACCESSDENIED))
我以参与者身份登录并上载文件时的异常

我尝试了一些“解决方案”和其他各种方法来解决这个问题,如下面的注释代码所示。从我所读到的内容来看,有必要在提升特权的同时以某种方式重新创建该对象,以便在所讨论的对象上拥有这些特权。但这两种方法都无法找到该项。似乎这个项目还不在清单上。哦,这是一个文档库

    //Works as admin
    public override void ItemAdded(SPItemEventProperties properties)
    {
        base.ItemAdded(properties);//tried putting this at top and bottom of method, thinking perhaps this where the file get put in list.

        SPSecurity.RunWithElevatedPrivileges(delegate
        {
            using (var site = new SPSite(properties.SiteId))
            using (var web = site.OpenWeb(properties.RelativeWebUrl))
            {
                    ...

                    //works when admin
                    var item = properties.ListItem;

                    //attempt: by item url
                       //this does not work, file not found
                    var item = web.GetListItem(properties.ListItem.Url);

                    //attempt: by item ID
                      // this works
                    var list = web.Lists[properties.ListId]; 
                      //this does not
                    var item = list.GetItemById(properties.ListItemId); 


                    item.BreakRoleInheritance(true); //this get the access denied error
                    item.RoleAssignments.Add(GetRoleAssignment(web, item));

                    ...
            }
        }
        base.ItemAdded(properties);
    }



更新


因此,目前有效的解决方案是:

        ...

        SPSecurity.RunWithElevatedPrivileges(delegate
        {
            using (var site = new SPSite(properties.SiteId))
            using (var web = site.OpenWeb(properties.RelativeWebUrl))
            {
                try
                {
                    properties.ListItem.File.CheckIn(String.Empty);
                    System.Threading.Thread.Sleep(1000);
                    var list = web.Lists[properties.ListId];
                    var item = list.Items[properties.ListItem.UniqueId];
                    item.BreakRoleInheritance(true);
                    item.RoleAssignments.Add(GetRoleAssignment(web, item));
                }
                catch (Exception e)
                {
                    LogError(e.ToString());
                }
                finally
                {
                    properties.ListItem.File.CheckOut();
                    ...
                }
            }
        });

        ...

我有些担心计时器的必要性,这是我从别处收集到的想法。从我所看到的情况来看,ItemAdded似乎是异步启动的,而且由于计时器是必需的(我在没有计时器的情况下尝试过),所以签入似乎也是异步的。我真的不知道它为什么会这样,但这是我的假设。

您的应用程序池帐户似乎不是网站集管理员。当您执行
运行WithLevelatedPrevileges
时,它基本上模拟应用程序池帐户。因此,请确保您拥有该帐户的权限。

可能的话,您正在上载的文件在默认情况下已签出,因此即使在RunwithElevatedPrevileges块中,您也无法检索其ListItem。尝试这样做:

properties.ListItem.File.CheckIn(String.Empty);
就在运行WithElevatedPrevileges块之前。

我将它们设置为同一个块(两者都设置为“管理员”)。没有变化。以管理员身份登录时仍然有效,但不能以参与者帐户登录。据我所知,当从属性访问列表项时,它是由当前用户创建的。