Я не понимаю, почему вы не хотите p / invoke. Если вы посмотрите на System.Diagnostics в Reflector, вы увидите, что он использует p / вызывает внутренне. В любом случае, класс Process не имеет способ получения родительского PID процесса. Вместо этого:
Определение структуры:
[StructLayout(LayoutKind.Sequential)]
struct PROCESS_BASIC_INFORMATION
{
public int ExitStatus;
public int PebBaseAddress;
public int AffinityMask;
public int BasePriority;
public int UniqueProcessId;
public int InheritedFromUniqueProcessId;
}
(упрощенная) функция импорта:
[DllImport("ntdll.dll")]
static extern int NtQueryInformationProcess(
IntPtr ProcessHandle,
int ProcessInformationClass,
out PROCESS_BASIC_INFORMATION ProcessInformation,
int ProcessInformationLength,
out int ReturnLength
);
код:
Process p = Process.GetProcessById(1234);
PROCESS_BASIC_INFORMATION pbi;
int size;
NtQueryInformationProcess(p.Handle, 0, out pbi, Marshal.SizeOf(typeof(PROCESS_BASIC_INFORMATION)), out size);
// pbi.InheritedFromUniqueProcessId now contains the process' parent PID
Вам нужно будет вставить эти символы вверху файла:
using System.Runtime.InteropServices;
using System.Diagnostics;
Если вы хотите перечислить процессы, вам лучше использовать NtQuerySystemInformation - хотя этот код слишком длинный для размещения здесь.