Friday, 2 September 2016

How to set unique permission for list items based on the users present in list columns for each item?


 static void Main(string[] args)
        {

            Console.Write("Enter list name:\r\n");
            string listTitle = Console.ReadLine();
            Console.Write("\r\nEnter column names separated by columns without space:\r\n");
            string listColumns = Console.ReadLine();
            SetItemPermissions(listTitle, listColumns);
       }


public static void SetItemPermissions(string listName, string fields)
        {
            try
            {
                int y = 0;
                ClientContext context = new ClientContext("https://domain.com/sites/siteColl/siteName/");
                string decryptedPwdt = "password";
                foreach (char c in decryptedPwdt)
                {
                    securePassword.AppendChar(c);
                }

                context.Credentials = new NetworkCredential("user", decryptedPwdt, "Domain");
                Web web = context.Web;
                context.Load(web);

                List list = web.Lists.GetByTitle(listName);
                context.Load(list);

                CamlQuery camlQuery = new CamlQuery();
                ListItemCollection itemColl = list.GetItems(camlQuery);
                string[] columnNames = fields.Split(',');

                foreach (string column in columnNames)
                {
                    context.Load(itemColl, includes => includes.Include(i => i[column]));
                }
                context.ExecuteQuery();

                foreach (ListItem item in itemColl)
                {
                    item.BreakRoleInheritance(false, false);

                    foreach (string member in columnNames)
                    {
                        try
                        {
                            if (item[member].GetType().ToString() == "Microsoft.SharePoint.Client.FieldUserValue")
                            {
                                try
                                {
                                    User user = web.EnsureUser((((Microsoft.SharePoint.Client.FieldUserValue)(item[member])).LookupValue).ToString());
                                    RoleDefinitionBindingCollection roleColl = new RoleDefinitionBindingCollection(context);
                                    roleColl.Add(context.Web.RoleDefinitions.GetByName("Custom permission level"));
                                    item.RoleAssignments.Add(user, roleColl);
                                }
                                catch
                                {
                                    User user = web.EnsureUser((((Microsoft.SharePoint.Client.FieldUserValue)(item[member])).Email).ToString());
                                    RoleDefinitionBindingCollection roleColl = new RoleDefinitionBindingCollection(context);
                                    roleColl.Add(context.Web.RoleDefinitions.GetByName("Custom permission level"));
                                    item.RoleAssignments.Add(user, roleColl);
                                }
                            }
                            else
                            {
                                User user = web.EnsureUser(item[member].ToString());
                                RoleDefinitionBindingCollection roleColl = new RoleDefinitionBindingCollection(context);
                                roleColl.Add(context.Web.RoleDefinitions.GetByName("Custom permission level"));
                                item.RoleAssignments.Add(user, roleColl);
                            }
                        }
                        catch { }
                    }

                    try
                    {

                        Group groupMember = web.SiteGroups.GetByName("Group1");
                        Group groupOwner = web.SiteGroups.GetByName("Group2");
                        Group groupTL = web.SiteGroups.GetByName("Group3");



                        RoleDefinitionBindingCollection roleCollEdit = new RoleDefinitionBindingCollection(context);
                        roleCollEdit.Add(context.Web.RoleDefinitions.GetByName("Edit"));

                        RoleDefinitionBindingCollection roleCollFull = new RoleDefinitionBindingCollection(context);

                        roleCollFull.Add(context.Web.RoleDefinitions.GetByName("Full Control"));
                        item.RoleAssignments.Add(groupMember, roleCollEdit);
                        item.RoleAssignments.Add(groupOwner, roleCollFull);
                        item.RoleAssignments.Add(groupTL, roleCollEdit);


                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }

                    try
                    {
                        item.Update();
                        context.ExecuteQuery();
                    }
                    catch (Exception ex)
                    {
                        if (ex.HResult == -2146233088)
                        {
                            Group groupMember = web.SiteGroups.GetByName("Group1");
                            Group groupOwner = web.SiteGroups.GetByName("Group2");
                            Group groupTL = web.SiteGroups.GetByName("Group3");



                            RoleDefinitionBindingCollection roleCollEdit = new RoleDefinitionBindingCollection(context);
                            roleCollEdit.Add(context.Web.RoleDefinitions.GetByName("Edit"));

                            RoleDefinitionBindingCollection roleCollFull = new RoleDefinitionBindingCollection(context);

                            roleCollFull.Add(context.Web.RoleDefinitions.GetByName("Full Control"));
                            item.RoleAssignments.Add(groupMember, roleCollEdit);
                            item.RoleAssignments.Add(groupOwner, roleCollFull);
                            item.RoleAssignments.Add(groupTL, roleCollEdit);
                            item.Update();
                            try
                            {
                                context.ExecuteQuery();
                            }
                            catch (Exception ex2)
                            {
                                Console.WriteLine(ex2.Message);
                            }
                        }
                    }

                    Console.Write(".");
                    y++;
                    if (y == 1) Console.WriteLine("\r\n1 item updated.");
                    if (y == 100) Console.WriteLine("\r\n100 items updated.");
                    if (y == 500) Console.WriteLine("\r\n500 items updated.");
                    if (y == 800) Console.WriteLine("\r\n800 items updated.");
                    if (y == 1000) Console.WriteLine("\r\n1000 items updated.");
                    if (y == 2000) Console.WriteLine("\r\n2000 items updated.");
                    if (y == 3000) Console.WriteLine("\r\n3000 items updated.");
                    if (y == 4000) Console.WriteLine("\r\n4000 items updated.");
                }
                Console.WriteLine("\r\nDone!");
                Console.Read();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.Read();
            }

        }

No comments:

Post a Comment