1

次のコードを使用して、Web アプリケーション サイト コレクション内のすべての「お知らせ」リストを取得しています。

残念ながら、現在のユーザーがそのサイトへのアクセス許可を持っていない場合があり、try ブロック内であってもページが例外で失敗します。

匿名ユーザーでさえ結果が得られない場合に、すべてのユーザーに対して安全に次のことを行う正しい方法は何でしょうか?

static public List<SPListMeta> AllSiteAnnouncementsLists()
{
    var returnList = new List<SPListMeta>();
    foreach (SPSite oSiteCollection in SPContext.Current.Web.Site.WebApplication.Sites)
    {
        var collWebs = oSiteCollection.AllWebs;
        try
        {
            foreach (SPWeb oWebsite in collWebs)
            {
                using (oWebsite)
                {
                    var collSiteLists = oWebsite.GetListsOfType(SPBaseType.GenericList);
                    returnList.AddRange(from SPList oList in collSiteLists where oList.Title == "Announcements" select new SPListMeta(oList));
                }
            }
        }
        catch
        {
        }

    }
    return returnList;
}
4

3 に答える 3

1

コードに実行するための適切な権限を与えてみてください。

using Microsoft.Sharepoint.Administrator;

 SPSecurity.RunWithElevatedPrivileges(delegate(){

                // Your source code goes here
  });
于 2012-10-15T06:26:59.983 に答える
1

サイト コレクションから特定のリスト タイプのすべてのアイテムを取得するには、SPSiteDataQuery を使用する必要があります。各ユーザーは、権限を持つアイテムのみを取得します。

     SPWeb web = SPContext.Current.Web;
     SPSiteDataQuery query = new SPSiteDataQuery();

     //Ask for all lists created from the announcement template.
     query.Lists = "<Lists ServerTemplate=\"104\" />";

     // Get the Title field. Define here all you need.
     query.ViewFields = "<FieldRef Name=\"Title\" />";

     // Set the sort order.
     query.Query = "<OrderBy>" + 
                       "<FieldRef Name=\"Title\" />" + 
                   "</OrderBy>";

     // Query all Web sites in this site collection.
     query.Webs = "<Webs Scope=\"SiteCollection\" />";

     DataTable dt = web.GetSiteData(query);
     DataView dv = new DataView(dt);
于 2012-10-15T09:31:37.550 に答える
0

これが私にとってはうまくいったのですが、これが最善の方法であるかどうかはわかりません。

    static public List<SPListMeta> AllSiteAnnouncementsLists()
    {
        var returnList = new List<SPListMeta>();

        var collWebs = SPContext.Current.Web.Site.WebApplication.Sites[0].OpenWeb().GetSubwebsForCurrentUser();
        if(SPContext.Current.Site.RootWeb.DoesUserHavePermissions(SPBasePermissions.Open))
        {
            var collSiteLists = SPContext.Current.Site.RootWeb.GetListsOfType(SPBaseType.GenericList);
            returnList.AddRange(from SPList oList in collSiteLists
                                where oList.DoesUserHavePermissions(SPBasePermissions.ViewListItems)
                                && oList.BaseTemplate == SPListTemplateType.Announcements
                                select new SPListMeta(oList));
        }
        foreach (SPWeb oWebsite in collWebs)
        {
            returnList.AddRange(WebRecursion.GetListsForCurrentWeb(oWebsite, SPListTemplateType.Announcements));
            foreach (SPWeb oSubSite in oWebsite.Webs)
            {
                returnList.AddRange(WebRecursion.GetListsForCurrentWeb(oSubSite, SPListTemplateType.Announcements));
            }
        }
        return returnList;
    }

    public static List<SPListMeta> GetListsForCurrentWeb(SPWeb oWebsite, SPListTemplateType type)
    {
        var returnList = new List<SPListMeta>();
        if (oWebsite.DoesUserHavePermissions(SPBasePermissions.Open))
        {
            using (oWebsite)
            {
                var collSiteLists = oWebsite.Lists;
                returnList.AddRange(from SPList oList in collSiteLists
                                    where oList.DoesUserHavePermissions(SPBasePermissions.ViewListItems)
                                    && oList.BaseTemplate == type
                                    select new SPListMeta(oList));
            }
        }
        return returnList;
    }
于 2013-01-01T00:05:24.423 に答える