2011-06-20 14 views
2

私は見て回って解決策をまだ見つけていません。解決策を見つけるためにコードスニペットをこことそこに取りました。リストアイテム複数のユーザーのアクセス許可をプログラムで(Sharepoint)

フィールド「割り当て先」に「ドキュメント共同作業」というDoc Libraryがあります。これは[People/Groups]フィールドです。これらの人々は、特定の文書(リスト項目の許可)に取り組むことができます。今では、最初は隠されたアクセス権を持っていますが、ドキュメントに追加すると、それを見て貢献することができますし、電子メール通知も受け取ります。私は以下の完全なコードを添付しました。

私は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

いいえ、私はそれをチェックするのではなく、更新の代わりにチェックを入れました。また、更新時に複数回実行される関数の回避策もあります。リスト内の "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を使用してメールを送信してみてください。 1つのアカウントでWebを開いてから、別のアカウントでWebを使用しないでください。 RunWithElevatedPrivilegesブロックas it can be seen in this exampleにコンテキストを再作成する必要があります。

+0

いや、私はまた、代わりに、更新のチェックインさtheresの下に置くの単純なミスを犯しました更新するときに関数が複数回実行されるのを回避するには、リスト内の "updateContributors"という列を作成し、デフォルト値のTrue /はい – Shankeith

関連する問題