script recibir que por pasar parametros parametro linea funcion español comandos comando python c winapi

que - recibir variables python



Lectura de los argumentos de la línea de comando de otro proceso(código C de Win32) (5)

Necesito poder enumerar los argumentos de línea de comando (si los hay) pasados ​​a otros procesos en ejecución. Ya tengo los PID de los procesos en ejecución en el sistema, así que básicamente necesito determinar los argumentos pasados ​​para procesarlos con un PID XXX dado.

Estoy trabajando en una pieza central de un módulo de Python para gestionar procesos . El código está escrito como una extensión de Python en C y estará envuelto por una biblioteca de Python de nivel superior. El objetivo de este proyecto es evitar la dependencia de libs de terceros, como las extensiones pywin32, o hacks feos como llamar a ''ps'' o taskkill en la línea de comandos, por lo que estoy buscando una forma de hacerlo en código C.

Lo busqué en Google y encontré algunas sugerencias breves de usar CreateRemoteThread () para insertarme en el otro proceso, luego ejecutar GetCommandLine () pero esperaba que alguien pudiera tener algunos ejemplos de código de trabajo y / o mejores sugerencias.

ACTUALIZACIÓN : He encontrado un código de demostración operativo completo y una solución que usa NtQueryProcessInformation en CodeProject: http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx - No es ideal ya que no es compatible "eliminar la información directamente de las estructuras NTDLL pero viviré con eso. Gracias a todos por las sugerencias.

ACTUALIZACIÓN 2 : Logré a través de Google para desenterrar una versión en C que no usa código C ++, y es un poco más directo / concisa apuntado hacia este problema. Ver http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/ para más detalles.

¡Gracias!


La solución en caché: 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

También: 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


Si no eres el padre de estos procesos, entonces esto no es posible usando funciones documentadas :( Ahora, si eres el padre, puedes hacer tu truco CreateRemoteThread, pero de lo contrario casi seguro obtendrás acceso denegado a menos que tu aplicación derechos de administrador.


El enfoque de WMI mencionado en otra respuesta es probablemente la forma más confiable de hacerlo. Al mirar a través de MSDN, descubrí lo que parece ser otro enfoque posible; está documentado, pero no está claro si es totalmente compatible. En el lenguaje de MSDN, it--

puede estar alterado o no disponible en futuras versiones de Windows ...

En cualquier caso, siempre que su proceso tenga los permisos adecuados, debe poder llamar a NtQueryProcessInformation con ProcessInformationClass de ProcessBasicInformation . En la estructura devuelta PROCESS_BASIC_INFORMATION , debe recuperar un puntero al bloque de ejecución de proceso del proceso de destino (como el campo PebBaseAddress ). El campo ProcessParameters del PEB le dará un puntero a una estructura RTL_USER_PROCESS_PARAMETERS . El campo CommandLine de esa estructura será una estructura UNICODE_STRING . (Tenga cuidado de no hacer demasiadas suposiciones sobre la cadena, no hay garantías de que tendrá terminación NULL, y no está claro si tendrá que quitar o no el nombre de la aplicación ejecutada desde el comienzo de la cadena. línea de comando.)

No he probado este enfoque, y como mencioné anteriormente, parece un poco ... dudoso (léase: no portátil), pero podría valer la pena intentarlo. La mejor de las suertes...


Para responder a mi propia pregunta, finalmente encontré una solución de CodeProject que hace exactamente lo que estoy buscando:

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

Como @Reuben ya señaló, puede usar NtQueryProcessInformation para recuperar esta información. Desafortunadamente, no es un enfoque recomendado, pero dado que la única otra solución parece ser incurrir en los gastos generales de una consulta de WMI, creo que tomaremos este enfoque por el momento.

Tenga en cuenta que esto parece no funcionar si se usa código compilado desde 32 bits de Windows en un sistema operativo Windows de 64 bits, pero dado que nuestros módulos se compilan desde el origen en el destino, esto debería estar bien para nuestros propósitos. Prefiero usar este código existente y si se rompe en Windows 7 o en una fecha posterior, podemos volver a mirar el uso de WMI. Gracias por las respuestas!

ACTUALIZACIÓN : Aquí se ilustra una versión más concisa y única de C (a diferencia de C ++) de la misma técnica:

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