namespace WindowsApplication1 { using System; using System.Windows.Forms; using System.Drawing; using System.ServiceProcess; using System.Diagnostics; using System.DirectoryServices; using Microsoft.Win32.Diagnostics; /* Instrumentation */ // Summary description for ProcessControllerManager. // This class is used to handle all the processes on a machine public class ProcessControllerManager { private string strMachineName; private ListBox lstPcsRun, lstPcs,lstCurrent=null; private string strSelectedProcess=""; private Process pcsSelectedProcess; private System.Collections.Hashtable colProcesses=new System.Collections.Hashtable(); private System.Windows.Forms.Timer tmrWatchDog = new System.Windows.Forms.Timer(); private TraceProvider MyTraceProvider = new TraceProvider("ProcessController",new Guid("{C5EBCA17-E93F-4733-865B-DEC4039ADB6D}")); public ProcessControllerManager() { //Default constructor. Don't need any code } //Clear all the collections public void Clear() { strMachineName=""; if(lstPcsRun!=null) { lstPcsRun.Items.Clear(); lstPcsRun.SelectedIndexChanged -=new System.EventHandler(this.SelectedProcess); lstPcsRun.MouseDown -= new System.Windows.Forms.MouseEventHandler(this.ListOptions); } if(lstPcs!=null) { lstPcs.Items.Clear(); lstPcs.SelectedIndexChanged -= new System.EventHandler(this.SelectedProcess); lstPcs.MouseDown -= new System.Windows.Forms.MouseEventHandler(this.ListOptions); } colProcesses.Clear(); } //Class explicit constructor public ProcessControllerManager(ListBox tmpPcsRun, ListBox tmpPcs, string tmpMachineName ) { strMachineName=tmpMachineName; colProcesses.Clear(); //Adding the events handlers to the controls lstPcs=tmpPcs; lstPcs.SelectedIndexChanged += new System.EventHandler(this.SelectedProcess); lstPcs.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListOptions); lstPcsRun=tmpPcsRun; lstPcsRun.SelectedIndexChanged += new System.EventHandler(this.SelectedProcess); lstPcsRun.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListOptions); LoadProcesses(); } //Launch the selected process public void StartProcess(string strProcName) { Process tmpProcess = new Process(); tmpProcess.Exited += new EventHandler(this.ProcessExited); tmpProcess.EnableRaisingEvents=true; tmpProcess.StartInfo.FileName=strProcName; try { tmpProcess.Start(); while(! tmpProcess.Responding)System.Windows.Forms.Application.DoEvents(); LoadProcesses(); } catch { MessageBox.Show("The Process: " + strSelectedProcess + " cannot start !"); } } //Add/remove options from the popup menu private void ListOptions( object sender, System.Windows.Forms.MouseEventArgs e) { lstCurrent=(ListBox)sender; if(e.Button==System.Windows.Forms.MouseButtons.Right && lstCurrent.Equals(lstPcsRun)) { lstCurrent = (ListBox)sender; lstCurrent.ContextMenu=new System.Windows.Forms.ContextMenu(); if(lstCurrent.Equals(lstPcs)) { strSelectedProcess=lstCurrent.SelectedItem.ToString(); } else { lstCurrent.ContextMenu.MenuItems.Add(new System.Windows.Forms.MenuItem("&Terminate Process", new EventHandler(this.KillProcess))); } lstCurrent.ContextMenu.Show(lstCurrent ,new Point(e.X,e.Y)); } } //Try to stop a process private void KillProcess( object sender, EventArgs e) { try { string strProcName = lstCurrent.SelectedItem.ToString(); if(pcsSelectedProcess!=null) { try { //Try to terminate the process pcsSelectedProcess.Kill(); if(colProcesses.Contains(pcsSelectedProcess.Id.ToString())) { colProcesses.Remove(pcsSelectedProcess.Id.ToString()); lstPcsRun.Items.Remove (pcsSelectedProcess.ProcessName + " ID: " + pcsSelectedProcess.Id.ToString()); } } catch { MessageBox.Show(pcsSelectedProcess.ProcessName + " can not be killed"); } } lstPcs.Items.Clear(); } catch { MessageBox.Show("Select a process first!") ;//no listItem was selected } } //Fills up the Process Info list private void ShowProcessInfo( object sender, EventArgs e) { string strItem = lstCurrent.SelectedItem.ToString(); string strKey = strItem.Substring(strItem.IndexOf("ID:")+3).Trim(); Process tmpProcess=null; if(strKey !="" ) { try { tmpProcess= Process.GetProcessById(Int32.Parse (strKey),strMachineName); } catch { Process[] arrProcess=Process.GetProcesses(strMachineName); foreach(Process tmpP in arrProcess) { if(tmpP.Id==Int32.Parse(strKey)) { tmpProcess=tmpP; break; } } } lstPcs.Items.Clear(); //Adding the Process info to the list try { lstPcs.Items.Add("Process Name: " + tmpProcess.ProcessName ); lstPcs.Items.Add("Arguments: " + tmpProcess.StartInfo.Arguments); lstPcs.Items.Add("Running on: " + tmpProcess.MachineName); try { lstPcs.Items.Add("Main Window title: " + tmpProcess.MainWindowTitle); } catch { lstPcs.Items.Add("Main Window title: Not Available"); } lstPcs.Items.Add("Start Time: " + tmpProcess.StartTime.ToString()); lstPcs.Items.Add("NonpagedSystemMemorySize: " + tmpProcess.NonpagedSystemMemorySize.ToString()); lstPcs.Items.Add("PagedMemorySize: " + tmpProcess.PagedMemorySize.ToString()); lstPcs.Items.Add("PrivateMemorySize: " + tmpProcess.PrivateMemorySize.ToString()); lstPcs.Items.Add("PrivilegedProcessorTime: " + tmpProcess.PrivilegedProcessorTime.ToString()); lstPcs.Items.Add("PeakPagedMemorySize: " + tmpProcess.PeakPagedMemorySize.ToString()); lstPcs.Items.Add("PeakVirtualMemorySize: " + tmpProcess.PeakVirtualMemorySize.ToString()); lstPcs.Items.Add("PeakPagedMemorySize: " + tmpProcess.PeakPagedMemorySize.ToString()); lstPcs.Items.Add("PeakWorkingSet: " + tmpProcess.PeakWorkingSet.ToString()); try { lstPcs.Items.Add("PriorityClass: " + tmpProcess.PriorityClass.ToString()); } catch { lstPcs.Items.Add("PriorityClass: Not available" ); } try { lstPcs.Items.Add("BasePriority: "+ tmpProcess.BasePriority.ToString()); } catch { lstPcs.Items.Add("BasePriority: Not available" ); } try { lstPcs.Items.Add("ProcessorAffinity: " + tmpProcess.ProcessorAffinity.ToString()); } catch { lstPcs.Items.Add("ProcessorAffinity: Not available"); } lstPcs.Items.Add("ID: " + tmpProcess.Id); lstPcs.Items.Add("WorkingDirectory: " + tmpProcess.StartInfo.WorkingDirectory); lstPcs.Items.Add(""); lstPcs.Items.Add("********************* Modules in use by this process ***************** "); lstPcs.Items.Add(""); foreach(System.Diagnostics.ProcessModule tmpPM in tmpProcess.Modules) { try { lstPcs.Items.Add("Module Name: " + tmpPM.FileName ); } catch { lstPcs.Items.Add("Modules Reading Not Allowed"); } } } catch { MessageBox.Show("Some process properties couldn't be loaded!");//Some did not work } } } //Remove the process from the processes list private void ProcessExited(object sender, EventArgs e) { Process tmpProcess = (Process)sender; colProcesses.Remove(tmpProcess.Id.ToString()); lstPcsRun.Items.Remove(tmpProcess.ProcessName + " ID: " + tmpProcess.Id.ToString()); } //Check the selected process private void SelectedProcess(object sender, EventArgs e) { lstCurrent=(ListBox)sender; strSelectedProcess=lstCurrent.SelectedItem.ToString(); if(lstCurrent.Equals(lstPcsRun)) { string pcsID = lstCurrent.SelectedItem.ToString(); pcsID= pcsID.Substring(pcsID.IndexOf("ID: ")+4).Trim(); pcsSelectedProcess=(Process)colProcesses[pcsID]; ShowProcessInfo(sender,e); } } //Load all the processes on the given machine private void LoadProcesses() { tmrWatchDog.Enabled=false; lstPcsRun.Items.Clear(); colProcesses.Clear(); colProcesses=new System.Collections.Hashtable(); try { //Use the Static: GetProcesses to have the array of currently running processes. Process[]arrProcess=Process.GetProcesses(strMachineName); foreach(Process tmpPcs in arrProcess) { //Assign ProcessExited event to each process in the list tmpPcs.Exited += new EventHandler(ProcessExited); if(!colProcesses.Contains(tmpPcs.Id.ToString()) ) { MyTraceProvider.TraceMessage((uint)TraceFlags.Info, "[{0}]Loading process {1} ID: {2}", strMachineName, tmpPcs.ProcessName, tmpPcs.Id.ToString()); /* Instrumentation */ lstPcsRun.Items.Add(tmpPcs.ProcessName + " ID: " + tmpPcs.Id.ToString()); colProcesses.Add(tmpPcs.Id.ToString(),tmpPcs); } } } catch { MessageBox.Show("Cannot read processes on: " + strMachineName ); } //Enable the RaisingEvents for each process foreach(Process tmpPcs in colProcesses.Values) { try { tmpPcs.EnableRaisingEvents=true; } catch { Console.WriteLine("Couldn't Set Option"); } } tmrWatchDog.Enabled=true; } } }