WinForm是Windows下的程序,所以,可以通过判断父进程是否是explorer来达到这个目的,当时测试,是可行的,也引来了很多争论,有说判断传参的什么的,其实我觉得还是通过判断父进程来做会好一些,虽然也不是绝对安全的。
代码如下 | 复制代码 |
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Diagnostics; using System.Management; namespace 不允许外部调用 { static class Program { /// /// 应用程序的主入口点。 /// [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()); } } //// /// 使用Wmi获取指定进程的创建者等信息 /// /// 进程ID 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; } /**/ /// /// 该类用于监测Wmi异步调用方法是否已经返回 /// 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。