04/04/2007

Un Webpart qui affiche la liste des membres et la présence LCS/MOCS

Voici le Render d'une Webpart qui affiche la liste des utilisateurs du site dans lequel elle est ajoutée. Jusque là rien d’extraordinaire, d’autant que MOSS le fait déjà tout seul, alors pourquoi une webpart ? J’avais besoin d’afficher dans cette liste d’utilisateurs leur information de présence et la possibilité de déclencher une communication instantanée.

Premier problème : Comment activer la fonctionnalité de présence, et de messagerie instantanée ? Un petit coup de reverse engineering, m'a permis de trouver la fonction à utiliser qui se trouve dans le fichier C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\1036 \INIT.JS sous le nom IMNRC.
Deuxième problème : Où trouver l’adresse SIP des personnes. Elle est disponible uniquement dans MOSS et se trouve dans le UserProfile sous le nom
SPS-SipAddress.
Troisième problème : Ne pas oublier que l’accès aux APIs qui manipule les groupes et les utilisateurs demandent des privilèges élevés. Donc RunWithElevatedPrivileges obligatoire, sous peine d’avoir une Webpart utile uniquement pour l’administrateur.



protected override void Render(HtmlTextWriter _output)

{

SPSecurity.RunWithElevatedPrivileges(delegate()

{

string UserName;

string UserHref;

string sSIP;

string sEmail;

// on ne peut pas utiliser le contexte de la webpart, car il est créé dans le contexte de securité de l'utilisateur de la webpart

// hors ici on va avoir besoin d'un context de securite de niveau SHAREPOINT\system, pour utilisée la collection des Users du web.

// il faut donc recréer un Site et un Web dans le bon contexte de securité.

using (SPSite mySite = new SPSite(this.Page.Request.Url.ToString()))

{

ServerContext context = ServerContext.GetContext(mySite);

using (SPWeb myWeb = mySite.OpenWeb())

{

foreach (SPGroup curGroup in myWeb.Groups)

{

_output.Write("<b>{0}</b><br/>", curGroup.Name);

foreach (SPUser curUser in curGroup.Users)

{

if (curUser.Name != "")

UserName = curUser.Name;

else

UserName = curUser.LoginName;

sSIP = curUser.Email;

sEmail = curUser.Email;


// Les informations sur l'adresse sip sont dans le userprofile qui est

// spécifique à MOSS

UserProfileManager profileManager = new UserProfileManager(context);

if (profileManager.UserExists(curUser.LoginName) == true)

{

UserProfile user = profileManager.GetUserProfile(curUser.RawSid);

if (user != null)

{

// Si l'adresse sip n'est pas renseignée dans le profil.

// La clef SPS-SipAdress n'est pas dans la liste des propertys

// Une instance de UserProfileValueCollection avec une value = null

// est retournée.


UserProfileValueCollection obj = user["SPS-SipAddress"];

if (obj.Value == null)

sSIP = erreur_pas@adresse.sip;

else

sSIP = obj.ToString();

}

}

// image où sera ajouté le menu

_output.Write("<span>");

_output.Write(" <img border=\"0\" height=12 width=12 src=\"/_layouts/images/imnhdr.gif\" onload=\"IMNRC('{0}')\" name=\"imnmark\" ShowOfflinePawn=1 id=\"{1},type=smtp\"/> ", sSIP, sEmail);

_output.Write("</span>");


// HREF vers le site

UserHref = myWeb.Url.ToString() + @"/_layouts/"

+ myWeb.Language.ToString()

+ @"/userdisp.aspx?ID="

+ curUser.ID.ToString();

_output.Write("<a href='{0}'>{1}</a><br/>", UserHref, UserName);

}

}

}

}

}); // SPSecurity.RunWithElevatedPrivileges

}

}




1 commentaire:

Fred Berton a dit…

Il y a un petit bug dans le code.
En l'occurrence le problème viens de sEmail, qui peut être vide si votre utilisateur n'a pas d'Email. Hors, il faut un ID pour que la présence marche. Donc remplacer sEmail par curUser.ID.ToString().
Désolé... (et merci Sylvain, pour le bug)