【发布时间】:2012-07-18 03:01:15
【问题描述】:
我正在枚举所有用户的 iexplore.exe 实例。我能够获得机器上匹配进程的列表,但要识别用户,我需要使用 OpenProcess。这适用于我自己的实例,但即使使用以管理员身份运行和 EnableDebugPriv,我仍然会收到拒绝访问消息。我错过了什么吗? iexplore.exe 是否受到某种保护?
这是我用于调试权限的内容:
void EnableDebugPriv()
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
wprintf(_T("ERROR %u\n"),GetLastError());
CloseHandle(hToken);
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!::AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL))
{
wprintf(_T("ERROR %u\n"),GetLastError());
CloseHandle(hToken);
return;
}
CloseHandle(hToken);
wprintf(_T("Should have worked"));
}
运行此程序时没有发生错误。运行时出现 ACCESS DENIED 错误
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_TERMINATE , FALSE, pe32.th32ProcessID );
对于不属于我的进程。 “其他”用户是从控制面板以正常方式在这台机器上创建的标准和访客帐户。任何想法将不胜感激。我被困住了!最终我想为用户提供关闭应用程序的能力,但即使只有 PROCESS_QUERY_LIMITED_INFORMATION 它也会失败。我仍然需要检查这是否是除 IE 之外的其他应用程序的问题。
更新我最终得到了这个工作。错误出现在 OpenProcessToken 中。而且我需要的特权与我要求的不同。
【问题讨论】:
-
即使你设法让它工作,你打算用进程句柄做什么?
-
嗨,我得到了这个工作。我需要它来定位进程的用户。
-
如果您只想识别拥有该进程的用户,那么您根本不需要打开该进程。使用
WTSEnumerateProcesses。它会一次性返回所有流程、它们的名称和所有者。 -
哇,我什至不知道。太棒了。
-
等等,显然 WTSEnumerateProcesses 在 XP 中是有限的。
标签: c++ winapi openprocess