【发布时间】:2021-12-23 03:41:48
【问题描述】:
我最近希望列出机器的每个进程以执行某些操作。但是我正在努力处理不是从我的用户(例如:系统、管理员或其他用户)启动的进程。
我尝试了一些代码和一些解决方案,但仍然有任何可行的方法。
我正在编写微软提出的枚举所有进程的代码。
代码如下:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1
void PrintProcessNameAndID( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
// Get the process name.
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
// Print the process name and identifier.
_tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID );
// Release the handle to the process.
CloseHandle( hProcess );
}
int main( void )
{
// Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
return 1;
}
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the name and process identifier for each process.
for ( i = 0; i < cProcesses; i++ )
{
if( aProcesses[i] != 0 )
{
PrintProcessNameAndID( aProcesses[i] );
}
}
return 0;
}
此代码有效,但不允许您查看其他用户的进程。你有什么想法吗?
感谢大家的宝贵时间。 问候
【问题讨论】:
-
如果您在提升模式下以管理员身份运行您的程序是否可以工作?
-
你说的不允许你查看其他用户的进程是什么意思?您甚至没有获得他们的 processID,或者您只是无法获得他们的名字?
-
您不太可能获得
PROCESS_VM_READ访问其他用户启动的进程的权限。如果您完成了基本的错误处理,您已经获得了这么多信息。 -
@SergeBallesta 从另一个用户运行的每个进程的名称将是“
”。因此,如果我不知道 PID,我将无法获取进程名称。 -
@TedLyngmo 这不起作用,因为它只会捕获来自管理员用户的进程。