| 代碼如下 |
複製代碼 |
|
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