我们有一个将文档上传到文档库的Web部件。上载文档的用户可能无法访问目标位置,因此添加文件的代码在RunWithElevatedPrivileges块内执行。这意味着“修改者”字段始终设置为“系统帐户”。这是代码:
SPSecurity.RunWithElevatedPrivileges(
delegate
{
using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
{
targetWeb.AllowUnsafeUpdates = true;
SPFile newFile = files.Add(filename, file);
SPListItem item = newFile.Item;
// TODO: Insert code to set Modified By
item.SystemUpdate();
}
}
}
需要将“Modified By”字段设置为当前用户的名称(在上面的TODO行中),但以下尝试均无效:
item["Modified By"] = SPContext.Current.Web.CurrentUser;
item["Author"] = SPContext.Current.Web.CurrentUser;
item["Modified By"] = new SPFieldUserValue(
SPContext.Current.Web, SPContext.Current.Web.CurrentUser.ID,
SPContext.Current.Web.CurrentUser.Name);
item["Author"] = new SPFieldUserValue(
SPContext.Current.Web, SPContext.Current.Web.CurrentUser.ID,
SPContext.Current.Web.CurrentUser.Name);
是否有人知道允许更改“修改者”值的解决方案?
答案 0 :(得分:10)
我做了一些测试...
item["Editor"] = SPContext.Current.Web.CurrentUser;
item["Author"] = SPContext.Current.Web.CurrentUser;
item.SystemUpdate();
Created By设置为当前用户,但Modified By设置为System Account。
item["Editor"] = SPContext.Current.Web.CurrentUser;
item["Author"] = SPContext.Current.Web.CurrentUser;
item.Update();
Created By和Modified By都设置为当前用户。
问题在于使用SPListItem.SystemUpdate(),它与API文档所说的完全相反,至少在使用提升的权限运行时。
注意:在SPSecurity.RunWithElevatedPrivileges中运行时,SPContext.Current.Web.CurrentUser确实会获取当前用户而不是系统帐户。 (是否应该像这样使用是另一个问题。)
答案 1 :(得分:6)
解决此问题的一种方法是将当前登录的用户存储在内存 提升权限之前。稍后在更新请求中,将“系统帐户”替换为您的变量。
见下文:
// Keep a reference of the Logged in user in memory
SPUser currentUser = SPContext.Current.Web.CurrentUser;
SPSecurity.RunWithElevatedPrivileges(
delegate
{
using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
{
targetWeb.AllowUnsafeUpdates = true;
SPFile newFile = files.Add(filename, file);
SPListItem item = newFile.Item;
// Replace 'System Account' with current user
item["Author"] = currentUser;
item["Modified By"] = currentUser;
item.SystemUpdate();
}
});
我希望这会有所帮助。
答案 2 :(得分:1)
as(Henrique Zacchi)写道,但是构建一个包装器扩展方法,它将SPUser作为一个额外的参数。然后使用它。
答案 3 :(得分:1)
RunWithElevatedPrivileges始终使用AppPool的标识在当前线程内创建一个新线程。因此,在此委托中,上下文属于系统帐户。
答案 4 :(得分:0)
也许冒充可能是帮助您解决问题的一种选择。
一些信息: http://dotnet.org.za/zlatan/archive/2007/08/05/sharepoint-2007-impersonation.aspx http://www.sharepointblogs.com/mirjam/archive/2006/11/02/impersonation-in-sharepoint-2007.aspx
答案 5 :(得分:0)
您是否尝试过此而不是SPSecurity.RunWithElevatedPrivileges?
using (WindowsImpersonationContext w = WindowsIdentity.Impersonate(IntPtr.Zero))
{
//Do stuff here
}