• c#启动windows服务问题总结


    程序以管理员权限运行的原因

    在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行。

    1:启动window 服务,比如通过cmd 命令行的方式,必须在管理员的模式下,要不会提示 点下边的文件打不开,无权打开的报错。

    http://jingyan.baidu.com/article/ca41422fff77021eae99ed86.html 这里是百度里边的教程,用管理的方式打开命令行控制台。  

    2:对于程序实现启动window服务需要编写的程序具有管理员权限。

    第一种方法,通过设置编译环境获得权限。

    可以按照一下文章设置软件的环境===

    C#如何以管理员身份运行程序

    http://www.cnblogs.com/babycool/p/3569183.html 

    上边是其中比较有效的方法。

    第二种方法 :

    可以在程序main里边获取管理员权限 

    通过 System.Diagnostics.Process.Start() 方式启动:

    实现方法: 修改默认生成的Program文件,修改后的代码如下:

    由于已经在代码上做了注释,所以不再详细说明;

    代码如下。默认是在winform下。

    static class Program
        {
            [STAThread]
            static void Main()
            {            
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                /**
                 * 当前用户是管理员的时候,直接启动应用程序
                 * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
                 */
                //获得当前登录的Windows用户标示
                System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                //判断当前登录用户是否为管理员
                if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
                {
                    //如果是管理员,则直接运行
                    Application.Run(new Form1());
                }
                else
                {
                    //创建启动对象
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    startInfo.UseShellExecute = true;
                    startInfo.WorkingDirectory = Environment.CurrentDirectory;
                    startInfo.FileName = Application.ExecutablePath;
                    //设置启动动作,确保以管理员身份运行
                    startInfo.Verb = "runas";
                    try
                    {
                        System.Diagnostics.Process.Start(startInfo);
                    }
                    catch
                    {
                        return;
                    }
                    //退出
                    Application.Exit();
                }
            }
        }

    在wpf 编程环境下

    因为程序入口默认没有main 需要自己添加pragame.cs

    可以参考下边文章进行操作

    如何为WPF添加Main()函数 程序入口点的修改

    http://www.cnblogs.com/lidabo/archive/2013/07/17/3195764.html

    然后再main里边添加获取管理权限的代码。这个功能暂时没去调试。待有空添加,现在先用第一种方式实现。

    这种方式只是参考吧,在编译的过程中不太适合。

  • 相关阅读:
    "无法在证书存储区中找到清单签名证书"的解决办法
    ASP.net从服务器端向客户端弹出alert对话框,但不使页面变成白板
    C#日期相关操作
    在Lucene.net实现自定义排序
    做技术二十多年 突然明白的道理
    .net中sql防止注入式攻击
    开发可统计单词个数的Android驱动程序(1)
    乐博Android客户端(新浪微博)1.01发布,欢迎各位童鞋试用
    百度面试题:求绝对值最小的数
    赶紧升级到Android 2.3.4,体验最新的Android技术
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/6293833.html
Copyright © 2020-2023  润新知