获取进程列表及相关信息

闲着没事,看着任务管理器好玩,查资料先简单实现一下,代码中没有加入获取CPU占用率的代码,这个代码网上很多,只是不喜欢那种写法,这里就不写了。以后继续完善,对于System Process和System的信息还没法获得,那位兄弟知道可以提个醒。

代码如下

[delphi] view plaincopy
 
  1. unit Main;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs,TlHelp32, StdCtrls, ComCtrls,psAPI;  
  8.   
  9. type  
  10.   PTokenUser   =   ^TTokenUser;  
  11.   _TOKEN_USER   =   record  
  12.   User:   TSIDAndAttributes;  
  13.   end;  
  14.   TTokenUser   =   _TOKEN_USER;  
  15.   
  16.   
  17.   TForm1 = class(TForm)  
  18.     btn_Get: TButton;  
  19.     Lv_Process: TListView;  
  20.     procedure btn_GetClick(Sender: TObject);  
  21.     procedure FormCreate(Sender: TObject);  
  22.   private  
  23.     { Private declarations }  
  24.     function GetMemUsedText(memsize:Cardinal):string;  
  25.     function GetProcessPriority(priority:Cardinal):string;  
  26.     function GetCupUsedPercent(hprocess:THandle):string;  
  27.     function GetProcessUser(hprocess:THandle):string;  
  28.   public  
  29.     { Public declarations }  
  30.   end;  
  31.   
  32. var  
  33.   Form1: TForm1;  
  34.   
  35. implementation  
  36.   
  37. {$R *.dfm}  
  38.   
  39. 作用:提权到Debug,为了在Vista和Win7下读取系统信息,运行时需要以管理员身份运行 
  40. }  
  41. function PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean;  
  42. var  
  43.     Token:cardinal;  
  44.     TokenPri:_TOKEN_PRIVILEGES;  
  45.     Luid:int64;  
  46.     i:DWORD;  
  47. begin  
  48.     Result:=false;  
  49.     //打开令牌  
  50.     if OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES,Token) then  
  51.     begin  
  52.       //看系统权限的特权值  
  53.         if LookupPrivilegeValue(nil,Token_Name,Luid) then  
  54.         begin  
  55.             TokenPri.PrivilegeCount:=1;  
  56.             TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;  
  57.             TokenPri.Privileges[0].Luid:=Luid;  
  58.             i:=0;  
  59.             //提权  
  60.             if AdjustTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) then  
  61.                 Result:=true;  
  62.         end;  
  63.     end;  
  64.     CloseHandle(Token);  
  65. end;  
  66.   
  67. function AddFileTimes(KernelTime, UserTime: TFileTime): TDateTime;  
  68. var  
  69.   SysTimeK, SysTimeU: TSystemTime;  
  70. begin  
  71.   FileTimeToSystemTime(KernelTime, SysTimeK);  
  72.   FileTimeToSystemTime(UserTime, SysTimeU);  
  73.   Result :=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU);  
  74. end;  
  75.   
  76. //获取CPU时间  
  77. function GetProcCPUTime(procID:THandle): TDateTime;  
  78. var  
  79.   CreationTime, ExitTime, KernelTime, UserTime: TFileTime;  
  80. begin  
  81.   GetProcessTimes(procID, CreationTime, ExitTime, KernelTime,UserTime);  
  82.   Result := AddFileTimes(KernelTime, UserTime);  
  83. end;  
  84.   
  85. procedure TForm1.btn_GetClick(Sender: TObject);  
  86. var  
  87.   hSnapShot,hProcess,hModel:THandle;  
  88.   pEntry:TProcessEntry32;  
  89.   find:Boolean;  
  90.   item:TListItem;  
  91.   //内存信息  
  92.   pPMC:PPROCESS_MEMORY_COUNTERS;  
  93.   pPMCSize,ProcessPriority:Cardinal;  
  94.   n:DWORD;  
  95.   fName:array [0..MAX_PATH-1] of char;  
  96. begin  
  97.   //创建进程快照  
  98.   hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  99.   pEntry.dwSize := SizeOf(pEntry);  
  100.   //第一个进程  
  101.   find := Process32First(hSnapShot,pEntry);  
  102.   while find do  
  103.   begin  
  104.     item := Lv_Process.Items.Add;  
  105.     //进程名  
  106.     item.Caption := pEntry.szExeFile;  
  107.     //进程ID  
  108.     item.SubItems.Add(IntToStr(pEntry.th32ProcessID));  
  109.     pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);  
  110.     GetMem(pPMC,pPMCSize);  
  111.     pPMC.cb := pPMCSize;  
  112.     //打开进程,增加PROCESS_VM_READ权限,以便后面获取完整路径时使用  
  113.     hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,pEntry.th32ProcessID);  
  114.     //获取内存信息  
  115.     if GetProcessMemoryInfo(hProcess,pPMC,pPMCSize) then  
  116.     begin  
  117.       //取得进程的用户  
  118.       item.SubItems.Add(GetProcessUser(hProcess));  
  119.       //内存使用  
  120.       item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize));  
  121.       //内存峰值  
  122.       item.SubItems.Add(GetMemUsedText(pPMC.PeakWorkingSetSize));  
  123.       //CPU时间  
  124.       item.SubItems.Add(FormatDateTime('hh:mm:ss',GetProcCPUTime(hProcess)));  
  125.       //获取优先级  
  126.       ProcessPriority := GetPriorityClass(hProcess);  
  127.       item.SubItems.Add(GetProcessPriority(ProcessPriority));  
  128.       //根据进程句柄找到模块句柄  
  129.       ENumProcessModules(hProcess,@hModel,SizeOf(hModel),n);  
  130.       //取得完整路径  
  131.       GetModuleFileNameEx(hProcess,hModel,fName,Length(fName));  
  132.       item.SubItems.Add(fName);  
  133.     end;  
  134.     FreeMem(pPMC);  
  135.     CloseHandle(hProcess);  
  136.     find := Process32Next(hSnapShot,pEntry);  
  137.   end;  
  138. end;  
  139.   
  140. function TForm1.GetCupUsedPercent(hprocess: THandle): string;  
  141. begin  
  142. end;  
  143.   
  144. function TForm1.GetMemUsedText(memsize: Cardinal): string;  
  145. begin  
  146.   Result := IntToStr(memsize div 1024) + ' K';  
  147. end;  
  148.   
  149. function TForm1.GetProcessPriority(priority: Cardinal): string;  
  150. begin  
  151.   case priority of  
  152.     IDLE_PRIORITY_CLASS: Result := '低';  
  153.     NORMAL_PRIORITY_CLASS: Result := '普通';  
  154.     HIGH_PRIORITY_CLASS: Result := '高';  
  155.     REALTIME_PRIORITY_CLASS: Result := '实时';  
  156.   end;  
  157. end;  
  158.   
  159. //获取进程的所属用户  
  160. function TForm1.GetProcessUser(hprocess: THandle): string;  
  161. var  
  162.   hToken:THandle;  
  163.   dwSize,dwUserSize,dwDomainSize:DWORD;  
  164.   pUser:PTokenUser;  
  165.   szUserName, szDomainName: array of Char;  
  166.   peUse:   SID_NAME_USE;  
  167. begin  
  168.   //打开权限  
  169.   if not OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit;  
  170.   //获取令牌信息,这里第三个参数使用了nil,是先返回实际大小dwSize,然后根据这个大小去分配内存  
  171.   GetTokenInformation(hToken,TokenUser,nil,0,dwSize);  
  172.   pUser := nil;  
  173.   //分配空间  
  174.   ReallocMem(pUser,dwSize);  
  175.   dwUserSize := 0;  
  176.   dwDomainSize := 0;  
  177.   //获取信息  
  178.   if not GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) then Exit;  
  179.   //查找用户信息,先返回用户名和域名的大小,当然你也可以一次性得到,即不使用动态数组  
  180.   LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize,nil,dwDomainSize,peUse);  
  181.   if (dwUserSize <> 0) and (dwDomainSize <> 0) then  
  182.   begin  
  183.     //分配长度  
  184.     SetLength(szUserName,dwUserSize);  
  185.     SetLength(szDomainName,dwDomainSize);  
  186.     //再次,获取用户名和域名  
  187.     LookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName),dwDomainSize,peUse);  
  188.   end;  
  189.   Result := PChar(szUserName)+'/'+PChar(szDomainName);  
  190.   CloseHandle(hToken);  
  191.   FreeMem(pUser);  
  192. end;  
  193.   
  194. procedure TForm1.FormCreate(Sender: TObject);  
  195. begin  
  196.   PromoteProcessPrivilege(GetCurrentProcess,'SeDebugPrivilege');  
  197. end;  
  198.   
  199. end.  

运行图片

 

http://blog.csdn.net/bdmh/article/details/6169949

 
原文地址:https://www.cnblogs.com/findumars/p/5001991.html