Kann .NET die Befehlszeilenparameter anderer laufender Programme überprüfen?
-
09-06-2019 - |
Frage
Wir haben einen interessanten Fall, in dem wir versuchen herauszufinden, wie verschiedene Instanzen unserer App gestartet wurden.Gibt es für .NET eine Möglichkeit, eine andere laufende Instanz abzufragen und die an diese Instanz übergebenen Befehlszeilenparameter abzurufen?Bisher konnte ich in .NET keine Möglichkeit finden, dies zu tun, daher dachte ich, ich schaue mal hier nach, ob jemand so etwas schon einmal gemacht hat.
Lösung
Sie können diese Informationen über WMI abrufen.
Siehe die Win32_Prozess Klasse, insbesondere ihre Befehlszeileneigenschaft.Das Artikel zum Code-Projekt gibt Hinweise, wie das geht,
Andere Tipps
Im Allgemeinen werden diese Variablen im Speicherbereich des Programms gespeichert, auf den Sie (theoretisch) keinen Zugriff haben sollten.
Sie müssen herausfinden, wie Sie die prozessübergreifende Kommunikation mit den anderen Instanzen initiieren und Daten austauschen können.Benannte Pipes sind eine gute Option, aber Sie möchten möglicherweise eine neue Stackoverflow-Frage starten, um gute Optionen hierfür zu erhalten.
-Adam
Zum späteren Nachschlagen finden Sie hier einen Codeausschnitt, der zeigt, wie ich es zum Laufen gebracht habe.Dies war nur ein Test, um zu sehen, wie alles funktionierte.Der tatsächlich implementierte Code analysiert die Befehlszeilenparameter für das, was wir brauchen.
try
{
ManagementScope connectScope = new ManagementScope();
connectScope.Path = new ManagementPath(@"\\" + Environment.MachineName + @"\root\CIMV2");
SelectQuery msQuery = new SelectQuery("SELECT * FROM Win32_Process Where Name = '" + "PROGRAMNAMEHERE.exe" + "'");
ManagementObjectSearcher searchProcedure = new ManagementObjectSearcher(connectScope, msQuery);
foreach (ManagementObject item in searchProcedure.Get())
{
try
{
MessageBox.Show(item["CommandLine"].ToString());
}
catch (SystemException)
{}
}
}