2009-01-13 9 views
9

Ich muss in der Lage sein, die Befehlszeilenargumente (falls vorhanden) an andere laufende Prozesse zu übergeben. Ich habe die PIDs der laufenden Prozesse bereits auf dem System, also muss ich im Grunde die Argumente bestimmen, die mit dem gegebenen PID XXX verarbeitet werden.Lesen von Befehlszeilenargumenten eines anderen Prozesses (Win32-C-Code)

Ich arbeite an einem Kernstück von Python module for managing processes. Der Code wird in C als Python-Erweiterung geschrieben und von einer übergeordneten Python-Bibliothek umschlossen. Das Ziel dieses Projekts ist es, die Abhängigkeit von Drittanbieter-Bibliotheken wie den pywin32-Erweiterungen oder hässlichen Hacks wie dem Aufruf von 'ps' oder taskkill in der Befehlszeile zu vermeiden. Daher suche ich nach einer Möglichkeit, dies in C-Code zu tun.

Ich habe diese herum gegoogelt und einige kurze Vorschläge zur Verwendung CreateRemoteThread() gefunden, um mich in den anderen Prozess zu injizieren, dann GetCommandLine() laufen, aber ich hatte gehofft, jemand könnte einige funktionierende Codebeispiele und/oder bessere Vorschläge haben.

UPDATE: Ich habe volle Arbeits Demo-Code gefunden und eine Lösung NtQueryProcessInformation auf Codeproject mit: http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx - Es ist nicht ideal, da es „nicht unterstützt“ ist die Information direkt aus den NTDLL Strukturen keulen, aber ich werde damit leben . Danke an alle für die Vorschläge.

UPDATE 2: Ich habe durch mehr Googling geschafft, um eine C-Version zu graben, die nicht C++ - Code verwendet, und ist ein wenig direkter/prägnant auf dieses Problem hingewiesen. Einzelheiten finden Sie unter http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/.

Danke!

Antwort

6

Um meine eigene Frage zu beantworten, ich fand schließlich eine Codeproject-Lösung, die genau das tut, was ich suche:

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

Wie @Reuben bereits erwähnt, können Sie Verwenden Sie NtQueryProcessInformation, um diese Informationen abzurufen. Leider ist es kein empfohlener Ansatz, aber da die einzige andere Lösung darin besteht, den Overhead einer WMI-Abfrage zu übernehmen, denke ich, dass wir diesen Ansatz vorerst anwenden werden.

Beachten Sie, dass dies nicht funktioniert, wenn Code aus 32-Bit-Windows auf einem 64-Bit-Windows-Betriebssystem kompiliert wird, aber da unsere Module aus der Quelle auf dem Ziel kompiliert werden, sollte das für unsere Zwecke in Ordnung sein. Ich würde lieber diesen vorhandenen Code verwenden und sollte es in Windows 7 oder einem späteren Datum einbrechen, können wir uns wieder mit WMI befassen. Danke für die Antworten!

UPDATE: nur eine knappe und C (im Gegensatz zu C++) Version der gleichen Technik wird hier dargestellt:

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

0

Wenn Sie nicht die Eltern dieser Prozesse sind, dann ist dies nicht mit dokumentierten Funktionen möglich :(Jetzt, wenn Sie der Elternteil sind, können Sie Ihre CreateRemoteThread-Trick tun, aber sonst werden Sie fast sicher Zugriff verweigert es sei denn, Ihre Anwendung hat Admin-Rechte

+0

Ich habe jetzt Code im Modul, der SeDebug-Rechte erhält, wenn möglich, also wenn sie ein Admin-Benutzer sind, sollten wir die erforderlichen Rechte haben, richtig? – Jay

5

Die gespeicherte Lösung. 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 

auch: 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

Vielen Dank für die Vorschläge, aber ich möchte wirklich externe Prozesse nicht aufrufen. Das referenzierte wmi-Modul erfordert auch ein weiteres Modul von Drittanbietern auf den Erweiterungen von pywin32, von dem wir nicht möchten, dass der Benutzer es benötigt. – Jay

+0

Sie können WMI von C über seine COM-Schnittstelle aufrufen, obwohl dies nicht der eleganteste Code aller Zeiten sein wird. –

+0

@Rob - das ist wahr ... das wäre ein schwerer Aufwand für diese scheinbar einfache Aufgabe, aber es sieht so aus, als ob ich nicht viele Optionen hätte. – Jay

2

Der WMI-Ansatz in einer anderen Antwort erwähnt ist wahrscheinlich die zuverlässige Weise, dies zu tun. Beim Durchsehen von MSDN entdeckte ich, was wie ein anderer möglicher Ansatz aussieht; Es ist dokumentiert, aber es ist nicht klar, ob es vollständig unterstützt wird. In MSDN Sprache, es--

kann in zukünftigen Versionen von Windows geändert oder nicht verfügbar sein ...

Auf jedem Fall, vorausgesetzt, dass Ihr Prozess die richtigen Berechtigungen verfügt, sollten Sie in der Lage sein, NtQueryProcessInformation mit einem ProcessInformationClass von ProcessBasicInformation anrufen. In der zurückgegebenen Struktur PROCESS_BASIC_INFORMATION sollten Sie einen Zeiger auf process execution block des Zielprozesses (als Feld PebBaseAddress) zurück erhalten. Das Feld ProcessParameters des PEB gibt Ihnen einen Zeiger auf eine RTL_USER_PROCESS_PARAMETERS Struktur. Das Feld CommandLine dieser Struktur wird eine UNICODE_STRING Struktur sein.(Seien Sie vorsichtig, wenn Sie nicht zu viele Annahmen über die Zeichenfolge machen; es gibt keine Garantie, dass sie NULL-terminiert wird, und es ist nicht klar, ob Sie den Namen der ausgeführten Anwendung ab dem Anfang des Befehls entfernen müssen Befehlszeile.)

Ich habe diesen Ansatz nicht versucht - und wie ich oben erwähnt habe, scheint es ein bisschen ... zweifelhaft (lesen: nicht tragbar) - aber es könnte einen Versuch wert sein. Viel Glück ...

+0

Ich sah das und fühlte mich genauso wie du - es schien wackelig, aber die CodeProject-Demo, die ich gefunden habe, funktioniert sogar auf Vista großartig, also werde ich damit sowieso weitermachen. Siehe den CodeProject Link für den Arbeitscode. – Jay

Verwandte Themen