Обновление / редактирование 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;
}
}
}
}
});