Информация о процессе не может быть получена из локальной системной учетной записи

Я пытаюсь получить процессы с машины и собрать соответствующую информацию для каждого процесса.

Я пишу эту функциональность на 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. Этот код работает из сеанса пользователя, и я получаю результат, но при запуске этого кода из оконной службы локальной системы он терпит неудачу.

stackoverflow.com/questions/4988082/…
Pateman 26.02.2019 06:35

Таким образом вы можете собирать информацию только о ваших собственных процессах. Вы можете найти этот код полезным.

Daniel Widdis 26.02.2019 07:25

Как убедиться, что вы потерпели неудачу? Оба 2 способа получат системный процесс, а OpenProcess завершится ошибкой и вернет NULL, затем продолжит цикл for без сообщения об ошибке. Итак, пользовательский сеанс работает.

Drake Wu 27.02.2019 08:41

Также, если какой-то процесс был убит между CreateToolhelp32Snapshot и OpenProcess, он не сможет найти процесс по id и вернуть ERROR_INVALID_PARAMETER

Drake Wu 27.02.2019 08:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
124
1

Ответы 1

В документе OpenProcess на msdn говорится:

If the specified process is the System Process (0x00000000), the function fails and the last error code is ERROR_INVALID_PARAMETER.

В порядке!! но это дает ошибку только тогда, когда я запускаю оконную службу с учетной записью локальной системы. Если я запускаю из IDE, все работает нормально.

Akil Vhora 27.02.2019 05:02

Другие вопросы по теме