Question

Un WebPart doit accéder à une liste SharePoint (mode de lecture). Si l'utilisateur est administrateur, il n'y a pas de problème (fonctionne comme le fait), mais si l'utilisateur n'a pas d'autorisations pour accéder, je dois utiliser la méthode "RunwithelevatedPrivileges".

Le problème est que cela semble que la requête ne renvoie pas les résultats corrects. Qu'est-ce qui me manque?

        SPList demoList = null;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            SPSite oSite = SPControl.GetContextSite(HttpContext.Current); // ADDED
            SPWeb oWeb = oSite.OpenWeb();                                 // ADDED
            demoList = oWeb.Lists["nameList"];
        });
        // demoList has 3 Elements (admin and no admin user) OK

        SPListItemCollection collListItems = null;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            SPQuery oQuery = new SPQuery() { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" };
            collListItems = demoList.GetItems(oQuery);
        });

        // 
        //IF ADMIN
        //collListItems.Count ==>3

        //IF NO ADMIN 
        //collListItems.Count ==>0
Était-ce utile?

La solution

Vous devez créer un nouvel objet avec des prières élevées.

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    SPSite oSite = new SPSite(SPContext.Current.Site.ID); 
    SPWeb oWeb = oSite.OpenWeb(SPContext.Current.Web.ID);                                 
    demoList = oWeb.Lists["nameList"];
});

En outre, vous devez éliminer les objets nouvellement créés et il n'y a pas besoin de deux délégués.

SPSecurity.RunWithElevatedPrivileges(delegate {
    using (SPSite oSite =new SPSite(SPContext.Current.Site.ID))
    using (SPWeb oWeb = oSite.OpenWeb()) {
        var demoList = oWeb.Lists["nameList"];
        SPQuery oQuery = new SPQuery
                            { Query = "<OrderBy><FieldRef Name='Date' Ascending='False' /></OrderBy>" };
        SPListItemCollection collListItems = demoList.GetItems(oQuery);

        //IF ADMIN
        //collListItems.Count ==>3

        //IF NO ADMIN 
        //collListItems.Count ==>0
    }
});

Autres conseils

Si vous créez le site et les objets Web (ou y accédez à partir du SPContext actuel) à l'extérieur du bloc élevé, ils auront les autorisations de l'utilisateur actuellement connecté. Ainsi, votre requête, même si elle est dans un bloc élevé, n'utilise pas d'autorisations élevées. Vous devez créer de nouveaux sites et objets Web à l'intérieur du bloc élevé, puis accéder à la liste, puis exécuter la requête pour obtenir les résultats attendus.

Voici une ressource qui explique davantage. Même si cela a été fait pour SharePoint 2007, cela s'applique à SharePoint 2010.

Commandes en cours d'exécution avec des privilèges élevés dans Windows SharePoint Services 3.0http://msdn.microsoft.com/en-us/library/bb466220(v=Office.12).aspx

Si vous souhaitez inclure une opération d'écriture dans la liste SharePoint, ajouter SPWeb.ValidateFormDigest() ou SPUtility.ValidateFormDigest() ligne avant la méthode RWEP.

SPUtility.ValidateFormDigest();
SPSecurity.RunWithElevatedPrivileges(delegate()
{

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top