asp.net 中winform防止被調用的實現方法

來源:互聯網
上載者:User

 

 代碼如下 複製代碼

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.