LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

巧妙地利用进程分离来设置程序开机自动启动!(附源码)

admin
2017年2月7日 17:59 本文热度 5858

  在GG(高仿QQ)最早的版本中,我就加入了开机自动启动的功能,是通过操作注册表来实现的,但是操作注册表需要管理员权限,这样,就表示必须以管理员的身份来运行GG客户端。这对某些用户来说可能接受不了,因为以这么高的权限来运行一个程序,用户会觉得风险较大。而就从GG的角度来说,也只有在设置或取消开机启动才需要这个权限,而一开始就以管理员身份运行GG,就有点太夸张和浪费了。

一.方案进化

  我开始想到的解决方案是,仍然以普通用户的身份启动GG,当需要操作注册表时,再提升至管理员权限。后来通过查资料了解到:

(1)无法单独提升某个线程的运行权限,运行权限是与进程绑定了。

(2)若要提升进程的权限,必须在进程启动时就设定。

  这意味着要实现我的方案,必须在GG设置或取消开机启动时,重启GG进程。这也太不优雅了。继续想办法,最后让我想到了一个巧妙的方案。思路如下:

(1)将GG中设置或取消开机启动的功能(即需要管理员权限的部分),做成一个单独的控制台程序AutoStart.exe,并且将其运行权限配置为管理员。

(2)将AutoStart.exe放到与GG.exe的运行目录。

(3)GG实现开机启动功能的方法就是启动AutoStart.exe进程,并通过启动参数来传递相关信息给AutoStart.exe进程。

二.方案实现

1.AutoStart.exe

  AutoStart.exe是一个控制台程序,我将其实现为一个可复用的应用程序,大家可以直接从文末下载复用。其源码相当简单,如下所示:

复制代码
     /// <summary>
        /// 第一个参数为exe的名称,第二个参数为bool值,表示是否自动启动
        /// </summary>        
        static void Main(string[] args)
        {
            try
            {
                bool autoStart = bool.Parse(args[1]);
                Console.WriteLine(string.Format("正在{0}自动启动 {1} . . .", autoStart ? "设置" : "取消" ,args[0]) );                
                //操作注册表,需要使用管理员身份启动程序。
                RunWhenStart_usingReg(autoStart, args[0], AppDomain.CurrentDomain.BaseDirectory + args[0]);
                Console.WriteLine("");
                Console.WriteLine("操作完成! 按任意键退出 . . .");               
                Console.ReadLine();
            }
            catch(Exception ee)
            {
                Console.WriteLine("操作时发生异常:" + ee.Message + " 按任意键退出 . . .");               
                Console.ReadLine();
            }
        }

        #region 开机自动启动
        /// <summary> 
        /// 开机自动启动,使用注册表 
        /// </summary> 
        /// <param name=\"Started\">是否开机自动启动</param> 
        /// <param name=\"name\">取一个唯一的注册表Key名称</param> 
        /// <param name=\"path\">启动程序的完整路径</param> 
        public static void RunWhenStart_usingReg(bool started, string name, string path)
        {
            RegistryKey HKLM = Registry.LocalMachine;
            try
            {
                RegistryKey run = HKLM.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\");
                if (started)
                {
                    run.SetValue(name, path);
                }
                else
                {
                    object val = run.GetValue(name);
                    if (val != null)
                    {
                        run.DeleteValue(name);
                    }
                }
            }
            finally
            {
                HKLM.Close();
            }
        }
        #endregion      
复制代码

  如果不知道如何将AutoStart.exe配置为以管理员身份启动,可以参考这篇文章

2.在GG中调用AutoStart.exe

  当用户都选上或去掉勾选"开机自动启动"时,程序执行如下操作:

复制代码
if (autoStartChanged)
    {
        string args = string.Format("{0} {1}", "GG.exe", autoStart? "true":"false");
        Process.Start(AppDomain.CurrentDomain.BaseDirectory + "AutoStart.exe", args);
    }
复制代码

  运行效果截图:

  

三.下载

1.AutoStart 可执行程序

2.AutoStart 源码

 

PS:QQ的自动启动是怎么实现的了?它似乎不需要管理员权限,有知道的朋友拜托留言告诉一下啊,谢谢! 


该文章在 2017/2/7 17:59:55 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved