sullisnyc44
asked on
event receiver errors to set list item permissions
I am trying to compile this code and I'm getting 2 errors/warnings:
1 - the variable 'ex' is declared but never used
2-access to member 'microsoft.sharepoint.spit emeventrec eiver.item adding(mic rosoft.spi temeventpr operties)' through a 'base' keyword from an anonymous method or iterator results in unverifiable code. consider moving the access to a helper method on the containing type.
1 - the variable 'ex' is declared but never used
2-access to member 'microsoft.sharepoint.spit
using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
namespace DemoAttendanceEventReceiver.EventReceiver1
{
///<summary>
///list item events
///</summary>
public class EventReceiver1 : SPItemEventReceiver
{
public override void ItemUpdating(SPItemEventProperties properties)
{
try
{
//stop other events from firing while this method executes
this.DisableEventFiring();
//add code here
//{
base.ItemUpdating(properties);
//}
///<summary>
///an item being addded
///</summary>
// public override void ItemAdded(SPItemEventProperties properties)
// {
using (SPWeb contextWeb = properties.OpenWeb())
{
SPUser me = contextWeb.CurrentUser;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(properties.SiteId))
{
SPWeb elevatedWeb = elevatedSite.OpenWeb(properties.RelativeWebUrl);
base.ItemAdding(properties);
properties.ListItem.BreakRoleInheritance(false);
SPRoleDefinition def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
SPRoleAssignment role = new SPRoleAssignment(me.LoginName, me.Email, me.Name, me.Notes);
role.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role);
SPUser requestedUser = elevatedWeb.SiteUsers[properties.ListItem["Requested By"].ToString()];
SPRoleAssignment role2 = new SPRoleAssignment(requestedUser);
def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
role2.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role2);
SPUser authorizedBy = elevatedWeb.SiteUsers[properties.ListItem["Authorized By"].ToString()];
SPRoleAssignment role3 = new SPRoleAssignment(authorizedBy);
def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
role3.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role3);
}
});
}
}
catch (Exception ex)
{ }
finally
{//re-enable event firing
this.EnableEventFiring();
}
}
}
}
Hello again, for your 2nd warning (or first) you should use your ex variable:
here is an exemple, I write the error in the sharepoint logs files (because it is a sharepoint event and not a webpart):
The logs can be found in the folder:
HardDisk:\Program files\Common files\microsoft shared\web server extensions\12\logs
In french, the folder Common files is called "fichiers communs", maybe you will find another name if you don't work with the english version of sharepoint
here is an exemple, I write the error in the sharepoint logs files (because it is a sharepoint event and not a webpart):
catch (Exception ex)
{
Microsoft.Office.Server.Diagnostics.PortalLog.LogString("Une erreur est survenue. Source : {0}, message : {1}", "DemoAttendanceEventReceiver.EventReceiver1.EventReceiver1", ex.ToString();
}
The logs can be found in the folder:
HardDisk:\Program files\Common files\microsoft shared\web server extensions\12\logs
In french, the folder Common files is called "fichiers communs", maybe you will find another name if you don't work with the english version of sharepoint
ASKER
thanks so much.
now I'm getting this error:
Error 1 The type or namespace name 'Office' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) C:\temp\DemoAttendanceEven tReceiver\ DemoAttend anceEventR eceiver\Cl ass1.cs 64 30 DemoAttendanceEventReceive r
I think my VS environment is lacking the proper sharepoint setup.
I cannot install the sharepont sdk - I keep getting an error because I'm running an x64 environment/server
now I'm getting this error:
Error 1 The type or namespace name 'Office' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) C:\temp\DemoAttendanceEven
I think my VS environment is lacking the proper sharepoint setup.
I cannot install the sharepont sdk - I keep getting an error because I'm running an x64 environment/server
Hello,
Visual Studio does not add sharepoint's references in projects by default, you must manually add this one:
right click on reference, and choose Microsoft.Office.Server (or find it in the computer where sharepoint is installed:
"C:\program files\common files\microsoft shared\web server extensions\12\isapi\micros oft.office .server.dl l"
Visual Studio does not add sharepoint's references in projects by default, you must manually add this one:
right click on reference, and choose Microsoft.Office.Server (or find it in the computer where sharepoint is installed:
"C:\program files\common files\microsoft shared\web server extensions\12\isapi\micros
ASKER
ok. but shouldn't I be able to create a custom workflow using visual studio?
I do not have any of the sharepoint content specific project types listed when I open visual studio.
I do not have any of the sharepoint content specific project types listed when I open visual studio.
ASKER
oops - that was an answer to a different question
ASKER
Thanks so much - that seems to have rebuilt ok.
is applying [Full Control] to this item what I should be doing? Should it be a lesser permission level? Just to edit or something? Just curious
Also I need to apply item permissions to a group I created on the site called "Attendance Managers" they need to be able to see everything.
Once I have this built, I will need to deploy it (GAC the dll, correct?) I would appreciate some guidance as well.
I will repost my code:
is applying [Full Control] to this item what I should be doing? Should it be a lesser permission level? Just to edit or something? Just curious
Also I need to apply item permissions to a group I created on the site called "Attendance Managers" they need to be able to see everything.
Once I have this built, I will need to deploy it (GAC the dll, correct?) I would appreciate some guidance as well.
I will repost my code:
using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
namespace DemoAttendanceEventReceiver.EventReceiver1
{
///<summary>
///list item events
///</summary>
public class EventReceiver1 : SPItemEventReceiver
{
public override void ItemUpdating(SPItemEventProperties properties)
{
try
{
//stop other events from firing while this method executes
this.DisableEventFiring();
//add code here
//{
base.ItemUpdating(properties);
//}
///<summary>
///an item being addded
///</summary>
// public override void ItemAdded(SPItemEventProperties properties)
// {
using (SPWeb contextWeb = properties.OpenWeb())
{
SPUser me = contextWeb.CurrentUser;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(properties.SiteId))
{
SPWeb elevatedWeb = elevatedSite.OpenWeb(properties.RelativeWebUrl);
properties.ListItem.BreakRoleInheritance(false);
SPRoleDefinition def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
SPRoleAssignment role = new SPRoleAssignment(me.LoginName, me.Email, me.Name, me.Notes);
role.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role);
SPUser requestedUser = elevatedWeb.SiteUsers[properties.ListItem["Requested By"].ToString()];
SPRoleAssignment role2 = new SPRoleAssignment(requestedUser);
def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
role2.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role2);
SPUser authorizedBy = elevatedWeb.SiteUsers[properties.ListItem["Authorized By"].ToString()];
SPRoleAssignment role3 = new SPRoleAssignment(authorizedBy);
def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
role3.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role3);
}
});
}
}
catch (Exception ex)
{
Microsoft.Office.Server.Diagnostics.PortalLog.LogString("An error has occurred. Source : {0}, message : {1}", "DemoAttendanceEventReceiver.EventReceiver1.EventReceiver1", ex.ToString());
}
finally
{//re-enable event firing
this.EnableEventFiring();
}
}
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
how do I set permissions for the group 'Attendance Managers'? And I think I want to set requester to read once it's submitted, authorized by to edit and the group to full control.
here is my updated code:
here is my updated code:
using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
namespace DemoAttendanceEventReceiver.EventReceiver1
{
///<summary>
///list item events
///</summary>
public class EventReceiver1 : SPItemEventReceiver
{
public override void ItemUpdating(SPItemEventProperties properties)
{
try
{
//stop other events from firing while this method executes
this.DisableEventFiring();
//add code here
//{
base.ItemUpdating(properties);
//}
///<summary>
///an item being addded
///</summary>
// public override void ItemAdded(SPItemEventProperties properties)
// {
using (SPWeb contextWeb = properties.OpenWeb())
{
SPUser me = contextWeb.CurrentUser;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(properties.SiteId))
{
SPWeb elevatedWeb = elevatedSite.OpenWeb(properties.RelativeWebUrl);
if(!properties.ListItem.HasUniqueRoleAssignments)
//otherwise you will get an exception. (you can resetroleinheritance for example)
properties.ListItem.BreakRoleInheritance(false);
SPSite elevatedSite = new SPSite(sharepointItem.ParentList.parentWeb.Site.ID);
SPWeb elevatedWeb = elevatedSite.OpenWeb(sharepointItem.ParentList.ParentWeb.ID);
SPList elevatedList = elevatedWeb.Lists[parentList.ID];
//get the file with the privileged permissions
SPListItem elevatedItem = elevatedList.Items.GetItemById(properties.ListItem.ID);
/* and then do your elevated action */
SPRoleDefinition def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
SPRoleAssignment role = new SPRoleAssignment(me.LoginName, me.Email, me.Name, me.Notes);
role.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role);
SPUser requestedUser = elevatedWeb.SiteUsers[properties.ListItem["Requested By"].ToString()];
SPRoleAssignment role2 = new SPRoleAssignment(requestedUser);
def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
role2.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role2);
SPUser authorizedBy = elevatedWeb.SiteUsers[properties.ListItem["Authorized By"].ToString()];
SPRoleAssignment role3 = new SPRoleAssignment(authorizedBy);
def = elevatedWeb.RoleDefinitions["FULL CONTROL"];
role3.RoleDefinitionBindings.Add(def);
properties.ListItem.RoleAssignments.Add(role3);
}
});
}
}
catch (Exception ex)
{
Microsoft.Office.Server.Diagnostics.PortalLog.LogString("An error has occurred. Source : {0}, message : {1}", "DemoAttendanceEventReceiver.EventReceiver1.EventReceiver1", ex.ToString());
}
finally
{//re-enable event firing
this.EnableEventFiring();
}
}
}
}
ASKER
ALSO - my other issue is how do I create a unique GUID when I can't install the sharepoint project sdk extensions on a x64 machine?
ASKER
FYI You can use this http://sptemplateland.codeplex.com/
VS2005 didn’t come bundled with SP templates
VS2005 didn’t come bundled with SP templates
this has nothing to do with your code, you already wrote base.ItemUpdating(properti
If you where customizing the ItemAdding (and all other -ing events) event receiver, you should not call the base.Method in the SPSecurity.RunWithElevated