huaisha1224 发表于 2011-9-19 19:02:26

获取进程相对应的版本号-有部分进程获取不到【已解决】

本帖最后由 huaisha1224 于 2011-9-26 10:27 编辑

我想查询到进程所对应的版本号(比如QQ这个进程 我查到的版本号就是)
我现在的方式是这样的
1、先通过ProcessExists获取进程ID、
2、然后再通过进程ID获取到进程的映像路径
3、最后使用FileGetVersion来获取程序的版本

但是在我完成代码时候发现有一些进程获取不到映像路径当然也获取不到进程的版本号
只有一部分进程的映像路径可以获取得到{:face (52):}

我现在的代码如下:;通过进程获得程序路径、然后获取程序的版本号
Local $procName="qq.exe"
Local $ProcID=ProcessExists($procName)
Local $nVer

If ($ProcID) Then
    MsgBox(0, "进程路径", "进程路径:" & _ProcessGetLocation($ProcID))

EndIf


$nVer = FileGetVersion(_ProcessGetLocation($ProcID),"FileVersion")
MsgBox(0,"范例","程序版本:" &$nVer)


Func _ProcessGetLocation($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
    Return $aReturn
EndFunc我把论坛里面的帖子都翻转了都没有找到相关的内容
请高手指点指点
或者有其他办法能够通过进程来获取到相应的版本号的话也是可以的
求指点

huaisha1224 发表于 2011-9-19 19:05:30

我在论坛有前辈用_WinAPI_GetModuleFileNameEx来实现的
但是我发现最新版本的AU3里面没有这个_WinAPI_GetModuleFileNameEx

pusofalse 发表于 2011-9-19 21:53:45

你要处理一下GetModuleFileNameEx返回的路径,比如winlogon.exe进程返回的路径是\??\C:\WINDOWS\SYSTEM32\winlogon.exe,前面会有“\??\”。获取csrss.exe的路径,还要开启SeDebugPrivilege特权。

huaisha1224 发表于 2011-9-20 10:02:03

这么复杂的呀

58fly 发表于 2011-9-20 10:05:08

你要处理一下GetModuleFileNameEx返回的路径,比如winlogon.exe进程返回的路径是\??\C:\WINDOWS\SYSTEM32\w ...
pusofalse 发表于 2011-9-19 21:53 http://www.autoitx.com/images/common/back.gif


    这就很麻烦了,P版有成型的代码吗

huaisha1224 发表于 2011-9-20 14:22:41

有没有其他比较简便的可行方案

gzh888666 发表于 2011-9-20 16:30:54

3恨的#Include <WinAPIEx.au3>
#include <array.au3>

$list = ProcessList()
ReDim $list
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 1)

for $i=1 to $list
                $list[$i]=_WinAPI_GetProcessFileName($list[$i])
Next

_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 2)
_WinAPI_CloseHandle($hToken)

_arraydisplay($list)

huaisha1224 发表于 2011-9-21 13:44:57

回复 7# gzh888666
这个方式的话可以获取到程序的路径的、可是怎么样吧获取的路径赋值给另外一个变量
比如:
$nRoute
$nVer
通过这个方式获取到了程序的映像路径并赋值吧这个路径赋值给$nRoute
然后用FileGetVersion去获取这个路径下面的程序版本号赋值给$nVer

gzh888666 发表于 2011-9-21 13:52:00

回复gzh888666
这个方式的话可以获取到程序的路径的、可是怎么样吧获取的路径赋值给另外一个变量
比如 ...
huaisha1224 发表于 2011-9-21 13:44 http://www.autoitx.com/images/common/back.gif


    其实这个帖子正像P版所说的那样,winlogon.exe, csrss.exe路径的问题并没有加以判断。还需要你自己完善,
路径赋值给另外一个变量用得到的数组进行传递就可以了!
_arraydisplay($list)
里面不是已经显示好了多维数组的值了吗?

gzh888666 发表于 2011-9-21 13:59:18

本帖最后由 gzh888666 于 2011-9-21 14:05 编辑

我以前有个未完成的工具,正好符合你的要求,如果想正确显示winlogon.exe路径可以使用:$objWMIService = ObjGet("winmgmts:\\.\root\CIMV2:win32_process")
$colItems = $objWMIService.instances_
For $objItem In $colItems
$Name = $objItem.Name
$Pid = $objItem.ProcessId   
$Path = $objItem.executablepath
      If $Name="System Idle Process" Then ContinueLoop
      If $Name="System" Then ContinueLoop
      _GUICtrlListView_AddItem($nListView, $Name, 0);添加项目到列表的末尾
    _GUICtrlListView_AddSubItem($nListView,$n, $Pid , 1);写入控件子项
      _GUICtrlListView_AddSubItem($nListView, $n,$Path, 2);写入控件子项
      _GUICtrlListView_AddSubItem($nListView,$n,$Status,3);写入控件子项
      $n += 1
Next
csrss求教一下P版吧!我也不会开启SeDebugPrivilege特权!

netegg 发表于 2011-9-21 14:24:59

本帖最后由 netegg 于 2011-9-21 14:27 编辑

_winapi_getprocesscommandline试试看
页: [1]
查看完整版本: 获取进程相对应的版本号-有部分进程获取不到【已解决】