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

解决方案 »

  1.   

    不简单c#写的程序都是运行于.net framework的rtl上的,那process.start调用之后,执行的第一个应该是检查.net frx有没运行,并加载,然后把入口转到你的main。你的任何代码都要在这之后执行,可能有方法,但我觉得至少不简单……呵呵。我想啊。你可以增加个参数,128位的字符串做参数,参数正确才运行。
      

  2.   

    这个功能有点困难,可能跟appdomain什么的相关吧
      

  3.   

    简单,你可以检查程序的父进程。一般父进程都是explorer.exe,如果父进程不是这个,程序就不运行。
      

  4.   

    还有不常用的一个方法,windows操作系统中explorer.exe创建进程时候会吧STRUCTUPINFO结构体中设为0,其他进程会忽略这个值。你也可以检查这个结构体。
      

  5.   

    还有不常用的一个方法,windows操作系统中explorer.exe创建进程时候会吧STRUCTUPINFO结构体中设为0,其他进程会忽略这个值。你也可以检查这个结构体。
      

  6.   

    但.net写的程序是被.net rtl调用的,不是直接被系统调用的吧。
      

  7.   

    倒,这还不一定啊。这么明确了。static void Main(string[] args)
    {
        if (args == null || args.Length == 0) return;
        if (args[0] != "4657uyhjvx87235$^&*HIGB^%$#$67ugyvbdw982e4h3uiY&%^$#$&*uihcbdjsckioi213e6r372wt65$#^%&*UYhjkldsgc676w27e7yq65$%^&*^YT%$#@$%^&*(") return;
    }
    这样你写个快捷方式来执行你程序,带有这个参数的,否则就不允许调用了呗。
      

  8.   

    快捷方式为:
    "你的程序完整路径.exe" "4657uyhjvx87235$^&*HIGB^%$#$67ugyvbdw982e4h3uiY&%^$#$&*uihcbdjsckioi213e6r372wt65$#^%&*UYhjkldsgc676w27e7yq65$%^&*^YT%$#@$%^&*("")"
    如果人家有心,复制来调用,那就没办法,至少限制大部分直接做的,你可以每个版本不同。甚至这个值可以是和系统有关的都可以
      

  9.   

    但是这样也会有问题,如果使用WMIC中的Process命令可以查到该参数,调用的时候传该参数进去不是一样可以运行吗。
      

  10.   

    显然可以啊。攻防是相对的。哪有绝对的。暂时没更好办法,或者把exe改成dll,然后写个软件来做启动检查,这个启动软件用vc写,就可以用STRUCTUPINFO来检查出是谁调用的了。
      

  11.   

    有一个比较恶心的方法,但是应该很实用:
    既然你原来的程序是AAA.exe,那再做一个新程序叫BBB.exe,BBB.exe就做一件事情messageBOX.show("不容许外部程序调用 ")接下来修改注册表
    在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options添加一个键名字就叫AAA.exe
    然后在AAA.exe这个项下添加一个字符串项,项名叫"Debugger",项的内容是包换BBB.exe文件名的全路径。这样执行AAA.exe就会弹出警告框了。
      

  12.   

    找到一个方法,通过判断父进程是不是explorer来判断程序是不是通过外部调用的
    如果不是通过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#制做进程监视器 修改来的。win7+vs2008通过了。
    你试试吧。
      

  13.   

    GSDNOOA 你不会就算了 还这样说别人 , 这是技术  是兴趣 是能力,你能了解吗?为什么有这样的 就给你说了吧  编写应用程序不让调用 防止第三方软件直接调用 第三方可能是木马,只让双击和右键打开 并不是不让运行,傻鸟你知道吗?