2011-06-20 100 views
2

我環顧四周,還沒有找到解決方案。我在這裏和那裏找到代碼片段來尋找解決方案。以編程方式列出項目多個用戶的權限(sharepoint)

我有一個稱爲「文檔協作」的文檔庫,字段爲「分配給」。這是一個人/組字段。這些人將能夠處理特定文檔(列表項權限)。現在,他們首先會擁有隱藏的權限(他們無法看到它),但是當添加到文檔中時,他們會看到它並能夠提供它,並且他們也會收到電子郵件通知。我附上了下面的完整代碼。

所以,我沒有得到任何錯誤,當我通過VS10調試。但它不會發送任何電子郵件或不設置權限。怎麼了?

using System; 
    using System.IO; 
    using System.Security.Permissions; 
    using Microsoft.SharePoint; 
    using Microsoft.SharePoint.Security; 
    using Microsoft.SharePoint.Utilities; 
    using Microsoft.SharePoint.Workflow; 

    namespace ARDT.Notifications 
    { 
     /// <summary> 
     /// List Item Events 
     /// </summary> 
     public class Notifications : SPItemEventReceiver 
     { 
      /// <summary> 
      /// An item was checked in 
      /// </summary> 
      public override void ItemCheckedIn(SPItemEventProperties properties) 
      { 
       SPSite site = new SPSite("http://sp2010dev/ardt"); 
       using (SPWeb web = site.OpenWeb()) 
       { 
        SPList list = web.Lists["Document Collaboration"]; 
        SPListItem listItem = properties.ListItem; 
        SPUser userName = null; 
        String toAddress = null; 

        //EMail initializations 
        bool appendHtmlTag = false; 
        bool htmlEncode = false; 
        string subject = "Subject"; 
        string message = "Message text"; 

        //get usernames 
        string[] userNameArray = listItem.Fields["Assigned to"].ToString().Split(';'); 

        for (int i = 0; i <= userNameArray.Length - 1; i++) 
        { 
         userName = web.AllUsers[userNameArray[i]]; 
         toAddress = userName.Email; 
         SPSecurity.RunWithElevatedPrivileges(delegate() 
         { 
          //EMAIL USER 
          bool result = SPUtility.SendEmail(web, appendHtmlTag, htmlEncode, toAddress, subject, message); 

          //PERMISSIONS 
          //remove permissions first 
          web.AllowUnsafeUpdates = true; 
          listItem.BreakRoleInheritance(false); 
          SPRoleAssignmentCollection raCollection = listItem.RoleAssignments; 
          //remove exisiting permissions one by one 
          for (int a = raCollection.Count - 1; i > -0; i--) 
          { 
           raCollection.Remove(a); 
          } 

          //grant permissions for specific list item 
          SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor); 
          SPRoleAssignment roleAssignment = new SPRoleAssignment(userName); 

          roleAssignment.RoleDefinitionBindings.Add(roleDefintion); 
          listItem.RoleAssignments.Add(roleAssignment); 
          listItem.Update(); 
         }); 
        } 
       } 
       base.ItemCheckedIn(properties); 
      } 

     } 
    } 

回答

5

nope,我犯了一個簡單的錯誤,把它放在檢查下而不是更新,還有一個解決方法,當它更新時多次運行該函數,只需在列表中創建一個名爲「updateContributors」的列,並且默認True值/是

下面的代碼/沒有時間來解釋,但相當評論說,運氣好:

using System; 
    using System.IO; 
    using System.Security.Permissions; 
    using Microsoft.SharePoint; 
    using Microsoft.SharePoint.Security; 
    using Microsoft.SharePoint.Utilities; 
    using Microsoft.SharePoint.Workflow; 

    //Debugging includes 
    using System.Diagnostics; 


    namespace ARDT.Notifications 
    { 
     /// <summary> 
     /// List Item Events 
     /// </summary> 
     public class Notifications : SPItemEventReceiver 
     { 
      /// <summary> 
      /// An item was updated 
      /// </summary> 
      public override void ItemUpdated(SPItemEventProperties properties) 
      { 
       if (properties.ListItem["updateContributors"].ToString().Equals("True")) 
       { 
        //work around so it goes through it only once instead of everytime the item is updated 
        properties.ListItem["updateContributors"] = "False"; 
        SPSite site = new SPSite("http://sp2010dev/ardt/"); 
        using (SPWeb web = site.OpenWeb()) 
        { 

         SPList list = web.Lists["Document Collaboration"]; 
         SPListItem listItem = properties.ListItem; 
         SPUser userName = null; 
         String toAddress = null; 

         //EMail initializations 
         bool appendHtmlTag = false; 
         bool htmlEncode = false; 
         string subject = "You have been assigned to a Document"; 
         string message = "Test Message"; 

         //get usernames 
         string tempFieldValue = listItem["Assigned To"].ToString(); 
         string[] userNameArray = listItem["Assigned To"].ToString().Split(';'); 

         //remove permissions first 
         web.AllowUnsafeUpdates = true; 
         listItem.BreakRoleInheritance(false); 
         SPRoleAssignmentCollection raCollection = listItem.RoleAssignments; 
         //remove exisiting permissions one by one 
         for (int a = raCollection.Count - 1; a >= 0; a--) 
         { 
          raCollection.Remove(a); 
         } 

         for (int i = 1; i < userNameArray.Length; i++) 
         { 
          tempFieldValue = userNameArray[i].Replace("#", ""); 
          userName = web.AllUsers[tempFieldValue]; 
          toAddress = userName.Email; 
          SPSecurity.RunWithElevatedPrivileges(delegate() 
          { 
           //EMAIL USER 
           bool result = SPUtility.SendEmail(web, appendHtmlTag, htmlEncode, toAddress, subject, message); 

           //PERMISSIONS        
           //grant permissions for specific list item 
           SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor); 
           SPRoleAssignment roleAssignment = new SPRoleAssignment(userName); 

           roleAssignment.RoleDefinitionBindings.Add(roleDefintion); 
           listItem.RoleAssignments.Add(roleAssignment); 
           listItem.Update(); 
          }); 
          i++; 
         } 

        } 
        //base.ItemUpdated(properties); 
        //after final update has been done return true 
        properties.ListItem["updateContributors"] = "True"; 
       } 
      } 



     } 

    } 
1

一個在你的代碼有問題 - 你創建當前執行上下文的SPWeb對象,但隨後嘗試使用SPSecurity.RunWithElevatedPrivileges發送郵件。您絕不應該使用一個帳戶打開網絡,然後在另一個帳戶中使用它。您必須在RunWithElevatedPrivileges區塊as it can be seen in this example重新創建上下文。

+0

沒了,我做了把它下的,而不是更新的檢查,也Theres一個簡單的錯誤在更新時多次運行該函數,只需在列表中創建一個名爲「updateContributors」的列,並將默認值True /是 – Shankeith

相關問題