Setting List Item Permissions in Sharepoint 2007?

Hi All -
I'm using C#

I'm trying to find a way to set permissions for each item.

thanks
JordanBlacklerAsked:
Who is Participating?
 
liebrandConnect With a Mentor Commented:
This is assuming you already have the item loaded into an SPListItem object.

SPListItem item = list.Items[1]; // gets an item out of the list
SPRoleDefinition definition = web.RoleDefinitions.GetByType(SPRoleType.Administrator);
 
SPRoleAssignment assignment = new SPRoleAssignment(@"domain\user", "email@company.com", null, null);
assignment.RoleDefinitionBindings.Add(definition);
 
if(!item.HasUniqueRoleAssignments)
   item.BreakRoleInheritance(false); // true if you want to copy permissions
 
item.RoleAssignments.Add(assignment);
item.Update();

Open in new window

0
 
JordanBlacklerAuthor Commented:
I get this error:
Value does not fall within the expected range.   at Microsoft.SharePoint.SPRoleAssignmentCollection.UpdateAssignment(Int32 principalId, SPRoleDefinitionBindingCollection bindings, Boolean addOnly)
   at Microsoft.SharePoint.SPRoleAssignmentCollection.Add(SPRoleAssignment roleAssignment)
   at _Default.Button1_Click(Object sender, EventArgs e)
   at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


        SPWeb web = SPControl.GetContextWeb(Context);
        SPSite site = SPControl.GetContextSite(Context);
        //site.CatchAccessDeniedException = false;
        SPWeb subSite = site.AllWebs["mySite"];
        SPListCollection allSiteLists = subSite.Lists;
        SPList list = subSite.Lists["myList"];
 
        SPListItem item = list.Items[1]; // gets an item out of the list
        SPRoleDefinition definition = web.RoleDefinitions.GetByType(SPRoleType.Administrator);
 
        SPRoleAssignment assignment = new SPRoleAssignment(@"na\test", "tester@test.com", null, null);
        assignment.RoleDefinitionBindings.Add(definition);
 
        if (!item.HasUniqueRoleAssignments)
            item.BreakRoleInheritance(false); // true if you want to copy permissions
 
        item.RoleAssignments.Add(assignment);
        item.Update();

Open in new window

0
 
liebrandCommented:
My code references list.Items[1] ... which would actually be the second item in the list.  If you only have one item in your list, make sure you code is changed to list.Items[0]

If that does not resolve the error -- let me know which line the error is failing on.

Thanks
0
Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

 
JordanBlacklerAuthor Commented:
new error:
The security validation for this page is invalid. Click Back in your Web browser, refresh the page, and try your operation again.   at Microsoft.SharePoint.Library.SPRequestInternalClass.UpdateRoleAssignment(String bstrUrl, Guid& pguidScopeId, Int32 lPrincipalID, Object& pvarArrIdRolesToAdd, Object& pvarArrIdRolesToRemove)
   at Microsoft.SharePoint.Library.SPRequest.UpdateRoleAssignment(String bstrUrl, Guid& pguidScopeId, Int32 lPrincipalID, Object& pvarArrIdRolesToAdd, Object& pvarArrIdRolesToRemove)
        SPSite Site = new SPSite("http://****");
        SPWeb web = Site.OpenWeb();
        SPList list = web.Lists["myList"]; 
        
        SPListItem item = list.Items[1]; // gets an item out of the list
        SPRoleDefinition definition = web.RoleDefinitions.GetByType(SPRoleType.Administrator);
 
        SPRoleAssignment assignment = new SPRoleAssignment(@"na\tester", "tester@test.com", null, null);
        assignment.RoleDefinitionBindings.Add(definition);
 
        if (!item.HasUniqueRoleAssignments)
            item.BreakRoleInheritance(false); // true if you want to copy permissions
 
        item.RoleAssignments.Add(assignment);
        item.Update();

Open in new window

0
 
liebrandCommented:
right after the SPWeb web = Site.OpenWeb() line put the following:
web.AllowUnsafeUpdates = true;

Open in new window

0
 
JordanBlacklerAuthor Commented:
I still get that error, but added me to the list with Full Control.
When i click the back button when i get the erroe  and run the code again, i don't get an error and it finally gives the user that i requested Full Control.

Any ideas?
here is my code.
protected void AddPermissions()
    {
        SPSite Site = new SPSite("http://****");
        SPWeb web = Site.OpenWeb();
        web.AllowUnsafeUpdates = true;
        SPList list = web.Lists["myList"];
        SPListItem item = list.GetItemById(Convert.ToInt32(lblUnique.Text));
                
        SPRoleDefinition definition = web.RoleDefinitions.GetByType(SPRoleType.Administrator);
 
        SPRoleAssignment assignment = new SPRoleAssignment(@"na\Tester", "Tester@test.com", null, null);
        assignment.RoleDefinitionBindings.Add(definition);
 
        if (!item.HasUniqueRoleAssignments)
            item.BreakRoleInheritance(false); // true if you want to copy permissions
 
        item.RoleAssignments.Add(assignment);
        item.Update();
    }
 
 
protected void btnSecondSave_Click(object sender, EventArgs e)
    {
           AddPermissions();
 
           SPSite site = SPControl.GetContextSite(Context);
           site.CatchAccessDeniedException = false;
           SPWeb subSite = site.AllWebs["mySite"];
 
           SPListCollection allSiteLists = subSite.Lists;
           SPList list = subSite.Lists["myList"];
 
           SPListItemCollection listItems = list.Items;
           SPListItem newItem = list.GetItemById(Convert.ToInt32(lblUnique.Text));
           subSite.AllowUnsafeUpdates = true;
 
           newItem["Status"] = lblStatus.Text;
           newItem["StartDate"] = txtStartDate.Text;
           //
           // 
           newItem.Update();
}

Open in new window

0
 
liebrandCommented:
Add the web.AllowUnsafeUpdates = true; after you break the inheritance.  I forgot to mention this -- the BreakRoleInheritance method reverts the AllowUnsafeUpdates back to false.
0
 
JordanBlacklerAuthor Commented:
yup, that did it. Thanks very much.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.