Altering the admin/content form After having added a “changed by” on nodes I now need to display the user who modified each node on the node_admin_content form (at admin/content) right next to the "Author" column.

I've managed to easily solve this by altering node.admin.inc and adding just 2 lines of code:

...
'changed_by' =&gt; t('Changed By'),
...

...
'changed_by' =&gt; theme('username', array('account' =&gt; user_load($node-&gt;changed_by))),
...


This, of course, is not a proper solution since it alters the core.

So I then tried altering the form via:

function hook_form_node_admin_content_alter(&amp;$form, &amp;$form_state, $form_id) { 
  $form['admin']['nodes']['#header']['changed_by'] = t('Changed By');
  // ... ?
}


Using dpm I can see that the form has the nodes in options. The problem is that this is the result of rendering the nodes as table options. I don't have access to the original nodes, nor do I want to re-execute the node fetch query in order to get the "changed by" information. I guess doing this in the form hook would not be solving it in the correct layer. Or is it?

So, what is a good way to alter the node_admin_content form to add more data that exists on nodes?
The bad news is that having inspected the code, the form alter layer is the only place to really do this; your approach is pretty much spot on. 

The good news is, Drupal implements all sorts of static caching throughout the page load, which minimises the need to go back into the database. So while altering the content table may appear cumbersome, you're not actually taking a noticeable performance hit.

The following code (or similar) should work; see the comments for more info about the caching issue:

function MYMODULE_form_node_admin_content_alter(&amp;$form, &amp;$form_state, $form_id) {
  // Load the nodes. This incurrs very little overhead as 
  // "$nodes = node_load_multiple($nids);" has already been run on these
  // nids in node_admin_nodes(). The static cache will be used instead of
  // another db query being invoked
  $nodes = node_load_multiple(array_keys($form['admin']['nodes']['#options']));

  // Grab a list of all user ids that have been responsible for changing the node
  $uids = array();
  foreach ($nodes as $node) {
    $uids[] = $node-&gt;changed_by;
  }

  // Filter out duplicates (one user may have been the last to change more than one node)
  $uids = array_unique($uids);

  // Load a list of all involved users in one go. This is about as performant
  // as this is going to get, as you're going to need the user objects one
  // way or the other for the call to theme_username
  $users = user_load_multiple($uids);

  // Add another column to the table header
  $form['admin']['nodes']['#header']['changed_by'] = array('data' =&gt; t('Changed by'));

  // Loop through the rows in the table and add the changed by column
  foreach ($form['admin']['nodes']['#options'] as $nid =&gt; $row) {
    // Grab the user related to this node.
    $this_user = $users[$nodes[$nid]-&gt;changed_by];

    // Add data for the new column
    $form['admin']['nodes']['#options'][$nid]['changed_by'] = theme('username', array('account' =&gt; $this_user));
  }
}


The above code produces a nice shiny new column like this on the content admin page: