动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   服务器 → 阅读文章
  

 获取NT中系统进程的路径

作者来源:51CTO.com整理  
阅读 数 229 人次 , 2006-3-18 13:38:00 

程序说明

自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)

{

TOKEN_PRIVILEGES tkp;

LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限

tkp.PrivilegeCount=1;

tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

return( (GetLastError()==ERROR_SUCCESS) );

}

通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。

具体实践

/*

* ShowProcessPath 2.0

* 版权所有 (C) 2005 赵春生

* 2005.09.02

* http://timw.yeah.net

* http://timw.126.com

* 本程序适用于:WinNT

* 代码在Win2000P+SP4 + VC6+SP6测试通过

*/

#include <stdio.h>

#include <windows.h>

#include "PSAPI.H"

#pragma comment( lib, "PSAPI.LIB" )

//自定义函数:赋予指定特权。这里用来提升程序权限。

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);

int main(void)

{

DWORD processid[1024],needed,processcount,i;

HANDLE hProcess;

HMODULE hModule;

char path[MAX_PATH] = "",temp[256];

HANDLE hToken;

printf("ShowProcessPath 2.0 with [Process Status API]\n\n");

if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )

{

if (EnablePrivilege(hToken,SE_DEBUG_NAME))

{

EnumProcesses(processid, sizeof(processid), &needed);

processcount=needed/sizeof(DWORD);

for (i=0;i<processcount;i++)

{

hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);

if (hProcess)

{

EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);

GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));

GetShortPathName(path,path,256);

itoa(processid[i],temp,10);

printf("%s --- %s\n",path,temp);

}

else

printf("Failed!!!\n");

}

}

}

CloseHandle(hProcess);

CloseHandle(hModule);

itoa(processcount,temp,10);

printf("\nProcess Count:%s\n\n",temp);

return 0;

}

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)

{

TOKEN_PRIVILEGES tkp;

LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限

tkp.PrivilegeCount=1;

tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

return( (GetLastError()==ERROR_SUCCESS) );

}

以上代码在Win2000P+SP4 + VC6+SP6测试通过。



 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:服务器中的进程管理
· 下一篇:结束Windows系统进程的方法
· WEB服务器之旅:Apache2.0 王者归来
· 利用twig架设WebMail系统(2)
· 站点FTP参数设置
· 企业Sendmail邮件服务器的创建(3)
· 网管手记:传真服务器架设一点通


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077