SharePoint 2010: Actualizando el campo “Creado por” desde código
En algunos escenarios (por ejemplo en migraciones de datos y entornos), es posible que necesitemos actualizar o asignar los campos de sistema de los elementos de una lista de SharePoint.
Los campos de sistema, serían: Creado, Creado por, Modificado y Modificado por.
Os paso el código necesario para actualizar el campo Creado, de un item de una lista.
1: string createdBy = @"DOMAIN\myUser";
2:
3: using (SPSite site = new SPSite("http://team.domain.lab"))
4: {
5: using (SPWeb web = site.OpenWeb())
6: {
7: SPList list = web.GetList("Lists/Products");
8: UpdateSystemProperties(list, createdBy);
9: }
10: }
En el código anterior tan sólo accedemos a la lista que nos interesa, y llamamos al método de actualizar:
1: public static void UpdateSystemProperties(SPList list, string createdBy)
2: {
3: if (list.ItemCount > 0)
4: {
5: SPListItem item = list.Items[0];
6:
7: SPUser user = list.ParentWeb.EnsureUser(createdBy);
8:
9: if (user == null)
10: {
11: throw new ArgumentNullException("User not found");
12: }
13:
14: item[SPBuiltInFieldId.Author] = user.ID;
15: item.UpdateOverwriteVersion();
16: }
17: }
Fijaros en que hacemos uso de la clase SPBuiltInFieldId Esta clase nos permite acceder a los IDs de todos los campos de SharePoint que vienen OOB.
Ojo, aunque existe una propiedad de esta clase que es: “Created_x0020_By”, el campo que realmente almacena lo que vemos en el item como “Creado por”, es el campo “Author”.
Fijaros como aparece un item que he creado desde la interfaz de SharePoint:

Y así quedaría cuando ejecutamos el código:

PD: No lo he probado en Office 365, pero si lo usamos en un webpart y sacamos el SPWeb del contexto, debería funcionar igual, ya que el resto de operaciones son permitidas en modo Sandbox.
Saludos!