On va voir ici comment rechercher un utilisateur et assigner à cet utilisateur des rôles pour un document donné.

Voici le code en question, qui serait expliqué plus bas :

SPSite spSite = SPControl.GetContextSite(Context);
using (SPWeb spWeb = spSite.RootWeb)
{
   SPFile spFile = spWeb.GetFile("Documents/Proposal for my company.doc");
   SPListItem spListItem = spFile.Item;
   bool reachMaxCount;
   IList<SPPrincipalInfo> principalInfos = SPUtility.SearchPrincipals(spWeb, "cédric", SPPrincipalType.All, SPPrincipalSource.All, null, 100, out reachMaxCount);
   if (principalInfos.Count == 1)
   {
       SPPrincipalInfo spPrincipalInfo = principalInfos0;
       string loginName = spPrincipalInfo.LoginName;
       string email = spPrincipalInfo.Email;
       string name = spPrincipalInfo.DisplayName;
       string notes = string.Empty;
       SPRoleAssignment roleAssignment = new SPRoleAssignment(loginName, email, name, notes);
       SPRoleDefinition roleDefinition1 = spWeb.RoleDefinitions.GetByType(SPRoleType.Contributor);
       SPRoleDefinition roleDefinition2 = spWeb.RoleDefinitions.GetByType(SPRoleType.WebDesigner);
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition1);
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition2);
       if (!spListItem.HasUniqueRoleAssignments)
       {
           spListItem.BreakRoleInheritance(true);
       }
       spListItem.RoleAssignments.Add(roleAssignment);
       spListItem.Update();
    }
}

On fait attention à ne pas gaspiller les ressources :

using (SPWeb spWeb = spSite.RootWeb)

Voir à ce sujet http://msdn2.microsoft.com/en-us/library/ms778813.aspx

La recherche se fait par SPUtility.SearchPrincipals :

   IList<SPPrincipalInfo> principalInfos = SPUtility.SearchPrincipals(spWeb, "cédric", SPPrincipalType.All, SPPrincipalSource.All, null, 100, out reachMaxCount);

Cette méthode n'est pas (encore) documentée dans les MSDN.

  • SPWeb :
  • input

On recherche ici un utilisateur ou un groupe "cédric". Une recherche avec "a" aurait retourné tous les principals contenant la lettre "a".

SearchPrincipals est notamment utilisé par la fenêtre de recherche d'utilisateurs de sharepoint 2007.

  • SPPrincipalType

On a choisi ici de rechercher tous les types de principal mais on aurait pu se limiter aux utilisateurs par exemple (SPPrincipalType.User)

  • SPPrincipalSource

On utilise ici toutes les sources possibles mais on aurait pu se limiter aux utilisateurs Windows du domaine (SPPrincipalSource.Windows) ou à un membership provider (MembershipProvider) par exemple.

Un membership provider permet de mettre en place une authentification qui ne repose pas sur l'authentification windows mais sur des utilisateurs stockés en base de données par exemple). Voir à ce sujet l'article de Sahil Malik : Enabling Custom Authentication for SharePoint 2007

Le reste du code est déjà plus classique et est expliqué par exemple à http://www.sharepointblogs.com/ssa/archive/2006/11/04/15719.aspx