设为首页 收藏本站
查看: 808|回复: 0

Win7如何提升为管理员权限,如何开机启动需要管理员权限的程序,解决win7开机不能自动运行的问题等

[复制链接]

尚未签到

发表于 2015-5-15 07:24:41 | 显示全部楼层 |阅读模式
最近做了C#软件,支持开机启动,但是发现在win7里面即使我的程序给它添加了权限小盾牌,正常运行软件是会弹出一个小筐提示获取管理员权限,但是再刚开机的时候是无法申请到管理员权限的,所以开机启动的程序未申请到管理员权限就未启动。

首先我们看正常情况下简单获取管理员权限的方法——app.manifest(该方法的程序不能注册开机启动):

为项目添加文件app.manifest,简单添加方法是右键项目属性在安全性选项里面有个“启动clickonce安全设置”复选框,勾选上后项目会自动生成app.manifest文件.

该文件如下:







1
2  
3   
4   
5     
6      
7         
18         
19      
20      
21         
22         
23      
24     
25   
26  



然后修改18行的: 为:

最后编译项目生成的EXE文件就会带有小盾牌,只要运行是确认管理员权限就行了。

但是问题就出在程序在开机的时候申请不到管理员权限,那该怎么办呢,其实方法也很简单,就是通过过一段时间动态获取管理员权限来解决。

下面就是我对该模块开机启动进行的设计代码:







static class Program
    {
        [DllImport("user32.dll", EntryPoint = "FindWindowA")]
        public static extern IntPtr FindWindowA(string lp1, string lp2);
        [DllImport("user32.dll", EntryPoint = "ShowWindow")]
        public static extern bool ShowWindow(IntPtr hWnd, int _value);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
        [STAThread]
        static void Main()
        {
            if (isRunning("小馒头管家"))
            {
                IntPtr hTray = FindWindowA(null, "小馒头管家");   //根据窗口标题查找窗口
                ShowWindow(hTray,5);    //如果窗口是隐藏,则恢复显示窗口
                SetForegroundWindow(hTray); //如果程序界面不显示在最前面,则将程序显示在最前端
            }
            else
            {
                //Application.EnableVisualStyles();
                //Application.SetCompatibleTextRenderingDefault(false);
                //Application.Run(new Form1());
                //获得当前登录的Windows用户标示
                System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                //创建Windows用户主题
                Application.EnableVisualStyles();
                System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                //判断当前登录用户是否为管理员
                if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
                {
                    //如果是管理员,则直接运行

                    Application.EnableVisualStyles();
                    Application.Run(new Form1());
                }
                else
                {
                    for (int i = 0; i < 5; i++)
                    {
                        if (isRunningOne("小馒头管家"))
                        {
                            break;
                        }
                        //创建启动对象
                        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                        //设置运行文件
                        startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                        //startInfo.FileName = "小馒头2.exe";
                        //设置启动参数
                        //startInfo.Arguments = String.Join(" ");
                        //设置启动动作,确保以管理员身份运行
                        startInfo.Verb = "runas";
                        //如果不是管理员,则启动UAC
                        System.Diagnostics.Process.Start(startInfo);
                        //System.Windows.Forms.Application.Exit();
                        Thread.Sleep(2000);
                    }
                }
            }
        }
        //根据进程名称判断是否有同名进程正在运行中
        private static bool isRunning(string processName)
        {
            return (Process.GetProcessesByName(processName).Length > 2) ? true : false;
        }
        //根据进程名称判断是否有同名进程正在运行中
        private static bool isRunningOne(string processName)
        {
            return (Process.GetProcessesByName(processName).Length > 1) ? true : false;
        }
    }



这段代码添加上以后app.manifest就没必要要了,就是程序不需要带有小盾牌了,管理员权限在运行的时候自动申请,由于程序刚开始启动时不需要管理员权限所以开机可以自启动,并且在启动后重新以管理员身份启动程序,这样就解决了开机不能自动运行的问题。开机一段时间后才允许应用程序申请管理员权限的限制就可以通过上面的代码绕过,并且上面还保证了应用程序运行一次,至于为啥大家可以分析下,不过这也是我的程序需求,并且正常情况下我的程序可能不是显现的,所以采用了ShowWindow(hTray, 5);    //如果窗口是隐藏,则恢复显示窗口  这段代码,要是想以其他形式显示已经运行的程序窗口,大家可以去查ShowWindow(hTray, 5);这个函数,第二个参数可以进行各种显示控制。



开机自启动的源码我也分享下:







public static bool runAtStart()
        {
            string starupPath = Application.ExecutablePath;
            //class Micosoft.Win32.RegistryKey. 表示Window注册表中项级节点,此类是注册表装.
            RegistryKey loca = Registry.LocalMachine;
            RegistryKey run = loca.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
            if (run == null)
            {
                run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
            }
            try
            {
                run.SetValue("小馒头管家", "\"" + starupPath + "\"");
                loca.Close();
                run.Close();
                return true;
            }
            catch (Exception ee)
            {
                return false;
            }
        }




至此,该程序已经可以以管理员的权限再开机的时候自启动了,在此与大家分享下。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-67032-1-1.html 上篇帖子: win7常见问题汇总 下篇帖子: win7+vs2008+cuda5.x 环境配置二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表