| 代碼如下 |
複製代碼 |
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Diagnostics; using System.Management; namespace 不允許外部調用 { static class Program { /// <summary> /// 應用程式的主進入點。 /// </summary> [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Process proc = Process.GetCurrentProcess(); if (!FillDetailUseWmi(proc.Id).ToLower().Equals("explorer".ToLower())) { MessageBox.Show("該程式禁止外部程式調用。"); Application.ExitThread(); } else { Application.Run(new Form1()); } } //// <summary> /// 使用Wmi擷取指定進程的建立者等資訊 /// </summary> /// <param name="pID">進程ID</param> private static string FillDetailUseWmi(int pID) { string pname = string.Empty; ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ProcessID=" + pID); ManagementObjectCollection moc = searcher.Get(); ManagementOperationObserver observer = new ManagementOperationObserver(); HandleObjectReady hor = new HandleObjectReady(); //監測非同步方法呼叫是否已成功返回 observer.ObjectReady += new ObjectReadyEventHandler(hor.Done); foreach (ManagementObject mo in moc) { //非同步呼叫該對象的GetOwner方法,擷取進程建立者 mo.InvokeMethod(observer, "GetOwner", null); //等待非同步呼叫返回 while (!hor.Complete) { System.Threading.Thread.Sleep(500); } string user = ""; //判斷擷取使用者名稱的操作是否成功 if (hor.Obj["returnValue"].ToString() == "0") { user = hor.Obj.Properties["User"].Value.ToString(); } if (mo["ParentProcessID"] != null ) { //根據父進程ID擷取父進程名稱 int vpID=Convert.ToInt32(mo["ParentProcessID"]); pname = Process.GetProcessById(vpID).ProcessName; } } //釋放資源 searcher.Dispose(); searcher = null; moc.Dispose(); moc = null; observer = null; hor = null; return pname; } /**/ /// <summary> /// 該類用於監測Wmi非同步呼叫方法是否已經返回 /// </summary> public class HandleObjectReady { private bool complete = false; private ManagementBaseObject obj; public void Done(object sender, ObjectReadyEventArgs e) { complete = true; obj = e.NewObject; } public bool Complete { get { return complete; } } public ManagementBaseObject Obj { get { return obj; } } } } } |
需要添加.Net引用 System.Management