質問

このコードは、当社のサイトとサブサイトのTreeView(Webパーツ)を作成し、ユーザーがアクセスできない場合でも、管理者アカウントに対して完全に機能していますが、サイトやサブサイトを一覧表示します(彼はそうではない)。任意のグループのメンバー)とそれは想定していません。

私は何をしていますか?

SPSecurity.RunWithElevatedPrivilegesを使用する必要がありますか?

    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();
                }
            }
        }
    }
.

役に立ちましたか?

解決

コード内のDESUSERHAVEPERMISIONSは、昇格されたコンテキストをチェックします(したがって、現在のユーザーがアクセスできるかどうかをチェックしませんが、アプリプールアカウントが持つ場合)

このバージョンのメソッドを使用して、spcontext.cururent.web.currentUserのloginnameを関数に渡します。 http://msdn.microsoft.com/en-us/library/ms441848.aspx

so

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

あなたのWebオブジェクトのコースオフコードあなたのコードで少し下に戻る

ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top