Reading Command Line Arguments of Another Process (Win32 C code)

后端 未结 5 1554
甜味超标
甜味超标 2020-12-16 02:41

I need to be able to list the command line arguments (if any) passed to other running processes. I have the PIDs already of the running processes on the system, so basically

相关标签:
5条回答
  • 2020-12-16 03:18

    By using psutil ( https://github.com/giampaolo/psutil ):

    >>> import psutil, os
    >>> psutil.Process(os.getpid()).cmdline()
    ['C:\\Python26\\python.exe', '-O']
    >>> 
    
    0 讨论(0)
  • 2020-12-16 03:28

    If you aren't the parent of these processes, then this is not possible using documented functions :( Now, if you're the parent, you can do your CreateRemoteThread trick, but otherwise you will almost certainly get Access Denied unless your app has admin rights.

    0 讨论(0)
  • 2020-12-16 03:30

    To answer my own question, I finally found a CodeProject solution that does exactly what I'm looking for:

    http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx

    As @Reuben already pointed out, you can use NtQueryProcessInformation to retrieve this information. Unfortuantely it's not a recommended approach, but given the only other solution seems to be to incur the overhead of a WMI query, I think we'll take this approach for now.

    Note that this seems to not work if using code compiled from 32bit Windows on a 64bit Windows OS, but since our modules are compiled from source on the target that should be OK for our purposes. I'd rather use this existing code and should it break in Windows 7 or a later date, we can look again at using WMI. Thanks for the responses!

    UPDATE: A more concise and C only (as opposed to C++) version of the same technique is illustrated here:

    http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/

    0 讨论(0)
  • 2020-12-16 03:33

    The WMI approach mentioned in another response is probably the most reliable way of doing this. Looking through MSDN, I spotted what looks like another possible approach; it's documented, but its not clear whether it's fully supported. In MSDN's language, it--

    may be altered or unavailable in future versions of Windows...

    In any case, provided that your process has the right permissions, you should be able to call NtQueryProcessInformation with a ProcessInformationClass of ProcessBasicInformation. In the returned PROCESS_BASIC_INFORMATION structure, you should get back a pointer to the target process's process execution block (as field PebBaseAddress). The ProcessParameters field of the PEB will give you a pointer to an RTL_USER_PROCESS_PARAMETERS structure. The CommandLine field of that structure will be a UNICODE_STRING structure. (Be careful not too make too many assumptions about the string; there are no guarantees that it will be NULL-terminated, and it's not clear whether or not you'll need to strip off the name of the executed application from the beginning of the command line.)

    I haven't tried this approach--and as I mentioned above, it seems a bit... iffy (read: non-portable)--but it might be worth a try. Best of luck...

    0 讨论(0)
  • 2020-12-16 03:35

    The cached solution: http://74.125.45.132/search?q=cache:-wPkE2PbsGwJ:windowsxp.mvps.org/listproc.htm+running+process+command+line&hl=es&ct=clnk&cd=1&gl=ar&client=firefox-a

    in CMD
    WMIC /OUTPUT:C:\ProcessList.txt PROCESS get Caption,Commandline,Processid
    
    or
    
    WMIC /OUTPUT:C:\ProcessList.txt path win32_process get Caption,Processid,Commandline
    

    Also: http://mail.python.org/pipermail/python-win32/2007-December/006498.html

    http://tgolden.sc.sabren.com/python/wmi_cookbook.html#running_processes 
    seems to do the trick:
    
    import wmi
    c = wmi.WMI ()
    for process in c.Win32_Process ():
      print process.CommandLine
    
    0 讨论(0)
提交回复
热议问题