Lister les permissions de plusieurs utilisateurs par programme (sharepoint)

J’ai regardé autour de moi et je n’ai pas encore trouvé de solution. J’ai ramassé des extraits de code ici et là pour trouver une solution.

J’ai une bibliothèque de documents appelée “Collaboration de documents” avec le champ “Atsortingbué à”. C’est un champ Personnes / Groupes. Ces personnes pourront travailler sur un document spécifique (autorisation de liste d’éléments). Maintenant, au début, ils auront des permissions cachées (ils ne peuvent pas le voir), mais une fois ajoutés à la doc, ils le verront et pourront le consortingbuer, ils recevront également une notification par email. J’ai joint le code complet ci-dessous.

Ainsi, je ne reçois aucune erreur lorsque je passe par le débogage de VS10. Mais il n’envoie aucun courrier électronique ou ne définit pas les permissions. Qu’est-ce qui ne va pas?

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 { ///  /// List Item Events ///  public class Notifications : SPItemEventReceiver { ///  /// An item was checked in ///  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; Ssortingng toAddress = null; //EMail initializations bool appendHtmlTag = false; bool htmlEncode = false; ssortingng subject = "Subject"; ssortingng message = "Message text"; //get usernames ssortingng[] userNameArray = listItem.Fields["Assigned to"].ToSsortingng().Split(';'); for (int i = 0; i  -0; i--) { raCollection.Remove(a); } //grant permissions for specific list item SPRoleDefinition roleDefintion = web.RoleDefinitions.GetByType(SPRoleType.Consortingbutor); SPRoleAssignment roleAssignment = new SPRoleAssignment(userName); roleAssignment.RoleDefinitionBindings.Add(roleDefintion); listItem.RoleAssignments.Add(roleAssignment); listItem.Update(); }); } } base.ItemCheckedIn(properties); } } } 

Nope, j’ai fait la simple erreur de le mettre sous checked au lieu de mis à jour, il y a aussi une solution de contournement pour la fonction exécutée plusieurs fois lors de la mise à jour, créez simplement une colonne appelée “updateConsortingbutors” dans votre liste et la valeur par défaut True / Yes

Voici le code / pas le temps d’expliquer, mais jolie commenté, bonne chance:

  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 { ///  /// List Item Events ///  public class Notifications : SPItemEventReceiver { ///  /// An item was updated ///  public override void ItemUpdated(SPItemEventProperties properties) { if (properties.ListItem["updateConsortingbutors"].ToSsortingng().Equals("True")) { //work around so it goes through it only once instead of everytime the item is updated properties.ListItem["updateConsortingbutors"] = "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; Ssortingng toAddress = null; //EMail initializations bool appendHtmlTag = false; bool htmlEncode = false; ssortingng subject = "You have been assigned to a Document"; ssortingng message = "Test Message"; //get usernames ssortingng tempFieldValue = listItem["Assigned To"].ToSsortingng(); ssortingng[] userNameArray = listItem["Assigned To"].ToSsortingng().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"; } } } } 

L’un des problèmes que vous rencontrez dans votre code – vous créez l’object SPWeb dans le contexte d’exécution actuel, mais essayez ensuite d’envoyer un courrier à l’aide de SPSecurity.RunWithElevatedPrivileges . Vous ne devriez jamais ouvrir le Web avec un compte, puis l’utiliser dans un autre. Vous devez recréer le contexte dans le bloc RunWithElevatedPrivileges tel qu’il peut être vu dans cet exemple .