C ++ OpenProcess успешно с IDE администратора привилегии, но не удалось при выполнении в Admin CMD - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь решить проблему, когда моя программа не может получить путь к процессу по идентификатору процесса (csrss.exe).

Ниже приведен мой самый простой воспроизводимый код C ++ в Visual Studio 2012:

#include "stdafx.h"
#include <iostream>
#include <psapi.h>


int get_proc_path_by_id(const DWORD dwProcID, TCHAR* procPath)
{
    HANDLE h = ::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION , FALSE, dwProcID);

    if (h)
    {
        if (::GetProcessImageFileName(h, procPath, MAX_PATH))
        {
            return ERROR_SUCCESS;
        }
        else
        {
            return GetLastError();
        }
    }
    else
    {
        return GetLastError();
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD procID = 1256; // csrss.exe ProcID

    TCHAR procPath[MAX_PATH];

    int procPathErrorCode = get_proc_path_by_id(procID, procPath);
    if(procPathErrorCode == ERROR_SUCCESS)
    {
        std::wcout << procPath;
    }
    else
    {
        std::cout  << "Failed with error code : " << procPathErrorCode;
    }

    return 0;
}

Я тестирую эту программу с процессом "csrss.exe", так как с помощью этого процесса был протестирован исходный код в моем продукте.

Я могу получить путь к процессу при запуске кода с правами администратора Visual Studio 2012.

enter image description here

Но когда я откройте командную строку с правами администратора и запустите этот исполняемый файл, функция get_proc_path_by_id вернет код ошибки «5» (нарушение прав доступа).

enter image description here

Как я могу получить программу, способную получить путь процесса с помощью Admin CMD?

1 Ответ

1 голос
/ 10 марта 2020

ИМХО, это достаточно четко задокументировано в руководстве OpenProcess

Если указанный процесс является процессом Idle или одним из процессов CSRSS , эта функция завершается ошибкой и последняя ошибка код ERROR_ACCESS_DENIED , поскольку их ограничения доступа не позволяют код уровня пользователя открывать их.

Командная строка с правами администратора является приложением уровня пользователя.

Кроме того, в этом руководстве есть примечания

Чтобы открыть дескриптор другого локального процесса и получить полные права доступа, необходимо включить привилегию SeDebugPrivilege . Для получения дополнительной информации см. Изменение привилегий в токене.

А именно Visual Studio 2012 с правами администратора работает с привилегией SeDebugPrivilege.

...