Я пытаюсь получить процессы с машины и собрать соответствующую информацию для каждого процесса.
Я пишу эту функциональность на Java с помощью JNA.
public static List<ProcessInfo> getProcessList() throws Exception {
/* Initialize the empty process list. */
List<ProcessInfo> processList = new ArrayList<ProcessInfo>();
/* Create the process snapshot. */
WinNT.HANDLE snapshot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
Tlhelp32.PROCESSENTRY32.ByReference pe = new Tlhelp32.PROCESSENTRY32.ByReference();
for (boolean more = Kernel32.INSTANCE.Process32First(snapshot, pe); more; more = Kernel32.INSTANCE.Process32Next(snapshot, pe)) {
/* Open this process; ignore processes that we cannot open. */
WinNT.HANDLE hProcess = Kernel32.INSTANCE.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_QUERY_LIMITED_INFORMATION, /* PROCESS_QUERY_LIMITED_INFORMATION */false, pe.th32ProcessID.intValue());
if (hProcess == null) {
continue;
}
/* Get the image name. */
char[] imageNameChars = new char[1024];
IntByReference imageNameLen = new IntByReference(imageNameChars.length);
if (!Kernel32.INSTANCE.QueryFullProcessImageName(hProcess, 0, imageNameChars, imageNameLen)) {
throw new Exception("Couldn't get process image name for "
+ pe.th32ProcessID.intValue());
}
/* Add the process info to our list. */
processList.add(new ProcessInfo(pe.th32ProcessID.intValue(), pe.th32ParentProcessID.intValue(), new String(imageNameChars, 0, imageNameLen.getValue())));
/* Close the process handle. */
Kernel32.INSTANCE.CloseHandle(hProcess);
}
/* Close the process snapshot. */
Kernel32.INSTANCE.CloseHandle(snapshot);
/* Return the process list. */
return processList;
}
Теперь я получаю сообщение об ошибке (87) в функции OpenProcess. Этот код работает из сеанса пользователя, и я получаю результат, но при запуске этого кода из оконной службы локальной системы он терпит неудачу.
Таким образом вы можете собирать информацию только о ваших собственных процессах. Вы можете найти этот код полезным.
Как убедиться, что вы потерпели неудачу? Оба 2 способа получат системный процесс, а OpenProcess завершится ошибкой и вернет NULL, затем продолжит цикл for без сообщения об ошибке. Итак, пользовательский сеанс работает.
Также, если какой-то процесс был убит между CreateToolhelp32Snapshot и OpenProcess, он не сможет найти процесс по id и вернуть ERROR_INVALID_PARAMETER




В документе OpenProcess на msdn говорится:
If the specified process is the System Process (0x00000000), the function fails and the last error code is ERROR_INVALID_PARAMETER.
В порядке!! но это дает ошибку только тогда, когда я запускаю оконную службу с учетной записью локальной системы. Если я запускаю из IDE, все работает нормально.