【问题标题】:C++ OpenProcess success with Admin Privilege IDE but failed when execute in Admin CMDC++ OpenProcess 使用 Admin Privilege IDE 成功,但在 Admin CMD 中执行时失败
【发布时间】:2020-03-10 05:12:58
【问题描述】:

我正在尝试解决我的程序无法通过进程 ID (csrss.exe) 获取进程路径的问题。

下面是我在 Visual Studio 2012 上最简单的可重现 C++ 代码:

#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 运行代码时,我能够获取进程路径。

但是当我使用管理员权限打开命令提示符并运行此可执行文件时,函数 get_proc_path_by_id 返回错误代码“5”(访问冲突)。

如何让程序能够使用 Admin CMD 获取进程路径?

【问题讨论】:

    标签: c++ visual-studio-2012


    【解决方案1】:

    恕我直言,OpenProcess 手册中已经清楚地记录了

    如果指定的进程是空闲进程或CSRSS之一 进程,此函数失败,最后一个错误代码是 ERROR_ACCESS_DENIED 因为他们的访问限制阻止 用户级代码从打开它们。

    具有管理员权限的命令提示符是用户级应用程序。

    另外,本手册有备注

    要打开另一个本地进程的句柄并获得完全访问权限,您必须启用 SeDebugPrivilege 权限。有关详细信息,请参阅更改令牌中的权限。

    即具有管理员权限的 Visual Studio 2012 正在使用 SeDebugPrivilege 权限运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多