Updating Created By field in SharePoint through Client Object Model
Recently, we did a migration from SharePoint 2010 old site to a new site and as a result imported a bunch of records.
However, the Created By field was reset to the Account of the person performing the migration. To overcome this, I wrote a quick script to update the 
Created By field. The field was updated from another field Old_Created_By_Person
using Microsoft.SharePoint.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SPUpdateField
{
    class Program
    {
        static void Main(string[] args)
        {
            ClientContext ctx = new ClientContext("https://teams.aexp.com/sites/excel");
            List list = ctx.Web.Lists.GetByTitle("Idea");
            ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery());
            ctx.Load(items); // loading all the fields
            ctx.ExecuteQuery();
            foreach (var item in items)
            {
                ctx.Load(item);
                ctx.ExecuteQuery();
                // important thing is, that here you must have the right type
                // i.e. item["Modified"] is DateTime
                FieldUserValue val = item["Old_Created_By_Person"] as FieldUserValue;
                if (val != null)
                {
                    item["Author"] = val;
                    // do whatever changes you want
                    item.Update(); // important, rembeber changes
                    ctx.ExecuteQuery();
                    Console.WriteLine("Updating " + item.Id);
                }
            }
           
            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }
}