请教python枚举进程所有模块名称,总是出错。

请教python枚举进程所有模块名称,总是出错。

先看代码
import win32security,win32api,win32con, win32process
new_privs = (
             (win32security.LookupPrivilegeValue('',win32security.SE_SECURITY_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_TCB_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_SHUTDOWN_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_RESTORE_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_TAKE_OWNERSHIP_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_CREATE_PERMANENT_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_ENABLE_DELEGATION_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_CHANGE_NOTIFY_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_DEBUG_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_PROF_SINGLE_PROCESS_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_SYSTEM_PROFILE_NAME),win32con.SE_PRIVILEGE_ENABLED),
             (win32security.LookupPrivilegeValue('',win32security.SE_LOCK_MEMORY_NAME),win32con.SE_PRIVILEGE_ENABLED)
            
            )

new = ((8,0),(win32security.LookupPrivilegeValue('',win32security.SE_DEBUG_NAME),win32con.SE_PRIVILEGE_ENABLED))
def OpenToken():
    #pid=win32api.GetCurrentProcessId()
    #ph=win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION|win32con.PROCESS_VM_READ,0,pid)
    th = win32security.OpenProcessToken(win32api.GetCurrentProcess(),win32security.TOKEN_ALL_ACCESS|win32con.TOKEN_ADJUST_PRIVILEGES)
    old_privs=win32security.AdjustTokenPrivileges(th,0,new_privs)
    print old_privs
        
if __name__ == '__main__':
    OpenToken()
    plist = win32process.EnumProcesses()
    hd = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS,0,2200)
    hm = win32process.EnumProcessModules(hd)   
    for i in hm:
        print win32process.GetModuleFileNameEx(hd,i)
   

用 GetModuleFileName() 方法提示:
Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "G:\processtest.py", line 32, in <module>
    print win32process.GetModuleFileName(i)
AttributeError: 'module' object has no attribute 'GetModuleFileName'

用GetModuleFileNameEx 显示不完整。
发个帖子firefox崩溃5次....
我主要想看看Python 的ctypes winapi接口试下效果,没想到,这么多问题。



请帮忙看看什么问题。ActiveState ActivePython 2.5.2
D:\Program Files\EditPlus\editplus.exe
C:\WINDOWS\system32\ntdll.dll
C:\WINDOWS\system32\kernel32.dll
C:\WINDOWS\system32\USER32.dll
C:\WINDOWS\system32\GDI32.dll
C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\COMCTL32.dll
C:\WINDOWS\system32\msvcrt.dll
C:\WINDOWS\system32\ADVAPI32.dll
C:\WINDOWS\system32\RPCRT4.dll
C:\WINDOWS\system32\SHLWAPI.dll
C:\WINDOWS\system32\VERSION.dll
C:\WINDOWS\system32\comdlg32.dll
C:\WINDOWS\system32\SHELL32.dll
C:\WINDOWS\system32\WINSPOOL.DRV
C:\WINDOWS\system32\oledlg.dll
C:\WINDOWS\system32\ole32.dll
C:\WINDOWS\system32\IMM32.DLL
C:\WINDOWS\system32\LPK.DLL
C:\WINDOWS\system32\USP10.dll
C:\WINDOWS\system32\SETUPAPI.dll
C:\WINDOWS\system32\MSCTF.dll
C:\WINDOWS\system32\msctfime.ime
C:\WINDOWS\system32\UxTheme.dll
C:\WINDOWS\system32\xpsp2res.dll
C:\WINDOWS\system32\USERENV.dll


代码显示的是我机器上EditPlus 的processID,测试请修改下ID,结果看上面,显示不完整,就停住了....不理解。
既然说win32process里没有GetModuleFileName这个函数,试试win32api. GetModuleFileName吧。
我上面贴错了。实际错误提示是。
Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Documents and Settings\Administrator\桌面\test.py", line 32, in <module>
    print win32api.GetModuleFileName(i)
error: (0, 'GetModuleFileName', 'No error message is available')
枚举当前 pythonwin 的进程就可以完整的得到模块名

我估计是权限的问题。


QUOTE:
原帖由 jasonnbfan 于 2008-8-20 09:00 发表
我上面贴错了。实际错误提示是。
Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in ...

居然还有这种错误……无语……
搞明白了 用这个print hex(i),win32process.GetModuleFileNameEx(hd,i) 就可以
win32api.GetModuleFileName() 这个方法估计有问题....