2009-04-22 13 views
13

Mamy część internetową, która ładuje dokument do biblioteki dokumentów. Użytkownik przesyłający dokument może nie mieć dostępu do docelowej lokalizacji, więc kod dodający plik jest wykonywany w bloku RunWithElevatedPrivileges. Oznacza to, że pole "Zmodyfikowane przez" jest zawsze ustawione na Konto systemowe. Oto kod:W jaki sposób zmienić "Zmodyfikowane przez" podczas korzystania z 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(); 
     } 
    } 
} 

„Zmodyfikowany przez” pole musi być ustawiona nazwa bieżącego użytkownika (w linii powyżej TODO), ale żaden z poniższych prób pracowali:

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

Czy ktoś wie o rozwiązaniu, które umożliwia zmianę wartości "Zmodyfikowane według"?

Odpowiedz

10

zrobiłem trochę więcej badań ...

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

Autor jest ustawiony do bieżącego użytkownika, ale Zmodyfikowany przez ustawiony jest na konto systemowe.

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

Zarówno utworzone przez, jak i zmodyfikowane przez są ustawione na bieżącego użytkownika.

Problem polegał na użyciu SPListItem.SystemUpdate(), która jest dokładnie przeciwna do tego, co stwierdza dokumentacja API, przynajmniej podczas uruchamiania z podniesionymi uprawnieniami.

Uwaga: SPContext.Current.Web.CurrentUser ma odebrać bieżącego użytkownika, a nie konta System, gdy uruchomiony w ciągu SPSecurity.RunWithElevatedPrivileges. (Niezależnie od tego, czy powinno być używane w ten sposób, to jest inne pytanie.)

+0

Ogromna pomoc, +1 ... –

+0

Dziwne zachowanie połączeń. Dziękujemy za opublikowanie rozwiązania. Pomogło mi. –

+0

Mam problem z biblioteką dokumentów, w której włączono opcję odprawiania się i wymeldowywania. więc kiedy otrzymuję nazwę itemupdate, nadal otrzymuję modyfikację jako "konto systemowe" i kiedy próbuję z listitem ["Editor"] = ospuser.ID; , ponownie zgłaszam błąd i błąd odprawy. pls pomoc – SaMolPP

6

Jednym ze sposobów rozwiązania tego problemu jest zapisanie aktualnie zalogowanego użytkownika w pamięci przed podnoszeniem uprawnień do. Później w zleceniu aktualizacji zamień "Konto systemowe" na zmienną.

Patrz poniżej:

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

Mam nadzieję, że to pomaga.

+0

Nie zapomnij ustawić opcji targetWeb.AllowUnsafeUpdates na wartość false. Chciałbyś to zrobić w końcu {} bloku. –

0

próbowałeś to zamiast SPSecurity.RunWithElevatedPrivileges?

using (WindowsImpersonationContext w = WindowsIdentity.Impersonate(IntPtr.Zero)) 
{ 
    //Do stuff here 
} 
+0

Sugeruję czytanie w systemie Windows Podszywanie się i SharePoint –

1

Wykonuj (Henrique Zacchi) zapisy, ale zbuduj metodę rozszerzenia opakowania, która pobiera SPUser jako dodatkowy parametr. Następnie użyj go.

1

RunWithElevatedPrivileges zawsze tworzy nowy wątek wewnątrz bieżącego wątku z tożsamością AppPool. Wewnątrz tego delegata kontekst należy do konta systemowego.

Powiązane problemy