Как изменить значение «Modified By» при использовании RunWithElevatedPrivileges? - PullRequest
13 голосов
/ 22 апреля 2009

У нас есть веб-часть, которая загружает документ в библиотеку документов. Пользователь, загружающий документ, может не иметь доступа к месту назначения, поэтому код, добавляющий файл, выполняется в блоке RunWithElevatedPrivileges . Это означает, что поле «Modified By» всегда имеет значение System Account. Вот код:

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);

Кто-нибудь знает решение, позволяющее изменять значение "Modified By"?

Ответы [ 6 ]

10 голосов
/ 19 мая 2009

Я сделал еще несколько испытаний ...

item["Editor"] = SPContext.Current.Web.CurrentUser;
item["Author"] = SPContext.Current.Web.CurrentUser;
item.SystemUpdate();

Создан, установлен для текущего пользователя, но для Изменено установлен для учетной записи системы.

item["Editor"] = SPContext.Current.Web.CurrentUser;
item["Author"] = SPContext.Current.Web.CurrentUser;
item.Update();

И Создано, и Изменено установлено для текущего пользователя.

Проблема заключалась в использовании SPListItem.SystemUpdate () , который полностью противоположен тому, что указано в документации API, по крайней мере при работе с повышенными привилегиями.

Примечание: SPContext.Current.Web.CurrentUser действительно выбирает текущего пользователя, а не системную учетную запись при запуске в SPSecurity.RunWithElevatedPrivileges. (Должно ли это использоваться так, это другой вопрос.)

6 голосов
/ 22 апреля 2009

Одним из способов решения этой проблемы является сохранение текущего зарегистрированного пользователя в памяти до повышения прав . Далее в запросе на обновление замените «Системная учетная запись» на вашу переменную.

См. Ниже:

// 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();
    }
});

Надеюсь, это поможет.

1 голос
/ 07 мая 2012

RunWithElevatedPrivileges всегда создает новый поток внутри текущего потока с идентификатором AppPool. Итак, внутри этого делегата контекст принадлежит системной учетной записи.

1 голос
/ 28 июля 2011

Делайте как (Энрике Закчи) пишет, но создайте метод расширения оболочки, который принимает SPUser в качестве дополнительного параметра. Тогда используйте это.

0 голосов
/ 22 апреля 2009

Вы пробовали это вместо SPSecurity.RunWithElevatedPrivileges?

using (WindowsImpersonationContext w = WindowsIdentity.Impersonate(IntPtr.Zero)) 
{
     //Do stuff here
}
0 голосов
/ 22 апреля 2009

Возможно, олицетворение может помочь вам решить вашу проблему.

Некоторые сведения об этом: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...