我编写的是window应用程序 比如说 编写的程序是AAA.EXE 在E盘学习文件夹中
别人想调用我的程序 一般这样写 process.start(@"E:\学习\AAA.exe")
我不想让别人调用我的程序 如果别人调用时弹出messageBOX .show("不容许外部程序调用 ");
绝不是在主窗口中跳出textbox然后输入密码,密码正确,程序运行 否则close ,
我只是想知道怎么在AAA中写代码 而不是不愿意共享 学习一定要共同学习的 希望有人帮助我。
别人想调用我的程序 一般这样写 process.start(@"E:\学习\AAA.exe")
我不想让别人调用我的程序 如果别人调用时弹出messageBOX .show("不容许外部程序调用 ");
绝不是在主窗口中跳出textbox然后输入密码,密码正确,程序运行 否则close ,
我只是想知道怎么在AAA中写代码 而不是不愿意共享 学习一定要共同学习的 希望有人帮助我。
{
if (args == null || args.Length == 0) return;
if (args[0] != "4657uyhjvx87235$^&*HIGB^%$#$67ugyvbdw982e4h3uiY&%^$#$&*uihcbdjsckioi213e6r372wt65$#^%&*UYhjkldsgc676w27e7yq65$%^&*^YT%$#@$%^&*(") return;
}
这样你写个快捷方式来执行你程序,带有这个参数的,否则就不允许调用了呗。
"你的程序完整路径.exe" "4657uyhjvx87235$^&*HIGB^%$#$67ugyvbdw982e4h3uiY&%^$#$&*uihcbdjsckioi213e6r372wt65$#^%&*UYhjkldsgc676w27e7yq65$%^&*^YT%$#@$%^&*("")"
如果人家有心,复制来调用,那就没办法,至少限制大部分直接做的,你可以每个版本不同。甚至这个值可以是和系统有关的都可以
既然你原来的程序是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就会弹出警告框了。
如果不是通过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通过了。
你试试吧。