Tuesday, 27 August 2013

SharePoint CrossListQueryInfo run elevated

SharePoint CrossListQueryInfo run elevated

I have a CrossListQueryInfo/Cache method that works as expected.
Unfortunately security trimming filters out all list items the user has no
access to (of course). But I want to find these list items too. That's why
I went for SPSecurity.RunWithElevatedPrivileges but that didn't work out
as expected.
Any hints?
private class ContentManager
{
private const string FIELD_CONTENTTYPE = "ContentType";
private const string FIELD_PUBLISH_START = "PublishingStartDate";
private const string FIELD_PUBLISH_END = "PublishingExpirationDate";
private const string FIELD_TITLE = "Title";
public string FindPage(string contentTypeName)
{
Guid[] viewFieldsIds = { SPBuiltInFieldId.Title,
SPBuiltInFieldId.FileRef };
string query =
CamlexNET.Camlex.Query()
.Where(
spListItem =>
(string)spListItem[FIELD_CONTENTTYPE] == contentTypeName
&& ((DateTime)spListItem[FIELD_PUBLISH_START] <=
DateTime.Now || spListItem[FIELD_PUBLISH_START] ==
null)
&& ((DateTime)spListItem[FIELD_PUBLISH_END] >
DateTime.Now || spListItem[FIELD_PUBLISH_END] ==
null))
.OrderBy(x => x[FIELD_TITLE])
.ToString();
string viewFields =
CamlexNET.Camlex.Query().ViewFields(viewFieldsIds);
//DataTable results =
crossListCache.GetSiteData(SPContext.Current.Site);
DataTable results = null;
SPSecurity.RunWithElevatedPrivileges(
() =>
{
CrossListQueryInfo crossListQueryInfo = new
CrossListQueryInfo();
crossListQueryInfo.Query = query;
crossListQueryInfo.UseCache = true;
crossListQueryInfo.ShowUntargetedItems = true;
crossListQueryInfo.ViewFields = viewFields;
crossListQueryInfo.Webs = "<Webs Scope=\"Recursive\" />";
crossListQueryInfo.Lists = "<Lists
ServerTemplate=\"850\" />";
crossListQueryInfo.WebUrl = "/";
CrossListQueryCache crossListCache = new
CrossListQueryCache(crossListQueryInfo);
using (SPSite site = new
SPSite(SPContext.Current.Site.ID))
{
results = crossListCache.GetSiteData(site);
}
});
return results.Rows.Count.ToString();
}
}

No comments:

Post a Comment