Domanda

Ho una richiesta del cliente per creare una serie di annunci basati su alcuni dati di un altro database. La maggior parte sembra abbastanza semplice, ma i nuovi elementi dovrebbero essere creati dall'utente (login) specificato nei dati di input. Avevo intenzione di aggiungere gli annunci utilizzando i servizi Web dell'elenco, ma di sicuro vorrei evitare di usare la rappresentazione per ottenere correttamente l'utente che crea. C'è un modo per assegnare l'utente corretto come creatore senza usare la rappresentazione?

È stato utile?

Soluzione

Questa potrebbe non essere la risposta che stai cercando, ma la rappresentazione è piuttosto semplice se hai codice in esecuzione nel GAC su un server SharePoint. Non hai bisogno di conoscere alcuna password che molti non capiscono, quindi continuerò supponendo che questa fosse la ragione per cui non volevi impersonare. Ecco come farlo.

È possibile connettersi a SharePoint utilizzando il costruttore tipico utilizzato per SPSite e trovare l'oggetto SPUser appropriato. Una volta fatto, puoi ottenere la proprietà UserToken per quel SPUser. Quindi dovrai utilizzare di nuovo il costruttore SPSite, ma usa il sovraccarico che fornisce SPUserToken. Quindi tutto ciò che fai in SharePoint verrà eseguito tramite la rappresentazione. Non è necessario eseguire privilegi elevati.

OK, ora che l'ho detto a parole, proverò a indovinare il codice. Dovrebbe essere qualcosa del tipo:

// Just determine the user token for a particular user
SPUserToken userToken = null;
using (SPSite tempSite = new SPSite("http://sharepointurl"))
{
    using (SPWeb tempWeb = tempSite.OpenWeb())
    {
        // I think this next line works, but I'm going from memory
        // I believe the user needs to have already logged into the site at least once
        SPUser user = tempWeb.AllUsers["username"];
        userToken = user.UserToken;
    }
}

// Now do whatever we want impersonating that user
using (SPSite site = new SPSite("http://sharepointurl", userToken))
{
    using (SPWeb web = site.OpenWeb())
    {
        // Do whatever you want here
    }
} 

Altri suggerimenti

Non penso che ci sia un metodo per archiviare questo.

Ma forse questa soluzione alternativa potrebbe essere d'aiuto. Devo ammettere che non l'ho mai provato, è solo un'idea di come potresti risolvere il tuo problema.

Potresti provare questo. Crea il nuovo annuncio con un utente amministratore o con RunWithElevatedPrivileges (). Dopodiché usa nuovamente il metodo RunWithElevatedPrivileges () e imposta " creato da " campo all'utente che dovrebbe essere il vero creatore dell'annuncio. In questo modo solo il " modificato da " il campo dovrebbe mostrare il "errato" utente.

So che questa non è una soluzione molto elegante ma potrebbe funzionare. ;)

Mi sono appena reso conto che il mio requisito era effettivamente quello di aggirare la pista di controllo in SharePoint, quindi spero sicuramente che non possa essere fatto :-)

Ho trovato un'altra soluzione: ho aggiunto un nuovo campo utente o gruppo all'elenco degli annunci e ho copiato l'accesso utente AD in questo campo. Qualsiasi rapporto o vista che in precedenza utilizzava il " creato da " Il campo ora dovrebbe usare il nuovo campo.

Che ne dici della situazione in cui un utente reale inserisce un nuovo elemento nell'elenco degli annunci? Ciò non aggiornerà il nuovo campo con l'utente che ha effettuato l'accesso!

Bene, l'unica soluzione che potrei trovare è quella di aggiungere un trigger ListItem Add nell'elenco. Quando viene aggiunto un nuovo elemento, controllo se il nuovo campo contiene un valore, quindi non aggiorno il nuovo campo con l'ID dell'utente che ha effettuato l'accesso. In questo modo il nuovo campo dovrebbe sempre contenere un ID utente valido.

So che questa non è una soluzione elegante, ma per ora è la migliore che mi venga in mente.

Come accennato nei commenti sul codice della risposta, se l'utente non ha visitato il sito almeno una volta, non ci sono metadati dell'utente da cui derivare un token utente corretto.

Con SharePoint 2010, è possibile simulare una visita dell'utente, con il metodo GuaranteUser disponibile dalla classe SPWeb (questo frammento crea l'utente e ne modifica leggermente il profilo):

SPUser alice = web.EnsureUser(@"MYDOMAIN\alice");
SPList userInfo = web.SiteUserInfoList; //metadata storage of user info

SPListItem item = userInfo.GetItemById(alice.ID);
item["About Me"] = "I am Alice from Mel's Diner";
item.Update();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top