WinForm程序防止被调用

来源:互联网 发布:美国二战知乎 编辑:程序博客网 时间:2024/05/23 01:14

这是去年我在CSDN上给人回答的一个问题,如何防止程序被其他应用程序调用,只能双击打开。

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    {        /// <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。

是我Google搜索C#制做进程监视器后找到一个帖子,获得灵感,写了这么个方法,基本上是可以满足条件的。

感觉现在CSDN上喷子也很多了,唉,素质越来越差了,当自己是高手是大牛,其实什么都不是,太自以为是。

总觉得自己的方法是好的,是对的,瞧不上的都是垃圾,可是并不知道什么叫做需求。

已经有一年没上CSDN了,这阵子又赶上密码泄漏的事件,还好,没我的在里面,不过CSDN说那是2009年的一个备份,但是我是在2007年注册的CSDN,不可信啊。万幸万幸,没我的。

原文地址:http://luacloud.com/2011/winform-program-is-invoked-to-prevent.html
原创粉丝点击