Лучший отвечающий
Выполнение веб-части с правами адмнистратора коллекции сайтов

Вопрос
-
Написал веб-чать для аудита измений. Использую SPAuditQuery. Пока писал все прекрасно работало (т.к. прав на выполнение хватало), но когда зашел на страницу с разарботанной веб-частью с правами участника, то вылетела ошибка с запретом доступа. Стал дебагить. Нашел что ошибка возникает при выполнении запроса к данным аудита. Что делать?
SPSecurity.RunWithElevatedPrivileges( delegate { SPSite site = SPContext.Current.Site; SPWeb cWeb = site.OpenWeb();//AllWebs[i]; SPAuditEntryCollection auditCol; SPAuditQuery wssQuery = new SPAuditQuery(site); wssQuery.RowLimit = 10000; wssQuery.SetRangeEnd(DateTime.Now); wssQuery.SetRangeStart(DateTime.Now.AddDays((sLastDay - 1))); auditCol = site.Audit.GetEntries(wssQuery); //здесь ошибка доступа foreach (SPAuditEntry entry in auditCol) {
16 августа 2011 г. 13:42
Ответы
-
Ну так, а вы попробовали поменять SPSite site = SPContext.Current.Site на SPSite site = new SPSite(SPContext.Current.Site.Url)?
Вы же вызываете метод auditCol = site.Audit.GetEntries(wssQuery); из под старого SPSite, который открыт под контекстом пользователя без административных привилегий.
- Предложено в качестве ответа IAfanasovModerator 16 августа 2011 г. 14:49
- Помечено в качестве ответа Aleksandr Shramko 16 августа 2011 г. 20:19
16 августа 2011 г. 14:31
Все ответы
-
Добрый день,
Надо SPSite заново открыть. Примерно так.
SPSecurity.RunWithElevatedPrivileges( delegate { using (var site = new SPSite(SPContext.Current.Site.Url)) { using (var cweb = site.OpenWeb()) { SPAuditEntryCollection auditCol; SPAuditQuery wssQuery = new SPAuditQuery(site); wssQuery.RowLimit = 10000; wssQuery.SetRangeEnd(DateTime.Now); wssQuery.SetRangeStart(DateTime.Now.AddDays((sLastDay - 1))); auditCol = site.Audit.GetEntries(wssQuery); //здесь ошибка доступа } } });
16 августа 2011 г. 13:54 -
Проблема не в вызове объктов а именно в правах. Для ясности вот весь код метода
private DataTable mAudit()//int i) //метод получения событий посредством SPAudit { DataTable dtAudit = new DataTable(); dtAudit.Columns.Add("Событие"); dtAudit.Columns.Add("DocLocation"); dtAudit.Columns.Add("Occurred"); dtAudit.Columns.Add("Version"); dtAudit.Columns.Add("Пользователь"); dtAudit.Columns.Add("Тип элемента"); dtAudit.Columns.Add("Link"); dtAudit.Columns.Add("Элемент"); //dtAudit.Columns.Add("UrlListItem"); dtAudit.Columns.Add("lib"); dtAudit.Columns.Add("Site"); dtAudit.Columns.Add("DataCreated"); dtAudit.Columns.Add("DataModified"); dtAudit.Columns.Add("Состояние"); SPSecurity.RunWithElevatedPrivileges( delegate { using (SPSite site = SPContext.Current.Site) { using (SPWeb cWeb = site.OpenWeb()) { SPAuditEntryCollection auditCol; SPAuditQuery wssQuery = new SPAuditQuery(site); wssQuery.RowLimit = 10000; wssQuery.SetRangeEnd(DateTime.Now); wssQuery.SetRangeStart(DateTime.Now.AddDays((sLastDay - 1))); auditCol = site.Audit.GetEntries(wssQuery); foreach (SPAuditEntry entry in auditCol) { if ((entry.Event.ToString() == "Update") || (entry.Event.ToString() == "Delete") || (entry.Event.ToString() == "Undelete"))//(entry.Occurred >= _X) { if (entry.ItemType.ToString() != "List") { DataRow dataRow = dtAudit.NewRow(); dataRow["DocLocation"] = entry.DocLocation; dataRow["Occurred"] = entry.Occurred.ToLocalTime(); dataRow["Version"] = ParseVersionNumber(entry.EventData); dataRow["Пользователь"] = GetUserNameById(entry.UserId, cWeb); dataRow["Тип элемента"] = entry.ItemType; dataRow["Элемент"] = GetTitleItem(entry.DocLocation.ToString()); //dataRow["UrlListItem"] = GetUrlListItem(GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString(), entry.DocLocation); dataRow["lib"] = "<b>" + GetListByUrl(GetLinkToList(GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString())) + "</b>"; //GetListName(entry.DocLocation.ToString(), cWeb); dataRow["Site"] = "<b>" + GetNameWeb(GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString()) + "</b>"; //проверяем новый ли элемент или уже есть изменения string DataCreated = GetDataCreated(GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString(), entry.DocLocation); string DataModified = GetDataModified(GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString(), entry.DocLocation); TimeSpan d = new TimeSpan(0, 0, 0, 0); try { TimeSpan f = (Convert.ToDateTime(DataModified) - Convert.ToDateTime(DataCreated)); if ((f == d) && (entry.Event.ToString() == "Update")) { dataRow["Событие"] = "Новое"; } else { switch (entry.Event.ToString()) { case "Update": dataRow["Событие"] = "Изменено"; break; case "Undelete": dataRow["Событие"] = "Востановлено"; break; case "Delete": dataRow["Событие"] = "Удалено"; break; } } } catch { dataRow["Событие"] = "Удалено"; } dataRow["DataCreated"] = DataCreated; dataRow["DataModified"] = DataModified; //опрделяем какой тип элемента: документ или элемент списка и подставляем соответствующий урл if (entry.DocLocation.ToString().Contains("Lists")) { dataRow["Link"] = GetUrlListItem(GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString(), entry.DocLocation); } else { dataRow["Link"] = GetSiteNameById(entry.SiteId).ToString() + "/" + entry.DocLocation.ToString(); } dtAudit.Rows.Add(dataRow); } } } if (cWeb != null) { cWeb.Dispose(); } } } }); return dtAudit; }
16 августа 2011 г. 14:22 -
Ну так, а вы попробовали поменять SPSite site = SPContext.Current.Site на SPSite site = new SPSite(SPContext.Current.Site.Url)?
Вы же вызываете метод auditCol = site.Audit.GetEntries(wssQuery); из под старого SPSite, который открыт под контекстом пользователя без административных привилегий.
- Предложено в качестве ответа IAfanasovModerator 16 августа 2011 г. 14:49
- Помечено в качестве ответа Aleksandr Shramko 16 августа 2011 г. 20:19
16 августа 2011 г. 14:31 -
Андрей, огромное спасибо!!! а не подскажите где можно почитать подробнее по данной теме?16 августа 2011 г. 20:19
-
Александр, вот отличная статья http://msdn.microsoft.com/en-us/library/bb397403(v=office.12).aspx, на мой взгляд.17 августа 2011 г. 5:40
-
Еще раз сенкс17 августа 2011 г. 6:26