zoukankan      html  css  js  c++  java
  • 获取进程列表及相关信息

    闲着没事,看着任务管理器好玩,查资料先简单实现一下,代码中没有加入获取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

     
  • 相关阅读:
    IP查询网和traceroute找到的网络出口不一致的原因
    [转载] 深入理解VMware虚拟机网络通信原理
    https工作流程
    HTTP1.1协议-RFC2616-中文版
    条件变量调用Signal的时候是否需要持有mutex
    HTTP Get一定是幂等的吗,统计访问量的时候呢?
    unix网络编程
    MySQL-SQL基础-DCL
    MySQL-SQL基础-查询1
    MySQL-SQL基础-子查询
  • 原文地址:https://www.cnblogs.com/findumars/p/5001991.html
Copyright © 2011-2022 走看看