我的CSDN(三):怎么禁止别人调用我的程序

我编写的是window应用程序  比如说  编写的程序是AAA.EXE 在E盘学习文件夹中
别人想调用我的程序   一般这样写 process.start(@"E:\学习\AAA.exe")
我不想让别人调用我的程序 如果别人调用时弹出messageBOX .show("不容许外部程序调用 ");
绝不是在主窗口中跳出textbox然后输入密码,密码正确,程序运行 否则close ,
我只是想知道怎么在AAA中写代码 而不是不愿意共享 学习一定要共同学习的  希望有人帮助我。

当时看到这个问题的时候纯粹是因为好奇才做实验的,不过还真有了解决办法,不一定是最好的,但是确实能做到的。

找到一个方法,通过判断父进程是不是explorer来判断程序是不是通过外部调用的。

如果不是通过explorer那么弹出提示并停止继续运行,否则正常执行。

需要添加.Net引用 System.Management。

 

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;
                }
            }
        }
    }
}

 

你可能感兴趣的:(我的CSDN(三):怎么禁止别人调用我的程序)