Managing Tasks Permissions Programmatically within SharePoint using event reciever or using special permissions property


I was writing a workflow using SharePoint designer wherein at certain steps tasks were getting created and assigned to different user. But the problem with that was that any user having appropriate rights on the tasks list was able to edit the task.

Below are the two methods using which we can have only the assigned to user having the rights on that task.

It can be done using Event Receiver or within the SharePoint workflow using special permissions property.

public override void ItemAdded(SPItemEventProperties properties)

        {

                // Name of the List

            if (properties.ListTitle == “Tasks”)

            {     

                // Get the SPSite Object

                SPSite objSite = new SPSite(http://servername:portname”);       

                // Point to the top level web site within it

                SPWeb objWeb = objSite.OpenWeb();

                // get the task list item getting created

                SPListItem myListItem = properties.ListItem;       

 

                // get the id of the assigned to user

                // we want that only assigned to user should have full rights on that task

                string userAssignedTo=myListItem[“Assigned To”].ToString();

                int index = userAssignedTo.IndexOf(‘;’);

                int id = Int32.Parse(userAssignedTo.Substring(0, index));

                // get the SPUser from the id

                SPUser user = objWeb.SiteUsers.GetByID(id);                       

 

                // break the role inheritance

                myListItem.BreakRoleInheritance(false);

                // webroledefinitions – Full Right, Design, Contribute and Read

                SPRoleDefinitionCollection webroledefinitions = objWeb.RoleDefinitions;

                SPRoleAssignment roleassignment = new SPRoleAssignment(user);              

                roleassignment.RoleDefinitionBindings.Add(webroledefinitions[“Full Control”]);

                myListItem.RoleAssignments.Add(roleassignment);

                // give full control right to the assigned to user

                roleassignment.Update();                           

             

 

               }

            }

Or within workflow as

 

    // handler for create task activity

        private void createTask1_MethodInvoking(object sender, EventArgs e)

        {

            //Specify properties for the task

            createTask1.TaskProperties.AssignedTo = @”domainusername”;

            createTask1.TaskProperties.Title = @”Please complete the task”;

            createTask1.TaskProperties.Description = “This is sample SharePoint Task”;

            createTask1.TaskProperties.DueDate = DateTime.Now.AddDays(7);

            createTask1.TaskProperties.EmailBody = “This is the sample<b><i> email body </b></i>”;

            createTask1.TaskProperties.SendEmailNotification = true;

 

            // Define a HybridDictionary object

            HybridDictionary permsCollection = new HybridDictionary();

            // Give Administrator rights to the user to whom the task has been assigned

            permsCollection.Add(createTask1.TaskProperties.AssignedTo, SPRoleType.Administrator);

            // SpecialPermissions -the SpecialPermissions property  in your code will strip out all existing permissions inherited from

            // the parent list(Workflow Task List) and only adds permissions for each pair you added to the hashtable

            createTask1.SpecialPermissions = permsCollection;   

 

        }

 

 

That’s it ….

Create a custom content type to be used with CreateTaskWithContentType activity in SharePoint Workflow


Create a folder at C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATEFEATURES for e.g. MyCustomContentTask.

Now add three xml files over there

Name them as

· Feature.xml

· MyCustomContentType.xml

· MyCustomContentTypeColumns.xml

First define your custom content type as following (MyCustomContentType.xml)

Our custom content type would be including two custom columns i.e. one for FirstName and other for LastName.

<?xml version=1.0 encoding=utf-8?>

<Elements xmlns=http://schemas.microsoft.com/sharepoint/>

<ContentType ID=0x0108010011D80FDA18534a3f9A162A1F5D6187F0

Name=My Custom Content Type

Group=Custom Content Types

Description=Custom Content Type

Version=0

Hidden=FALSE>

<FieldRefs>

<FieldRef

ID={9A447D6C-5BB8-4890-80E5-056B60FF6462}

Name=_FirstName

/>

<FieldRef

ID={76CC8E55-59C9-40d6-B46B-A4C1D95B16CB}

Name=_LastName

/>

</FieldRefs>

<XmlDocuments>

<XmlDocument NamespaceURI=http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url>

<FormUrls xmlns=http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url>

<New></New>

<Display></Display>

<Edit></Edit>

</FormUrls>

</XmlDocument>

</XmlDocuments>

</ContentType>

</Elements>

ID- Id of the custom content type

0x0108010011D80FDA18534a3f9A162A1F5D6187F0

0x010801 –The id of the base content type the custom content type should derive from

http://msdn.microsoft.com/en-us/library/ms452896.aspx

Followed by 00.

And a new guid 11D80FDA18534a3f9A162A1F5D6187F0.

Name- Name of the custom content type.

Hidden – Whether or not the users should see the content type.

FieldRefs – Collection of column references. Can contain one or more FieldRef.

FieldRef- Define the fields.

Id – Give a new guid.

Name – Name of the field

XmlDocument – Here we could define our custom form that should open when users creates, edit  task or when the task is displayed.We can simply let it blank if we want to use the same forms that SharePoint uses for the default task.

Now to define the columns that we have just added we’ll put the following information in our MyCustomContentTypeColumns.xml file

For your custom columns (MyCustomContentTypeColumns.xml)

<?xml version=1.0 encoding=utf-8?>

<Elements xmlns=http://schemas.microsoft.com/sharepoint/>

<Field ID={9A447D6C-5BB8-4890-80E5-056B60FF6462}

Name=_ FirstName

DisplayName=First Name

Group=Custom Columns

Type=Note

NumLines=10

Required= TRUE>

</Field>

<Field ID={76CC8E55-59C9-40d6-B46B-A4C1D95B16CB}

Name=_ LastName

DisplayName= Last Name

Group=Custom Columns

Type= Note

NumLines=10

Required=TRUE>

</Field>

</Elements>

Here we have two field tags corresponding to the FieldRef field defined in MyCustomContentType.xml.

ID- It should the same as defined for Field Ref field

Name- Same as defined for Field Ref field.

Type – Note i.e. appear as multiline text box.

Required – To make the field mandatory.

For more info for Field

http://msdn.microsoft.com/en-us/library/ms437580.aspx

And for the Feature.xml

Id – Generate a new guid for the feature

Title – The name for the feature

ElementManifest- Defining the location of the above two files defining our custom content type.

<?xml version=1.0 encoding=utf-8?>

<Feature Id=64CB36F5-BF1A-470e-A27F-213A9F170DA4

Title=My Custom Feature

Description=Represents a custom content type

Version=12.0.0.0

Scope=Site

xmlns=http://schemas.microsoft.com/sharepoint/>

<ElementManifests>

<ElementManifest Location= MyCustomContentTypeColumns.xml />

<ElementManifest Location= MyCustomContentType.xml />

</ElementManifests>

<Properties>

<Property Key=Globallyavailable Value=TRUE />

</Properties>

</Feature>

Now install the feature and activate it using the stsadm tool

stsadm.exe -o installfeature -filename MyCustomContentTask Feature.xml

stsadm -o activatefeature -filename MyCustomContentTask Feature.xml -URL http://localhost:82

Now to use it

Go to your Lists à Settings àListSettings

Scroll down to find Add from existing site content types

Click on it and Select your new content type from Available Site Content Types.

That’s it..

Failed on Start (retrying) or Correlation Token in SharePoint Workflow


This error occurs mostly when the Correlation Token values has been not set properly for activities.

Correlation token– A correlation token is essentially a means of uniquely identifying each instance of a workflow, modification or task.

OnWorkflowActivated, OnWorkflowItemChanged,OnWorkflowItemDeleted, SetState, SendEmail and UpdateAllTasks these activities should be using same workflow token for e.g. workflowToken.

CreateTask, CreateTaskWithContentType,UpdateTask, DeleteTask, CompleteTask,RollbackTask, OnTaskChanged, OnTaskDeleted, OnTaskCreated these activites should be using same correlation token for e.g. taskToken.

EnableWorkflowModification, OnWorkflowModified should be sharing same correlation token for e.g. modificationToken.

Each distinct task or modification would be having it own distinct token.

SharePoint Designer Workflow not updating issue


I have developed certain workflows using SharePoint designer, everything was working fine. Than suddenly an issue started to show up i.e whenever i was making a modification in the workflow it was not getting reflected back on the site, until i found the solution for it.

http://b3no.wordpress.com/2008/09/09/workflow-not-updating-using-sharepoint-designer/

http://blogs.msdn.com/sharepointdesigner/archive/2007/03/27/tip-clearing-the-spd-workflow-assembly-cache.aspx

Bye…

Error: The form has been closed. This form cannot be opened. It is not workflow enabled. The specified form cannot be found when using InfoPath form in SharePoint Workflow.


These errors occur if the InfoPath form haven’t been published properly.

Always make sure that you have followed the below steps mentioned in the document while publishing the InfoPath form within SharePoint workflow

 https://nishantrana.me/wp-content/uploads/2009/02/errorininfopathform.doc

Bye…

 

The form template is trying to access files and settings on your computer. InfoPath cannot grant access to these files and settings because the form template is not fully trusted. For a form to run with full trust, it must be installed or digitally signed with a certificate.


It may be because the security level would be set as Full Trust, which requires the form to be digitally signed. Change the security level to Domain.

Go To Tools àForm Option àSecurity and Trust to change the security level.

Bye..