Benutzer mit den meisten Antworten
Aufrufparameter eines Prozesses auslesen

Frage
Antworten
-
Hallo Sven
ich denke indirekt geht:
WMI, Win32_Process CommandLine
http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx
http://stackoverflow.com/questions/2609606/c-wmi-process-differentiationAPI:
http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspxhttp://blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/6aae403e-318f-4042-a4d4-ec79d97a30ff- Als Antwort markiert Sven So Montag, 1. November 2010 06:33
-
Hallo Sven,
zuerst mal mit cmd.exe und dann: WMIC PROCESS get Name,Commandline,Processid
prüfen, wie der Name Deines Prozesses dort ist. Nehmen wir mal an: "proz.exe". Dann etwa:using System; using System.Windows.Forms; // unter Verweise die System.Management.dll einbinden. using System.Management; namespace WinProzDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string prozessName = "proz.exe"; string abfrage = "Select * From Win32_Process Where Name = '" + prozessName + "'"; ManagementObjectSearcher objektSuche = new ManagementObjectSearcher(abfrage); ManagementObjectCollection prozessListe = objektSuche.Get(); foreach (ManagementObject prozess in prozessListe) { object prozessID = prozess.GetPropertyValue("ProcessID"); object kommandoZeile = prozess.GetPropertyValue("CommandLine"); string info = "Der Prozess mit der ProzessID " + prozessID + "hat die Kommandozeile: \r\n" + kommandoZeile; MessageBox.Show(info); } } } }
ciao Frank- Als Antwort markiert Sven So Montag, 1. November 2010 06:33
Alle Antworten
-
Hallo Sven
ich denke indirekt geht:
WMI, Win32_Process CommandLine
http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx
http://stackoverflow.com/questions/2609606/c-wmi-process-differentiationAPI:
http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspxhttp://blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/6aae403e-318f-4042-a4d4-ec79d97a30ff- Als Antwort markiert Sven So Montag, 1. November 2010 06:33
-
Hallo Sven,
zuerst mal mit cmd.exe und dann: WMIC PROCESS get Name,Commandline,Processid
prüfen, wie der Name Deines Prozesses dort ist. Nehmen wir mal an: "proz.exe". Dann etwa:using System; using System.Windows.Forms; // unter Verweise die System.Management.dll einbinden. using System.Management; namespace WinProzDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string prozessName = "proz.exe"; string abfrage = "Select * From Win32_Process Where Name = '" + prozessName + "'"; ManagementObjectSearcher objektSuche = new ManagementObjectSearcher(abfrage); ManagementObjectCollection prozessListe = objektSuche.Get(); foreach (ManagementObject prozess in prozessListe) { object prozessID = prozess.GetPropertyValue("ProcessID"); object kommandoZeile = prozess.GetPropertyValue("CommandLine"); string info = "Der Prozess mit der ProzessID " + prozessID + "hat die Kommandozeile: \r\n" + kommandoZeile; MessageBox.Show(info); } } } }
ciao Frank- Als Antwort markiert Sven So Montag, 1. November 2010 06:33
-
Hallo Frank,
ich muss noch mal darauf Bezug nehmen.
Ich habe den Code eingebaut und er funktioniert auch.
Die Anwendung läuft im TaskPlaner und mit unterschiedlichen Benutzerrechten. Wenn jetzt 2 Prozesse gleichzeitig unter verschiedenen Benutzer laufen, erhalte ich folgenden Fehler:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Wahrscheinlich hat der eine Nutzer nicht die Rechte, den Prozess des anderen auszulesen.
Hat jemand eine Idee, wie ich diese Klippe umschiffen kann?Danke!
-
Hallo Sven,
also die Get-Methode benötigt: "Volle Vertrauenswürdigkeit für den unmittelbaren Aufrufer. Dieser Member kann nicht von teilweise vertrauenswürdigem Code verwendet werden" [s.a. Verwenden von Bibliotheken aus teilweise vertrauenswürdigem Code].
Es ist ja normal einfach so, dass eine Variable dann den Wert "null" hat und versucht wird, von dieser zu referenzieren - also zum Beispiel davon eine Methode aufzurufen. Das sollte eigentlich gut in den Griff zu bekommen sein, wenn Du die Ausnahme zum Beispiel in den EventLog schreibst.
Entweder führt man also eine Impersonifizierung im Code durch, oder man trägt im TaskScheduler gleich den richtigen (mit entsprechenden Berechtigungen versehenen) Benutzer ein. Den TaskScheduler (Taskplaner) kann man ja hervorragend über C# anprogrammieren.
ciao Frank -
Hallo Sven,
- Danke für die Hinweise.
gern.
- Die sauberste Geschichte ist es wohl, die Anwendung gleich im richtigen Kontext laufen zu lassen.
Das sehe ich auch so, dann hat man ggf. kein Passwort direkt im Programm zu berücksichtigen.
Dennoch hat Taskplaner dazu auch eine Schnittstelle, die sich leicht bedienen läßt:[Task Scheduler Managed Wrapper]
http://taskscheduler.codeplex.com/
[Beispiele]:http://taskscheduler.codeplex.com/wikipage?title=Examples&referringTitle=Documentation
______________________________
Folgende Member sind dann beim Taskplaner im Passwort-Szenario relevant:InteractiveTokenOrPassword
Member von Microsoft.Win32.TaskScheduler.TaskLogonType
First use the interactive token. If the user is not logged on (no interactive token is available), then the password is used. The password must be specified when a task is registered. This flag is not recommended for new tasks because it is less reliable than Password.Password
Member von Microsoft.Win32.TaskScheduler.TaskLogonType
Use a password for logging on the user. The password must be supplied at registration time.UserPassword { get; set; }
Member von Microsoft.Win32.TaskScheduler.TaskService
Gets or sets the user password to be used when connecting to the Microsoft.Win32.TaskScheduler.TaskService.TargetServer.
ciao Frank