解析C#中用Process類殺死進(jìn)程,執(zhí)行命令的深入分析
更新時(shí)間:2013年05月18日 11:20:14 作者:
本篇文章是對(duì)C#中用Process類殺死進(jìn)程,執(zhí)行命令進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
c#之process類相關(guān)整理
一、根據(jù)進(jìn)程名獲取進(jìn)程的用戶名?
需要添加對(duì) System.Management.dll 的引用
using System.Diagnostics;
using System.Management;
static void Main(string[] args)
{
foreach (Process p in Process.GetProcesses())
{
Console.Write(p.ProcessName);
Console.Write("----");
Console.WriteLine(GetProcessUserName(p.Id));
}
Console.ReadKey();
}
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;
}
進(jìn)程名 是 p.ProcessName
二、獲取進(jìn)程
using System.Diagnostics;
【注】System.Diagnostics 命名空間提供特定的類,使您能夠與系統(tǒng)進(jìn)程、事件日志和性能計(jì)數(shù)器進(jìn)行交互。
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 + "\r\n";
}
System.Windows.Forms.MessageBox.Show(str);
txtProcessID.Text = processes[0].Id.ToString();
//顯示進(jìn)程相關(guān)信息
string s = "";
System.Int32 processid;
Process process;
processid = Int32.Parse(txtProcessID.Text);
process = System.Diagnostics.Process.GetProcessById(processid);
s = s + "該進(jìn)程的總體優(yōu)先級(jí)類別:" + Convert.ToString(process.PriorityClass) + " \r\n";
s = s + "由該進(jìn)程打開(kāi)的句柄數(shù):" + process.HandleCount + "\r\n";
s = s + "該進(jìn)程的主窗口標(biāo)題:" + process.MainWindowTitle + "\r\n";
s = s + " 該進(jìn)程允許的最小工作集大小:" + process.MinWorkingSet.ToString() + " \r\n";
s = s + "該進(jìn)程允許的最大工作集大小:" + process.MaxWorkingSet.ToString() + " \r\n";
s = s + "該進(jìn)程的分頁(yè)內(nèi)存大小:" + process.PagedMemorySize + "\r\n";
s = s + "該進(jìn)程的峰值分頁(yè)內(nèi)存大小:" + process.PeakPagedMemorySize + "\r\n";
System.Windows.Forms.MessageBox.Show(s);
}
catch
{
System.Windows.Forms.MessageBox.Show("不合法的進(jìn)程ID!");
}
【注】Int32 值類型表示值介于-2,147,483,648 到+2,147,483,647 之間的有符號(hào)整數(shù)。
Int32 提供了一些方法,來(lái)比較該類型的實(shí)例、將實(shí)例的值轉(zhuǎn)換為它的String 表示形式以及將數(shù)字的String 表示形式轉(zhuǎn)換為該類型的實(shí)例。
有關(guān)格式規(guī)范代碼如何控制值類型的String 表示形式的信息,請(qǐng)參閱格式設(shè)置概述。
此類型實(shí)現(xiàn)接口IComparable、IFormattable 和IConvertible。使用Convert 類進(jìn)行轉(zhuǎn)換,而不是使用此類型的IConvertible 顯式接口成員實(shí)現(xiàn)。
值得一提的是,Process 類具有很多成員變量,這些成員變量可以獲得進(jìn)程的幾乎每一個(gè)細(xì)節(jié)。上面的例子中只是簡(jiǎn)單地選擇了幾個(gè)成員加以演示。如果開(kāi)發(fā)中有需要,可以參考MSDN Library,查詢Process類成員以獲得更詳細(xì)的信息,這里就不一一列出了。
三、殺死進(jìn)程
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("進(jìn)程關(guān)閉成功!");
GetProcess();
}
catch
{
MessageBox.Show("無(wú)法關(guān)閉此進(jìn)程!");
}
}
else
{
MessageBox.Show("請(qǐng)選擇要終止的進(jìn)程!");
}
}
四、C#中利用process類調(diào)用外部程序以及執(zhí)行dos命令
private string RunCmd(string command)
{
//實(shí)例一個(gè)Process類,啟動(dòng)一個(gè)獨(dú)立進(jìn)程
Process p = new Process();
//Process類有一個(gè)StartInfo屬性
//設(shè)定程序名
p.StartInfo.FileName = "cmd.exe";
//設(shè)定程式執(zhí)行參數(shù)
p.StartInfo.Arguments = "/c " + command;
//關(guān)閉Shell的使用
p.StartInfo.UseShellExecute = false;
//重定向標(biāo)準(zhǔn)輸入
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
//重定向錯(cuò)誤輸出
p.StartInfo.RedirectStandardError = true;
//設(shè)置不顯示窗口
p.StartInfo.CreateNoWindow = true;
//啟動(dòng)
p.Start();
//也可以用這種方式輸入要執(zhí)行的命令
//不過(guò)要記得加上Exit要不然下一行程式執(zhí)行的時(shí)候會(huì)當(dāng)機(jī)
//p.StandardInput.WriteLine(command);
//p.StandardInput.WriteLine("exit");
//從輸出流取得命令執(zhí)行結(jié)果
return p.StandardOutput.ReadToEnd();
}
一、根據(jù)進(jìn)程名獲取進(jìn)程的用戶名?
需要添加對(duì) System.Management.dll 的引用
復(fù)制代碼 代碼如下:
using System.Diagnostics;
using System.Management;
static void Main(string[] args)
{
foreach (Process p in Process.GetProcesses())
{
Console.Write(p.ProcessName);
Console.Write("----");
Console.WriteLine(GetProcessUserName(p.Id));
}
Console.ReadKey();
}
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;
}
進(jìn)程名 是 p.ProcessName
二、獲取進(jìn)程
using System.Diagnostics;
【注】System.Diagnostics 命名空間提供特定的類,使您能夠與系統(tǒng)進(jìn)程、事件日志和性能計(jì)數(shù)器進(jìn)行交互。
復(fù)制代碼 代碼如下:
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 + "\r\n";
}
System.Windows.Forms.MessageBox.Show(str);
txtProcessID.Text = processes[0].Id.ToString();
//顯示進(jìn)程相關(guān)信息
string s = "";
System.Int32 processid;
Process process;
processid = Int32.Parse(txtProcessID.Text);
process = System.Diagnostics.Process.GetProcessById(processid);
s = s + "該進(jìn)程的總體優(yōu)先級(jí)類別:" + Convert.ToString(process.PriorityClass) + " \r\n";
s = s + "由該進(jìn)程打開(kāi)的句柄數(shù):" + process.HandleCount + "\r\n";
s = s + "該進(jìn)程的主窗口標(biāo)題:" + process.MainWindowTitle + "\r\n";
s = s + " 該進(jìn)程允許的最小工作集大小:" + process.MinWorkingSet.ToString() + " \r\n";
s = s + "該進(jìn)程允許的最大工作集大小:" + process.MaxWorkingSet.ToString() + " \r\n";
s = s + "該進(jìn)程的分頁(yè)內(nèi)存大小:" + process.PagedMemorySize + "\r\n";
s = s + "該進(jìn)程的峰值分頁(yè)內(nèi)存大小:" + process.PeakPagedMemorySize + "\r\n";
System.Windows.Forms.MessageBox.Show(s);
}
catch
{
System.Windows.Forms.MessageBox.Show("不合法的進(jìn)程ID!");
}
【注】Int32 值類型表示值介于-2,147,483,648 到+2,147,483,647 之間的有符號(hào)整數(shù)。
Int32 提供了一些方法,來(lái)比較該類型的實(shí)例、將實(shí)例的值轉(zhuǎn)換為它的String 表示形式以及將數(shù)字的String 表示形式轉(zhuǎn)換為該類型的實(shí)例。
有關(guān)格式規(guī)范代碼如何控制值類型的String 表示形式的信息,請(qǐng)參閱格式設(shè)置概述。
此類型實(shí)現(xiàn)接口IComparable、IFormattable 和IConvertible。使用Convert 類進(jìn)行轉(zhuǎn)換,而不是使用此類型的IConvertible 顯式接口成員實(shí)現(xiàn)。
值得一提的是,Process 類具有很多成員變量,這些成員變量可以獲得進(jìn)程的幾乎每一個(gè)細(xì)節(jié)。上面的例子中只是簡(jiǎn)單地選擇了幾個(gè)成員加以演示。如果開(kāi)發(fā)中有需要,可以參考MSDN Library,查詢Process類成員以獲得更詳細(xì)的信息,這里就不一一列出了。
三、殺死進(jìn)程
復(fù)制代碼 代碼如下:
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("進(jìn)程關(guān)閉成功!");
GetProcess();
}
catch
{
MessageBox.Show("無(wú)法關(guān)閉此進(jìn)程!");
}
}
else
{
MessageBox.Show("請(qǐng)選擇要終止的進(jìn)程!");
}
}
四、C#中利用process類調(diào)用外部程序以及執(zhí)行dos命令
復(fù)制代碼 代碼如下:
private string RunCmd(string command)
{
//實(shí)例一個(gè)Process類,啟動(dòng)一個(gè)獨(dú)立進(jìn)程
Process p = new Process();
//Process類有一個(gè)StartInfo屬性
//設(shè)定程序名
p.StartInfo.FileName = "cmd.exe";
//設(shè)定程式執(zhí)行參數(shù)
p.StartInfo.Arguments = "/c " + command;
//關(guān)閉Shell的使用
p.StartInfo.UseShellExecute = false;
//重定向標(biāo)準(zhǔn)輸入
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
//重定向錯(cuò)誤輸出
p.StartInfo.RedirectStandardError = true;
//設(shè)置不顯示窗口
p.StartInfo.CreateNoWindow = true;
//啟動(dòng)
p.Start();
//也可以用這種方式輸入要執(zhí)行的命令
//不過(guò)要記得加上Exit要不然下一行程式執(zhí)行的時(shí)候會(huì)當(dāng)機(jī)
//p.StandardInput.WriteLine(command);
//p.StandardInput.WriteLine("exit");
//從輸出流取得命令執(zhí)行結(jié)果
return p.StandardOutput.ReadToEnd();
}
相關(guān)文章
c# Winform 程序自動(dòng)更新實(shí)現(xiàn)方法
Winform程序自動(dòng)更新我也是第一次做,網(wǎng)上找了自動(dòng)更新的源碼,后來(lái)又根據(jù)在網(wǎng)上看到的一些方法,自己試了很久,最終還是有寫錯(cuò)誤,所以花了錢讓別人幫忙調(diào)試成功的,下面是我自己搗騰出來(lái)的,方便大家借鑒,如果有什么錯(cuò)誤的地方歡迎指正2017-02-02C#使用Zxing.dll組件解析二維碼的實(shí)現(xiàn)
ZXing是一個(gè)開(kāi)源的,支持多種格式的條形碼圖像處理庫(kù),本文主要介紹了C#使用Zxing.dll組件解析二維碼的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Unity?UGUI的StandaloneInputModule標(biāo)準(zhǔn)輸入模塊組件使用示例
這篇文章主要為大家介紹了Unity?UGUI的StandaloneInputModule標(biāo)準(zhǔn)輸入模塊組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08C# 獲取動(dòng)態(tài)key的json對(duì)象的值案例
這篇文章主要介紹了C# 獲取動(dòng)態(tài)key的json對(duì)象的值案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01C#實(shí)現(xiàn)如何使用短信平臺(tái)自動(dòng)通知用戶實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)如何使用短信平臺(tái)自動(dòng)通知用戶實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02c#自定義Attribute獲取接口實(shí)現(xiàn)示例代碼
這篇文章主要給大家介紹了關(guān)于c#自定義Attribute獲取接口實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09使用JsonConverter處理上傳文件的路徑問(wèn)題
我們上傳一個(gè)文件,把文件保存到服務(wù)器上,會(huì)有一個(gè)明確的物理路徑,由于需要從前端訪問(wèn)這個(gè)文件,還需要web服務(wù)器中的一個(gè)虛擬路徑,我們可以使用JsonConverter 來(lái)自動(dòng)處理一下,這篇文章主要介紹了使用JsonConverter處理上傳文件的路徑,需要的朋友可以參考下2022-12-12