PB 依据指定应用程序文件名返回PID

来源:互联网 发布:中国制造的实力 知乎 编辑:程序博客网 时间:2024/06/05 14:32

在做项目的二次开发中需要用到使用PB查找应用程序名称返回的PID, 主要参考两个论坛的帖子地址如下,因为一个是VB环境下的,各种变量类型与PB不同,需要进行转换,经过多次测试,整了一个整天终于搞定了,现把源码分享出来,以备后用。

VB爱好者乐园 和 CSDN

主要有三个函数 f_getpid, f_getpidusr , f_getuser

函数中需要引用的结构体

global type s_process from structureunsignedlongstructsizeunsignedlongusageunsignedlongprocessidunsignedlongdefaultheapidunsignedlongmoduleidunsignedlongthreadsunsignedlongparentprocessidunsignedlongclassbaseunsignedlongflagscharacterfilename[256]end type

global type sid_and_attributes from structureunsignedlongSIDunsignedlongAttributesend type

global type token_user from structuresid_and_attributesUsercharacterSID[500]end type

需要注册的API函数有

Function Long CreateToolhelp32Snapshot(Long Flags, Long ProcessId) Library "kernel32.dll" ALIAS FOR "CreateToolhelp32Snapshot;Ansi"Function Integer Process32First(ULong Snapshot, Ref s_Process Process) Library "kernel32.dll" ALIAS FOR "Process32First;Ansi"Function Integer Process32Next(ULong Snapshot, Ref s_Process Process) Library "kernel32.dll" ALIAS FOR "Process32Next;Ansi"FUNCTION ulong WNetGetUser(ref string lpName,ref string lpUserName,ref ulong lpnLength) LIBRARY "mpr.dll" ALIAS FOR "WNetGetUserA;Ansi"FUNCTION ulong OpenProcess(ulong dwDesiredAccess,ulong bInheritHandle,ulong dwProcessId) LIBRARY "kernel32.dll" ALIAS FOR "OpenProcess;Ansi"Function long OpenProcessToken(ulong ProcessHandle, ulong DesiredAccess, ref ulong TokenHandle) Library "advapi32.dll" ALIAS FOR "OpenProcessToken;Ansi"Function Long GetTokenInformation(Long TokenHandle, Long TokenInformationClass, ref token_user TokenInformation , Long TokenInformationLength,ref Long ReturnLength) Library "advapi32.dll"Function Long LookupAccountSidA(string lpSystemName, ulong Sid, ref string Name, ref Long cbName,ref string DomainName,ref Long cbDomainName, ref Int peUse) Library "advapi32.dll"  alias for "LookupAccountSidA;ansi"

1. f_getpid(String exename) 查询文件名为exename的进程的pid, 参数为可执行程序的文件名

global type f_getpid from function_objectend typeforward prototypesglobal function unsignedlong f_getpid (string as_exename)end prototypesglobal function unsignedlong f_getpid (string as_exename);s_Process lst_ProcessString ls_filename[1000] ,ls_curexename,ls_usrULong ln_ProcessID,ln_SameCount,ln_Snapshot,ln_Circle,ln_Count,ul_PID,hProcesslong l_pidul_PID = 0ln_Snapshot = CreateToolhelp32Snapshot(2,0)//创建快照失败IF (ln_Snapshot < 1) THEN RETURN 0//创建快照失败 296是windows决定的lst_Process.StructSize = 296IF Process32First(ln_Snapshot,lst_Process) = 0 THEN RETURN 0//枚举当前权限下的进程 DO WHILE 1 = 1IF Process32Next(ln_Snapshot,lst_Process) = 0 THEN EXITln_Count = ln_Count + 1ls_filename[ln_Count] = lst_Process.FilenameIF Lower(ls_filename[ln_Count]) = lower(as_exename) THEN//取得进程号 ul_PID = lst_Process.ProcessID//取得该进程的用户ls_usr = f_getpidusr(ul_PID)if ls_usr = f_getuser() then//f_msg(getpidusr(ul_PID))l_pid = long(string(ul_PID))end if//MessageBox(string(ul_PID),ls_FileName[ln_Count]) END IFLOOPlong l_i l_i = 1;RETURN l_pidend function
2. f_getpidusr(ulong processid) 查询进程id为processid的系统用户名, 参数为待查询的用户进程的pid

global type f_getpidusr from function_objectend typeforward prototypesglobal function string f_getpidusr (unsignedlong processid)end prototypesglobal function string f_getpidusr (unsignedlong processid);string ls_return,sAcctName2,sDomainName,sysnameulong hProcess,hTokenlong IR,GR,cbBuff,cbAcctName,cbDomainNameint peUsetoken_user usrConstant ulong TOKEN_ADJUST_PRIVILEGES = 32Constant ulong TOKEN_QUERY = 8constant long PROCESS_QUERY_INFORMATION = 1024hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, processid)//使该进程可读if hProcess > 0 then//f_msg(string(hProcess))IR = OpenProcessToken(hProcess, TOKEN_QUERY + TOKEN_ADJUST_PRIVILEGES, hToken)//f_msg("Token:" + string(hToken))if IR > 0 thenGR = GetTokenInformation(hToken, 1, usr, 256, cbBuff)//f_msg(string(GR))if GR > 0 thensAcctName2 = space(255)sDomainName = space(255)cbAcctName  = 255cbDomainName = 255long sidsid = usr.user.sidLookupAccountSidA(sysname,sid,sAcctName2,cbAcctName,sDomainName,cbDomainName,peUse)ls_return = sAcctName2//f_msg(sAcctName2)end ifend if//if IR =0 then//ll_last_error = GetLastError()//f_msg(string(ll_last_error))//end ifend ifreturn ls_returnend function

3. f_getuser() 查询当前登录的系统用户名

global type f_getuser from function_objectend typeforward prototypesglobal function string f_getuser ()end prototypesglobal function string f_getuser ();string ls_name, ls_usernameulong ll_lenll_len = 256ls_username = space(ll_len)setnull(ls_name)WNetGetUser(ls_Name,ls_UserName,ll_Len) //messagebox("系统登录用户名",ls_username)return ls_usernameend function


0 0
原创粉丝点击