工作流中任务权限控制问题

问题描述] 最近有客户问到一个问题,用SharePoint Designer 2007做的一个批准的工作流,发现只要有权限的用户都可以去执行分配(Assign to)给别人的任务,按理说应该是每个人只对分配给自己的任务有修改的权限,对别人的只有读的权限。

[研究过程]

1.对Sharepoint server 2007自带的"approval"模板 和 用sharepoint Designer 2007 做的approve测试,发现创建的任务都没有提供修改权限的接口。

2.想到是否可以针对“Task”这个列表再绑定一个工作流,每当批准的那个工作流产生一个任务到这个"Task"列表中,就自动启动这个工作流来修改任务的权限属性。但是经测试发现不行,原因是由于sharepoint 2007产生的任务虽然放在“Task”这个列表中,但是他不是一个listitem类,细心的话,你会在"site content types"里发现它的Parent是workflow task,而不是item.我们知道workflow 只能绑定在document和list item 上的。

3.再试着使用"create list item"这个操作代替"assign to-do item",这样就可以把上一个方法中提到的工作流用上了,但是发现"create list item" 是一个列表操作,用它创建一个item来表示一个任务的话,不能使工作流保持状态等待这个任务结束后再往下执行。

所以通过种种测试,结论是,不能通过再创工作流的办法来对task这个任务列表进行权限修改。

[解决方案]  最终我们只能回到使用"EventHandler"上来解决这个问题。

代码如下

using  System;
using  System.Collections.Generic;
using  System.Text;
using  Microsoft.SharePoint;
namespace  ItemAddedEventHandler
{
    
public class ItemAddedPermissionControl : SPItemEventReceiver
    
{
        
public override void ItemAdded (SPItemEventProperties properties)
        
{
            
//run the default event handlers on the item
            base.ItemAdded(properties);
                       
            
try
            
{
                    
using (SPSite site = new SPSite(properties.SiteId))
                    
{
                        
using (SPWeb web = site.OpenWeb(properties.RelativeWebUrl))
                        
{

                            
//call the function that changes the permissions on the list item. 
                            
//Do not use properties.ListItem since that will break impersonation!
                            SetOwnerAsOnlyEditor(web.Lists[properties.ListId].GetItemById(properties.ListItemId));
                        }

                    }

                

            }

            
catch (Exception ex)
            
{
             
            }

        }

        
private void SetOwnerAsOnlyEditor(SPListItem item)
        
{
            SPWeb myweb1 
= item.Web;
                        

            
////get the task owner from the item. 'Assigned To' is a built-in property, so it should be in all lists.
            string authorValue = item["Assigned To"].ToString();

            SPFieldUserValue authorUserValue 
= new SPFieldUserValue(myweb1, authorValue);

            SPUser authorUser 
= authorUserValue.User;

            
//break the security of the item from the list, but keep the permissions

            item.BreakRoleInheritance(
true);

            SPRoleAssignment roleassignment 
= new SPRoleAssignment(authorUser.LoginName, authorUser.Email, authorUser.Name, authorUser.Name);
            roleassignment.RoleDefinitionBindings.Add(myweb1.RoleDefinitions[
"Contribute"]);


            
foreach (SPRoleAssignment roleAssignment in item.RoleAssignments)
            
{
                
//delete the existing permissions
                roleAssignment.RoleDefinitionBindings.RemoveAll();
                
//add the reader permission

                
//change the permissions of everyone with access to this item so they are readers only
                roleAssignment.RoleDefinitionBindings.Add(myweb1.RoleDefinitions["Read"]);
                roleAssignment.Update();
                
//  item.Update();

            }

            item.RoleAssignments.Add(roleassignment);
            item.Update();

        }

        

    }

}

《如果你想知道如何一步步创建一个Event Handler Feature,请参见http://msdn2.microsoft.com/en-us/library/ms453149.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值