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