Обновление / редактирование Sharepoint 2007 User Information List UIL

Как обновить список информации о пользователях (UIL) Sharepoint 2007 с помощью кода C#? Мой код работает нормально при входе в систему как администратор, однако при входе в систему как простой пользователь код выдает ошибку "Отказано в доступе", потому что простой пользователь не может получить доступ к UIL. Мне нужен какой-то способ заставить простого пользователя редактировать СВОЮ СОБСТВЕННУЮ информацию (скажем, EMAIL) в UIL. Пожалуйста помоги. Это очень важно. Мой код похож на:

string var_UserName = myUsername;
string var_newemail = mynewemail@abc.com;
SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite site = SPContext.Current.Site)
                   {
                        SPWeb curWeb = site.OpenWeb();

                        SPList userList = SPContext.Current.Web.SiteUserInfoList;
                        StringBuilder queryBuilder = new StringBuilder();
                        queryBuilder.Append(@"<Query>");
                        queryBuilder.Append(@"<OrderBy>");
                        queryBuilder.Append(@"<FieldRef Name='Title' />");
                        queryBuilder.Append(@"</OrderBy>");
                        queryBuilder.Append(@"<Where>");
                        queryBuilder.Append(@"<Eq>");
                        queryBuilder.Append(@"<FieldRef Name='Title' />");
                        queryBuilder.Append(@"<Value Type='Text'>" + var_UserName + "</Value>");
                        queryBuilder.Append(@"</Eq>");
                        queryBuilder.Append(@"</Where>");
                        queryBuilder.Append(@"</Query>");
                        SPQuery query = new SPQuery();
                        query.Query = queryBuilder.ToString();
                        SPListItemCollection oSPListItemCollection = userList.GetItems(query);
                        SPField field = userList.Fields.GetField("E-Mail");

                        foreach (SPItem item in oSPListItemCollection)
                        {
                            if (item["Title"].ToString().ToLower() == Login1.UserName.ToLower())
                            {
                             item[field.InternalName] = var_newemail;
                             curWeb.AllowUnsafeUpdates = true;
                             item.Update(); //throws error when not logged in as administrator
                             curWeb.AllowUnsafeUpdates = false;
                             break; 
                            }
                        }

                    }
                });

2 ответа

Дело в том, что не используйте "контекст" для создания объекта spSite, поскольку он не будет создавать объект с повышенными привилегиями, но с привилегиями пользователя, который выполняет этот код, что может вызвать исключение / ошибку. Поэтому я просто удалил объект Context, и он работает для любого пользователя. Бинго:) Вот так:

string var_UserName = myUsername;
string var_newemail = mynewemail@abc.com;
SPSecurity.RunWithElevatedPrivileges(delegate()
            {
               using (SPSite site = new SPSite(Page.Request.Url.ToString())) //Change 1
               {
                    SPWeb curWeb = site.OpenWeb();

                    SPList userList = curWeb.Lists["User Information List"]; //Change 2
                    StringBuilder queryBuilder = new StringBuilder();
                    queryBuilder.Append(@"<Query>");
                    queryBuilder.Append(@"<OrderBy>");
                    queryBuilder.Append(@"<FieldRef Name='Title' />");
                    queryBuilder.Append(@"</OrderBy>");
                    queryBuilder.Append(@"<Where>");
                    queryBuilder.Append(@"<Eq>");
                    queryBuilder.Append(@"<FieldRef Name='Title' />");
                    queryBuilder.Append(@"<Value Type='Text'>" + var_UserName + "</Value>");
                    queryBuilder.Append(@"</Eq>");
                    queryBuilder.Append(@"</Where>");
                    queryBuilder.Append(@"</Query>");
                    SPQuery query = new SPQuery();
                    query.Query = queryBuilder.ToString();
                    SPListItemCollection oSPListItemCollection = userList.GetItems(query);
                    SPField field = userList.Fields.GetField("E-Mail");

                    foreach (SPItem item in oSPListItemCollection)
                    {
                        if (item["Title"].ToString().ToLower() == Login1.UserName.ToLower())
                        {
                         item[field.InternalName] = var_newemail;
                         curWeb.AllowUnsafeUpdates = true;
                         item.Update(); //throws error when not logged in as administrator
                         curWeb.AllowUnsafeUpdates = false;
                         break; 
                        }
                    }

                }
            });

Возможно, вы захотите добавить что-то вроде этого в ваш код:

    string usName = null;
            SPClaimProviderManager mgr = SPClaimProviderManager.Local;
            if (mgr != null)
            {
                var claim = new SPClaim(SPClaimTypes.UserLogonName,
                                        SPContext.Current.Web.CurrentUser.LoginName,
                                        "http://www.w3.org/2001/XMLSchema#string",
                                        SPOriginalIssuers.Format(SPOriginalIssuerType.Windows));
                usName = mgr.EncodeClaim(claim);



so in your code just try adding:

SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite site = SPContext.Current.Site)
                   {

 **if (site.DoesUserHavePermissions(usName,SPBasePermissions.ViewPages))
{**


                        SPWeb curWeb = site.OpenWeb();

                        SPList userList = SPContext.Current.Web.SiteUserInfoList;
                        StringBuilder queryBuilder = new StringBuilder();
                        queryBuilder.Append(@"<Query>");
                        queryBuilder.Append(@"<OrderBy>");
                        queryBuilder.Append(@"<FieldRef Name='Title' />");
                        queryBuilder.Append(@"</OrderBy>");
                        queryBuilder.Append(@"<Where>");
                        queryBuilder.Append(@"<Eq>");
                        queryBuilder.Append(@"<FieldRef Name='Title' />");
                        queryBuilder.Append(@"<Value Type='Text'>" + var_UserName + "</Value>");
                        queryBuilder.Append(@"</Eq>");
                        queryBuilder.Append(@"</Where>");
                        queryBuilder.Append(@"</Query>");
                        SPQuery query = new SPQuery();
                        query.Query = queryBuilder.ToString();
                        SPListItemCollection oSPListItemCollection = userList.GetItems(query);
                        SPField field = userList.Fields.GetField("E-Mail");

                        foreach (SPItem item in oSPListItemCollection)
                        {
                            if (item["Title"].ToString().ToLower() == Login1.UserName.ToLower())
                            {
                             item[field.InternalName] = var_newemail;
                             curWeb.AllowUnsafeUpdates = true;
                             item.Update(); //throws error when not logged in as administrator
                             curWeb.AllowUnsafeUpdates = false;
                             break; 
                            }
                        }
}

                    }
                });
Другие вопросы по тегам