Pregunta

Este código crea una vista de árbol (en una parte web) de nuestros sitios y subsitentes y funciona perfectamente para la cuenta de administrador, pero no para un usuario normal, enumere los sitios y los subsitios, incluso si el usuario no tiene acceso (no esun miembro de cualquier grupo) y no se supone que.

¿Qué estoy haciendo mal?

¿Estoy obligado a usar SPSECURITY.RUNWITHELEVATEDPRIVITIONGES?

    protected override void CreateChildControls()
    {
        TreeView listeTreeView = new TreeView();
        listeTreeView.ID = "farmHierarchyViewer";
        listeTreeView.ShowLines = true;
        listeTreeView.EnableViewState = true;
        this.Controls.Add(listeTreeView);

        TreeNode node;
        listeTreeView.Nodes.Clear();

        SPWebApplication currentWebApplication = SPContext.Current.Site.WebApplication;
        SPSiteCollection collSites = currentWebApplication.Sites;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            foreach (SPSite site in collSites)
            {
                site.CatchAccessDeniedException = false;

                // Check if site collection != Mysite Host (54) et Mysite (21) and user access
                if (site.RootWeb.WebTemplateId != 54 && site.RootWeb.WebTemplateId != 21
                    && site.RootWeb.DoesUserHavePermissions(SPBasePermissions.Open))
                {
                    try
                    {
                        node = new TreeNode();
                        TreeNode siteNode = node;
                        node = new TreeNode(site.RootWeb.Title, null, null, site.Url, "_self");
                        listeTreeView.Nodes.Add(node);
                        TreeNode parentNode = node;

                        foreach (SPWeb childWeb in site.RootWeb.Webs)
                        {
                            try
                            {
                                addWebs(childWeb, parentNode);
                            }
                            finally
                            {
                                childWeb.Dispose();
                            }
                        }
                        site.CatchAccessDeniedException = false;
                    }
                    finally
                    {
                        site.Dispose();
                    }
                }
            }
        });

        listeTreeView.CollapseAll();
    }

    void addWebs(SPWeb web, TreeNode parentNode)
    {
        // Check if site != Blog (9), != Search Center (50) and user access
        if (web.WebTemplateId != 50 &&
            web.DoesUserHavePermissions(web.CurrentUser.ToString(), SPBasePermissions.Open))
        {
            TreeNode node;
            node = new TreeNode(web.Title, null, null, web.Url, "_self");
            parentNode.ChildNodes.Add(node);
            parentNode = node;

            foreach (SPWeb childWeb in web.Webs)
            {
                try
                {
                    addWebs(childWeb, parentNode);
                }
                finally
                {
                    childWeb.Dispose();
                }
            }
        }
    }

¿Fue útil?

Solución

DiceUSUSERHABEPERMISSIONSIONSIONES En su código hará que la verificación en el contexto elevado (por lo tanto, no verifique si el usuario actual tiene acceso, pero si la cuenta de la Pool de la aplicación tiene)

Use esta versión del método en su lugar, pasando en el nombre de inicio de sesión de SPCONTEXT.CURRENT.WEB.CURRENTUSER a la función: http://msdn.microsoft.com/en-us/library/ms441848.aspx

SO

site.RootWeb.DoesUserHavePermissions(SPContext.Current.Web.CurrentUser.LoginName, SPBasePermissions.Open)

El mismo curso de descuento en sus objetos web un poco más abajo en su código

Licenciado bajo: CC-BY-SA con atribución
scroll top