我编写的是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;
}
}
}
}
}