代码之家  ›  专栏  ›  技术社区  ›  Jay

读取另一个进程的命令行参数(Win32 C代码)

  •  9
  • Jay  · 技术社区  · 17 年前

    我需要能够列出传递给其他运行进程的命令行参数(如果有)。我已经有了系统上正在运行的进程的PID,所以基本上我需要用给定的PID确定传递给进程的参数 XXX

    我正在制作一个 Python module for managing processes . 代码以C语言作为Python扩展编写,并将由更高级别的Python库包装。这个项目的目标是避免依赖于第三方lib,比如pywin32扩展,或者在命令行上调用'ps'或taskkill等丑陋的黑客行为,所以我正在寻找一种在C代码中实现这一点的方法。

    我在谷歌上搜索了一下,找到了一些关于使用的简短建议 CreateRemoteThread() 将自己注入另一个进程,然后运行 GetCommandLine() 但我希望有人能提供一些工作代码示例和/或更好的建议。

    使现代化 http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx

    更新2 我通过更多的谷歌搜索来挖掘一个不使用C++代码的C版本,并且对这个问题有一个更直接的/简洁的说明。看见 http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/ 详情请参阅。

    5 回复  |  直到 17 年前
        1
  •  6
  •   Community Mohan Dere    6 年前

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

    正如@Reuben已经指出的,您可以使用 NtQueryProcessInformation 检索此信息。不幸的是,这不是一种推荐的方法,但考虑到唯一的解决方案似乎是产生WMI查询的开销,我认为我们现在将采用这种方法。

    请注意,如果在64位Windows操作系统上使用从32位Windows编译的代码,这似乎不起作用,但因为我们的模块是从目标系统上的源代码编译的,这对于我们来说应该是正常的。我更愿意使用这个现有的代码,如果它在Windows7或更高版本中出现问题,我们可以再次考虑使用WMI。谢谢你的回复!

    使现代化 :同一技术的更简洁且仅限于C(与C++相反)版本如下所示:

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

        2
  •  5
  •   Ironicnet    17 年前

    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
    

    也: 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
    
        3
  •  3
  •   Giampaolo Rodolà    11 年前

    https://github.com/giampaolo/psutil ):

    >>> import psutil, os
    >>> psutil.Process(os.getpid()).cmdline()
    ['C:\\Python26\\python.exe', '-O']
    >>> 
    
        4
  •  2
  •   reuben Omranic    17 年前

    可信赖的

    可能在中被更改或不可用 Windows的未来版本。。。

    在任何情况下,只要您的进程具有正确的权限,您应该能够调用 NtQueryProcessInformation ProcessInformationClass 属于 ProcessBasicInformation . 在返回的 PROCESS_BASIC_INFORMATION 结构,则应该返回一个指向目标进程 process execution block (作为字段) PebBaseAddress ProcessParameters RTL_USER_PROCESS_PARAMETERS 结构这个 CommandLine 该结构的字段将是一个 UNICODE_STRING 结构(注意不要对字符串做太多假设;不能保证它以NULL结尾,也不清楚是否需要从命令行的开头去掉已执行应用程序的名称。)

    我还没有尝试过这种方法——正如我上面提到的,它似乎有点。。。不确定(阅读:不可移植)——但可能值得一试。祝你好运。。。

        5
  •  0
  •   Ana Betts    17 年前

    如果您不是这些进程的父进程,那么使用文档化的函数是不可能做到这一点的:(现在,如果您是父进程,您可以使用CreateRemoteThread技巧,但是如果您的应用程序没有管理员权限,您几乎肯定会被拒绝访问。