Исключение System.UnauthorizedAccessException не было обработано кодом пользователя при удалении пользовательских предупреждений? - PullRequest
0 голосов
/ 05 апреля 2011

Я получаю System.UnauthorizedAccessException was unhandled by user code при удалении пользовательских предупреждений путем программирования. Это хорошо работает в моей ферме QA. Но не работает в ферме DEV.

Я добавил учетную запись пула приложений в группу администраторов фермы и группу пользователей базы данных как dbowner. По-прежнему получаю ту же ошибку.

 protected void ChkBx41_CheckedChanged(object sender, EventArgs e)
  {
    SPUser user = SPContext.Current.Web.CurrentUser;       
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
     using(SPSite site=new SPSite(url.Text)){
      using (SPWeb eweb = site.OpenWeb())
      {
            SPUser juser = null;
            eweb.AllowUnsafeUpdates = true;
            try
            {
              juser = eweb.AssociatedMemberGroup.Users[user.LoginName];
            }
            catch (Exception)
            {
            }
            if (ChkBx41.Checked)
            {

                if (juser == null)
                {
                  eweb.AssociatedMemberGroup.AddUser(eweb.EnsureUser(user.LoginName));
                  SPUtility.SendEmail(eweb, true, true, user.Email, "Welcome to " + eweb.Title, "Hello " + "<br><br>" + "Welcome to the " + eweb.Title + " ");
                  createalert(SPAlertFrequency.Daily, eweb, eweb.EnsureUser(user.LoginName),true);
             }
             RBList4.SelectedValue = "Daily";
             RBList4.Enabled = true;
           }
           else
           {
             if (juser != null)
             {
                eweb.AssociatedMemberGroup.RemoveUser(juser);
                removealert(eweb, juser);
                RBList4.SelectedValue = null;
                RBList4.Enabled = false;
             }

          }
      eweb.AllowUnsafeUpdates = false;
    }
  }
});


}

    public void removealert(SPWeb rweb, SPUser ruser)
      {
        bool oldCatchAccessDeniedException = rweb.Site.CatchAccessDeniedException;
        try
        {
          SPUser cuser = rweb.EnsureUser(ruser.LoginName);
          List<Guid> altid = new List<Guid>();
          foreach (SPAlert alt in cuser.Alerts)
          {
            try
            {
              if (alt.AlertType == SPAlertType.List)
              {
                altid.Add(alt.ID);
              }
            }
            catch (Exception) { }
          }
          rweb.Site.CatchAccessDeniedException = false;
          foreach (Guid delid in altid)
          {
            cuser.Alerts.Delete(delid);
          } 
        }
        catch (UnauthorizedAccessException)
        {
        }
        finally
        {
          rweb.Site.CatchAccessDeniedException = oldCatchAccessDeniedException;
        }
       }      

1 Ответ

2 голосов
/ 05 апреля 2011

Запускается из веб-части, попробуйте поднять?

public void removealert(SPWeb rweb, SPUser ruser) {
    SPSecurity.RunWithElevatedPrivileges(delegate() {
        using(SPSite csite = new SPSite(rweb.Site.Id)) {
            using(SPWeb cweb = csite.OpenWeb(rweb.Id)) {
                SPUser cuser = cweb.EnsureUser(ruser.LoginName);    

                List<Guid> altid = new List<Guid>();
                foreach (SPAlert alt in cuser.Alerts) {
                    try {
                        if (alt.AlertType == SPAlertType.List) {
                            altid.Add(alt.ID);
                        }
                    } catch (Exception) {
                    }
                }
                foreach (Guid delid in altid) {
                    cuser.Alerts.Delete(delid);
                }
            }
        }
    });
}

Мне также было бы интересно узнать, откуда берется SPWeb rweb.Я надеюсь, что не из SPContext, как вы не должны избавляться от этого.

Я бы порекомендовал также размещать ваши SPWebs в блоке using, в том же блоке методов, для удобства чтения.

...