c# - 以编程方式列出项目多个用户权限(共享点)

标签 c# sharepoint list permissions

我环顾四周,还没有找到解决方案。我到处拾取代码片段来寻找解决方案。

我有一个名为“文档协作”的文档库,其中包含“分配给”字段。这是人员/组字段。这些人将能够处理特定文档(列表项权限)。现在,首先,他们将具有隐藏权限(他们看不到它),但是当添加到文档时,他们将看到它并能够贡献它,他们还将收到电子邮件通知。我在下面附上了完整的代码。

所以,当我进行 VS10 调试时,我没有收到任何错误。但它不发送任何电子邮件或不设置权限。怎么了?

using System;
using System.IO;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;

namespace ARDT.Notifications
{
    /// <summary>
    /// List Item Events
    /// </summary>
    public class Notifications : SPItemEventReceiver
    {
       /// <summary>
       /// An item was checked in
       /// </summary>
       public override void ItemCheckedIn(SPItemEventProperties properties)
       {
           SPSite site = new SPSite("http://sp2010dev/ardt");
           using (SPWeb web = site.OpenWeb())
           {
               SPList list = web.Lists["Document Collaboration"];
               SPListItem listItem = properties.ListItem;
               SPUser userName = null;
               String toAddress = null;

               //EMail initializations
               bool appendHtmlTag = false;
               bool htmlEncode = false;
               string subject = "Subject";
               string message = "Message text";

               //get usernames
               string[] userNameArray = listItem.Fields["Assigned to"].ToString().Split(';');

               for (int i = 0; i <= userNameArray.Length - 1; i++)
               {
                   userName = web.AllUsers[userNameArray[i]];
                   toAddress = userName.Email;
                   SPSecurity.RunWithElevatedPrivileges(delegate()
                   {
                       //EMAIL USER
                       bool result = SPUtility.SendEmail(web, appendHtmlTag, htmlEncode, toAddress, subject, message);

                       //PERMISSIONS
                       //remove permissions first
                       web.AllowUnsafeUpdates = true;
                       listItem.BreakRoleInheritance(false);
                       SPRoleAssignmentCollection raCollection = listItem.RoleAssignments;
                       //remove exisiting permissions one by one
                       for (int a = raCollection.Count - 1; i > -0; i--)
                       {
                           raCollection.Remove(a);
                       }

                       //grant permissions for specific list item
                       SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                       SPRoleAssignment roleAssignment = new SPRoleAssignment(userName);

                       roleAssignment.RoleDefinitionBindings.Add(roleDefintion);
                       listItem.RoleAssignments.Add(roleAssignment);
                       listItem.Update();
                   });
               }
           }
           base.ItemCheckedIn(properties);
       }
    }
}

最佳答案

不,我犯了一个简单的错误,将其置于检查状态而不是更新状态,还有一个解决方法是在更新时多次运行该函数,只需在列表中创建一个名为“updateContributors”的列并使用默认值正确/是

这是代码/没有时间解释,但评论很好,祝你好运:

    using System;
    using System.IO;
    using System.Security.Permissions;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Security;
    using Microsoft.SharePoint.Utilities;
    using Microsoft.SharePoint.Workflow;

    //Debugging includes
    using System.Diagnostics;


    namespace ARDT.Notifications
    {
        /// <summary>
        /// List Item Events
        /// </summary>
        public class Notifications : SPItemEventReceiver
        {
            /// <summary>
            /// An item was updated
            /// </summary>
            public override void ItemUpdated(SPItemEventProperties properties)
            {
                if (properties.ListItem["updateContributors"].ToString().Equals("True"))
                {
                    //work around so it goes through it only once instead of everytime the item is updated
                    properties.ListItem["updateContributors"] = "False";
                    SPSite site = new SPSite("http://sp2010dev/ardt/");
                    using (SPWeb web = site.OpenWeb())
                    {

                        SPList list = web.Lists["Document Collaboration"];
                        SPListItem listItem = properties.ListItem;
                        SPUser userName = null;
                        String toAddress = null;

                        //EMail initializations
                        bool appendHtmlTag = false;
                        bool htmlEncode = false;
                        string subject = "You have been assigned to a Document";
                        string message = "Test Message";

                        //get usernames
                        string tempFieldValue = listItem["Assigned To"].ToString();
                        string[] userNameArray = listItem["Assigned To"].ToString().Split(';');

                        //remove permissions first
                        web.AllowUnsafeUpdates = true;
                        listItem.BreakRoleInheritance(false);
                        SPRoleAssignmentCollection raCollection = listItem.RoleAssignments;
                        //remove exisiting permissions one by one
                        for (int a = raCollection.Count - 1; a >= 0; a--)
                        {
                            raCollection.Remove(a);
                        }

                        for (int i = 1; i < userNameArray.Length; i++)
                        {
                            tempFieldValue = userNameArray[i].Replace("#", "");
                            userName = web.AllUsers[tempFieldValue];
                            toAddress = userName.Email;
                            SPSecurity.RunWithElevatedPrivileges(delegate()
                            {
                                //EMAIL USER
                                bool result = SPUtility.SendEmail(web, appendHtmlTag, htmlEncode, toAddress, subject, message);

                                //PERMISSIONS                              
                                //grant permissions for specific list item
                                SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                                SPRoleAssignment roleAssignment = new SPRoleAssignment(userName);

                                roleAssignment.RoleDefinitionBindings.Add(roleDefintion);
                                listItem.RoleAssignments.Add(roleAssignment);
                                listItem.Update();
                            });
                            i++;
                        }

                    }
                    //base.ItemUpdated(properties);
                    //after final update has been done return true
                    properties.ListItem["updateContributors"] = "True";
                }
            }



        }

    }

关于c# - 以编程方式列出项目多个用户权限(共享点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413374/

相关文章:

c# - C# 中的类和列表 <> 引用类型

c# - 如何强制 PHP 将数字视为 uint

c# - 如何在 C# 中找到已安装应用程序的升级代码?

sharepoint - 如何限制可以访问 SharePoint 网站集的用户数量?

c# - 下面代码中的方括号 [] 是什么意思?

sharepoint - SSIS 问题 : Dynamic OData Connection for Same SharePoint List on Multiple Sites

c# - 使用反射将所有依赖属性重置回默认值?

c# - 无法从 nethereum 解码的输入数据中获取可读整数

python - Python 3.4 中可以选择迭代器的起点吗?

r - 快速检查 R 中另一个列表中包含一个列表的多少个元素