Per necessitudini varie, ho sviluppato questo semplice event handler che non fa altro che settare i permessi "Full Control" all'utente che ha creato un nuovo item nella lista in cui l'handler viene registrato.

using System;

using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;

namespace Peppe.Sharepoint.Handlers
{
public class SetFullControlToAuthor : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWeb web = properties.OpenWeb();
using(web)
{
SPListItem item = properties.ListItem;

SPRoleDefinition fullControl = web.RoleDefinitions["Full Control"];
SPUser author = web.Users.GetByID(properties.CurrentUserId);
SPRoleAssignment assignment = new SPRoleAssignment(author);
assignment.RoleDefinitionBindings.Add(fullControl);
item.BreakRoleInheritance(false);
item.RoleAssignments.Add(assignment);
item.Update();
}
});
}
}
}

E' molto semplice. Utilizza le nuove classi di WSS 3.0, SPRoleDefinition e SPRoleAssignment, per assegnare permessi ad utenti su singoli oggetti di sharepoint. Volendo può essere esteso per prelevare informazioni da un campo di tipo User o UserMulti, con la possibilità di inserire anche gruppi del sito Sharepoint e non solamente utenti.


TAGS: [Sharepoint] [WSS 3.0] [Event Handler]
Commenti(10) - Posted @ 7/10/2007 10:09:24 PM - Categoria: Sharepoint - Permalink - Share on twitter | facebook


COMMENTI
Autore: Gigi - scritto il 7/12/2007 4:27:24 PM
Ciao, ho provato il codice che hai postato ma mi da eccezione (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) nel momento in cui viene eseguita l'istruzione item.BreakRoleInheritance(false);

Come mai?

P.S.:L'utente che esegue l'inserimento dell'item nella lista non ha "full control" ovviamente.

Autore: Peppe - scritto il 7/12/2007 4:40:17 PM
perchè non avevo ancora scoperto questo:
http://www.peppedotnet.it/Blog/HowToUseRunWithElevatedPrivilegesMethod.aspx

Autore: Gigi - scritto il 7/12/2007 5:40:06 PM
Si infatti avevo trovato anche questa post che spiega come usare la RunWithElevatedPrivileges
http://daniellarson.spaces.live.com/blog/cns!D3543C5837291E93!946.entry

Grazie

Autore: Alessandra - scritto il 8/6/2007 9:25:22 AM
e se io li dovessi togliere i permessi ad un utente?

Autore: Peppe - scritto il 8/6/2007 11:05:46 AM
Ciao alessandra !
Ti ho risposto anche nel newsgroup...

for (int i = 0; i < item.RoleAssignments.Count; i++)
{
SPRoleAssignment a = item.RoleAssignments[i];
SPUser user = a as SPUser;
SPGroup group = a as SPGroup;
if (user != null)
{
//ho un utente..
item.RoleAssignments.Remove(a);
}
if (group != null)
{
//ho un gruppo
item.RoleAssignments.Remove(a);
}
}

Autore: Alessandra - scritto il 8/6/2007 4:47:45 PM
Errore 1 Impossibile convertire il tipo
'Microsoft.SharePoint.SPRoleAssignment' in
'Microsoft.SharePoint.SPUser' tramite una conversione incorporata

Ciao ti ringrazio molto ma mi da questo errore.
come posso risolverlo?

Autore: Peppe - scritto il 8/7/2007 11:29:41 AM
scusa, hai ragione. dovrebbe essere:

SPUser user = a.Member as SPUser;
SPGroup group = a.Member as SPGroup;

Autore: Umberto - scritto il 2/16/2009 6:37:10 PM
Ciao Peppe,
come dice anche l'articolo che ha postato in questo thread Gigi (http://daniellarson.spaces.live.com/blog/cns!D3543C5837291E93!946.entry
) se voglio assegnare delle autorizzazioni devo "impersonarmi" facendo una new Site(). Ho utilizzato questo metodo con una lista e non ho avuto problemi. Se applico questo sistema ad una document library ho un grosso problema.
Ecco un parte di codice:
public override void ItemAdded(SPItemEventProperties properties)
{
Guid listID = properties.ListId;
Guid itemID = properties.ListItem.ID;
Guid itemGUID = properties.ListItem.UniqueId;
using (SPWeb web = properties.OpenWeb())
{
siteID = web.Site.ID;
webID = web.ID;
}
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(siteID))
{
using (SPWeb web = site.OpenWeb(webID))
{
SPList list = (SPList)web.Lists[listID];
SPListItem addedItem = list.GetItemByUniqueId(itemGUID);
// a questo punto cambio le auth a addedItem
}}}}

Il problema è che la lista che leggo alla riga "SPList list = (SPList)web.Lists[listID]" non contiene ancora l'elemento che sto aggiungendo e quindi sulla riga successiva ho un errore. Ho provato a spostare il tutto sull'evento ItemUpdated ma, ancora più strano, non trova comunque l'elemento (che properties.ListItem.UniqueId indentifica con un guid ben preciso!).
Se hai qualche idea....

Autore: Peppe - scritto il 2/17/2009 8:27:20 PM
Ciao Umberto.
Quello che mi scrivi è molto strano, perchè gestendo l'evento ItemAdded è sottinteso che l'elemento sia stato già creato, sopratutto perchè all'interno delle altre liste mi dici che funziona.
Io proverei a chiamare il metodo GetItemById(), passando l'id dell'elemento (che recuperi da properties.ListItemID), giusto per vedere cosa accade...

Autore: Umberto - scritto il 2/19/2009 10:08:04 AM
Ciao Peppe,
ho scoperto che non funziona perchè l'evento AddItem scatta dopo l'upload del file ma prima di aver inserito le proprietà collegate. In quel momento l'item è in stato di "check out" (indipendentemente se sulla doc lib è attiva l'estrazione automatica). In questo stato l'"impersonamento" non funziona perchè solo l'utente che ha estratto l'item può accedervi (neanche l'utente di sistema vede l'item).
Sull'evento ItemUpdated (che scatta dopo l'inserimento delle proprietà) invece in generale funziona. C'è un problema simile su questo evento se decido di caricare il file ma poi rinuncio all'inserimento delle proprietà.

INSERISCI UN COMMENTO

Nome *
Indirizzo e-mail
(non verrà pubblicato)
Commento *