两种方法实现枚举windows下运行进程
2012-08-08 14:08
495 查看
最近在做一个跨平台项目,要取关于当前用户信息所有的进程信息。由于不太熟悉windows下的api 所以也摸索了一下。在这里就整理下实现方法第一种方法:
typedef PIDList vector<long> ;
bool ProcessInfo::EnumCurrentUserProcess(PIDList& pids)
{
TCHAR iPUserName[MAX_PATH] = {0};
SID_NAME_USE snu;
TCHAR buffUsername[MAX_PATH] = {0};
TCHAR buffDomainname[MAX_PATH] = {0};
DWORD unSize;
DWORD dnSize;
std::string userName;
WTS_PROCESS_INFO* ppi;
WTS_PROCESS_INFO* tp;
DWORD ppin;
//返回特定服务上的活动进程
if (!getUserName(userName))
{
return false;
}
if(::WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppi, &ppin))
{
tp = ppi;
for(DWORD i = 0; i < ppin; i++)
{
unSize = sizeof(buffUsername);
dnSize = sizeof(buffDomainname);
if(LookupAccountSid(NULL, tp->pUserSid, buffUsername, &unSize, buffDomainname, &dnSize, &snu))
{
lstrcpy(iPUserName, buffUsername);
}
if (userName.compare(iPUserName))
{
pids.push_back(tp->ProcessId);
}
tp++;
}
//status.insert(pair(userName,))
::WTSFreeMemory(ppi);
}
}
//由于在windows好像貌似没有uid的概念,所以,我就暂时用用户名字去比对
bool ProcessInfo::getUserName(std::string& strUserName)//获取当前用户名
{
char cbUser[80] = {0};
DWORD cSize = 80;
if (GetUserName(cbUser,&cSize))
{
strUserName = cbUser;
return true;
}
return false;
}
第二种方法枚举所有进程,但是这个方法获取的结构体里没有所属用户的属性,所以不太方便。但是,这个结构体获取的进程信息很详细。windows为什么就不能像linux一样呢。什么都放到一个文件里,这样都方便许多
int main(int argc,char* argv[ ])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
//cout<<"CreateToolhelp32Snapshot 调用失败"<<endl;
return false;
}
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while(bMore)
{
std::wcout<<"进程ID:"<<pe32.th32ProcessID<<" 进程名称:"<<pe32.szExeFile<<std::endl;
bMore = ::Process32Next(hProcessSnap,&pe32);
}
::CloseHandle(hProcessSnap);
return true;
}
以上就是我整理的两种方法,只是一部分有些地方要修改。
typedef PIDList vector<long> ;
bool ProcessInfo::EnumCurrentUserProcess(PIDList& pids)
{
TCHAR iPUserName[MAX_PATH] = {0};
SID_NAME_USE snu;
TCHAR buffUsername[MAX_PATH] = {0};
TCHAR buffDomainname[MAX_PATH] = {0};
DWORD unSize;
DWORD dnSize;
std::string userName;
WTS_PROCESS_INFO* ppi;
WTS_PROCESS_INFO* tp;
DWORD ppin;
//返回特定服务上的活动进程
if (!getUserName(userName))
{
return false;
}
if(::WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppi, &ppin))
{
tp = ppi;
for(DWORD i = 0; i < ppin; i++)
{
unSize = sizeof(buffUsername);
dnSize = sizeof(buffDomainname);
if(LookupAccountSid(NULL, tp->pUserSid, buffUsername, &unSize, buffDomainname, &dnSize, &snu))
{
lstrcpy(iPUserName, buffUsername);
}
if (userName.compare(iPUserName))
{
pids.push_back(tp->ProcessId);
}
tp++;
}
//status.insert(pair(userName,))
::WTSFreeMemory(ppi);
}
}
//由于在windows好像貌似没有uid的概念,所以,我就暂时用用户名字去比对
bool ProcessInfo::getUserName(std::string& strUserName)//获取当前用户名
{
char cbUser[80] = {0};
DWORD cSize = 80;
if (GetUserName(cbUser,&cSize))
{
strUserName = cbUser;
return true;
}
return false;
}
第二种方法枚举所有进程,但是这个方法获取的结构体里没有所属用户的属性,所以不太方便。但是,这个结构体获取的进程信息很详细。windows为什么就不能像linux一样呢。什么都放到一个文件里,这样都方便许多
int main(int argc,char* argv[ ])
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
//cout<<"CreateToolhelp32Snapshot 调用失败"<<endl;
return false;
}
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while(bMore)
{
std::wcout<<"进程ID:"<<pe32.th32ProcessID<<" 进程名称:"<<pe32.szExeFile<<std::endl;
bMore = ::Process32Next(hProcessSnap,&pe32);
}
::CloseHandle(hProcessSnap);
return true;
}
以上就是我整理的两种方法,只是一部分有些地方要修改。
相关文章推荐
- windows下实现特定进程在指定的逻辑cpu下运行的方法.
- 两种方法实现Windows系统服务自动运行SVN
- 四种方法实现VC枚举系统当前进程
- 两种方法实现在HTML页面加载完毕后运行某个js
- 介绍两种方法来实现不用开浏览器就能运行php代码的方法
- 将一个已经运行的进程attach到固定CPU内核上的方法(linux,windows)
- JAVA用JNI方法调用C代码实现HelloWorld(含windows及ubuntu两种操作系统环境下的操作)
- 两种方法实现在HTML页面加载完毕后运行某个js
- 枚举系统内所有的运行进程以及杀死指定进程的方法
- C语言两种方法实现进程间 socket 通信
- 四种方法实现VC枚举系统当前进程
- 两种方法枚举进程加载的DLL
- 枚举窗口的两种方法(自己实现 AND API)
- python实现在windows服务中新建进程的方法
- ucos在s3c2410上运行过程整体剖析(9)---两种任务切换的实现方法
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Win32开发,取出当前所有运行中进程信息的方法
- 通过两种方法实现在HTML页面加载完毕后运行某个js
- 让程序在Windows CE系统启动时自动运行的两种方法
- python实现在windows服务中新建进程的方法
- 9种枚举枚举进程的方法及实现