I am trying to open a process handle in C# using the OpenProcess function as follows:
IntPtr hProcess = OpenProcess(0x410, false, pid);
where pid is the process ID of the process I would like to open.
When called on a PID whose user is "NT AUTHORITY\SYSTEM" (on Vista x64), the above call fails, with an "Access Denied" error.
How do I get a handle of such a process?
What makes me think this is at all possible is that the .NET System.Diagnostics.Process class seems to be able to operate on such processes. For example, Process.ProcessName works fine on such processes. Under the hood, it calls Process.MainModule.ModuleName, which ultimately calls OpenProcess in exactly the same way I do. However, System.Diagnostics doesn't get the "Access Denied" error whereas I do.
Curiously, anything that attempts to get the handle of the process into my application also throws the exception. For example, Process.Handle and Process.MainModule both throw an "Access Denied" error, despite the fact that Process.MainModule clearly succeeds when called indirectly through Process.ProcessName.
Does System.Diagnostics operate under some sort of raised privileges? How can I raise the privileges of my application to be able to do the same?