Yikes... how about a simple WMI query instead?

by process name:
```wmi
(Get-WMIObject Win32_Process | Where-Object { $_.Name -eq 'explorer.exe' }).getowner()
```
or by PID:
``` wmi
(Get-WMIObject Win32_Process | Where-Object { $_.Handle -eq $pid }).getowner()
```

Psuedo C#:
``` C#

var handleQuery = String.Join("Handle = ",  processes.Select(p => p.Handle)); // something like this I think
var selectQuery = new SelectQuery(String.Format("select * from Win32_Process where {0}", handleQuery));
using (var searcher = new ManagementObjectSearcher(selectQuery))
{
     from ManagementBaseObject obj in searcher.Get()
    select new { username = String.Format("{0}\\{1}", obj["Domain"], obj["User"]) };
}
```