转:Process类的使用

转载自:http://www.oschina.net/code/snippet_119226_6188

一、根据进程名获取进程的用户名?

需要添加对 System.Management.dll 的引用

using System.Diagnostics;
using System.Management;

namespace ConsoleApplicationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (Process p in Process.GetProcesses())
            {
                Console.Write(p.ProcessName);  // 进程名是p.ProcessName
                Console.Write("----");
                Console.WriteLine(GetProcessUserName(p.Id));  
            }  
            Console.Read();
        }

        private static string GetProcessUserName(int pID)
        {
            string text1 = null;
            SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID);
            ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1);
            try
            {
                foreach (ManagementObject disk in searcher1.Get())
                {
                    ManagementBaseObject inPar = null;
                    ManagementBaseObject outPar = null;
                    inPar = disk.GetMethodParameters("GetOwner");
                    outPar = disk.InvokeMethod("GetOwner", inPar, null);
                    text1 = outPar["User"].ToString();
                    break;
                }
            }
            catch
            {
                text1 = "SYSTEM";
            }
            return text1;
        }  
    }
}

二、获取进程

【注】System.Diagnostics 命名空间提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互。

string str = "";
Process[] processes;
//Get the list of current active processes. 
processes = System.Diagnostics.Process.GetProcesses();
//Grab some basic information for each process.  
Process process;
 for (int i = 0; i < processes.Length - 1; i++)
{
     process = processes[i];
     str = str + Convert.ToString(process.Id) + " : " +process.ProcessName + "
";
}
System.Windows.Forms.MessageBox.Show(str);
txtProcessID.Text = processes[0].Id.ToString();
//显示进程相关信息  
string s = "";
System.Int32 processid = -1;
Process process;
//processid = Int32.Parse(txtProcessID.Text);  
process = System.Diagnostics.Process.GetProcessById(processid);
s = s + "该进程的总体优先级类别:" + Convert.ToString(process.PriorityClass) + " 
";
s = s + "由该进程打开的句柄数:" + process.HandleCount + "
";
s = s + "该进程的主窗口标题:" + process.MainWindowTitle + "
";
s = s + " 该进程允许的最小工作集大小:" + process.MinWorkingSet.ToString() + " 
";
s = s + "该进程允许的最大工作集大小:" + process.MaxWorkingSet.ToString() + " 
";
s = s + "该进程的分页内存大小:" + process.PagedMemorySize + "
";
s = s + "该进程的峰值分页内存大小:" + process.PeakPagedMemorySize + "
";
System.Windows.Forms.MessageBox.Show(s);

【注】Int32 值类型表示值介于-2,147,483,648 到+2,147,483,647 之间的有符号整数。
Int32 提供了一些方法,来比较该类型的实例、将实例的值转换为它的String 表示形式以及将数字的String 表示形式转换为该类型的实例。
有关格式规范代码如何控制值类型的String 表示形式的信息,请参阅格式设置概述。 
此类型实现接口IComparable、IFormattable 和IConvertible。使用Convert 类进行转换,而不是使用此类型的IConvertible 显式接口成员实现。 
值得一提的是,Process 类具有很多成员变量,这些成员变量可以获得进程的几乎每一个细节。上面的例子中只是简单地选择了几个成员加以演示。如果开发中有需要,可以参考MSDN Library,查询Process类成员以获得更详细的信息,这里就不一一列出了。

三、杀死进程

 private void button2_Click(object sender, EventArgs e)  
 {  
     if (listView1.SelectedItems.Count > 0)  
     {
         try
         {
             string proName = listView1.SelectedItems[0].Text;  
             Process[] p = Process.GetProcessesByName(proName);
             p[0].Kill();
             MessageBox.Show("进程关闭成功!");  
         }
         catch
         {
             MessageBox.Show("无法关闭此进程!");  
         }
     }
     else
     {
         MessageBox.Show("请选择要终止的进程!");  
     }
 } 

四、C#中利用process类调用外部程序以及执行dos命令

private string RunCmd(string command)
{
    //实例一个Process类,启动一个独立进程  
    Process p = new Process();
    //Process类有一个StartInfo属性  
    //设定程序名  
    p.StartInfo.FileName = "cmd.exe";
    //设定程式执行参数     
    p.StartInfo.Arguments = "/c " + command;
    //关闭Shell的使用    
    p.StartInfo.UseShellExecute = false;
    //重定向标准输入       
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    //重定向错误输出    
    p.StartInfo.RedirectStandardError = true;
    //设置不显示窗口  
    p.StartInfo.CreateNoWindow = true;
    //启动  
    p.Start();
    //也可以用这种方式输入要执行的命令  
    //不过要记得加上Exit要不然下一行程式执行的时候会当机  
    //p.StandardInput.WriteLine(command);
    //p.StandardInput.WriteLine("exit");
    //从输出流取得命令执行结果  
    return p.StandardOutput.ReadToEnd();
}
原文地址:https://www.cnblogs.com/lusunqing/p/3150456.html