none
Выполнение веб-части с правами адмнистратора коллекции сайтов RRS feed

  • Вопрос

  • Написал веб-чать для аудита измений. Использую 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