当前位置: 首页 > news >正文

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里边添加获取管理权限的代码。这个功能暂时没去调试。待有空添加,现在先用第一种方式实现。

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

 

转载于:https://www.cnblogs.com/zuochanzi/p/6293833.html

相关文章:

  • IE不能开新窗口的解决方法
  • Hadoop工作流--JobControl(五)
  • 排序集锦(rough)
  • 东方有限网络面试·我是不是太奢侈了
  • 谷歌浏览器添加书签
  • 普通大学生互联网逆袭风雨路
  • ZooKeeper Java Api 使用样例
  • 筛选了一些第一期的文章
  • webstorm intelliJ IDEA phpstorm 设置鼠标滚动改变字体大小
  • datatable实例教程
  • 新增三篇随笔
  • Python学习札记(一) 初始python
  • Hibernate出现 set方法反射错
  • ubuntu配置caffe的python接口pycaffe
  • 内网速度测试
  • 2017-08-04 前端日报
  • angular2开源库收集
  • Asm.js的简单介绍
  • Brief introduction of how to 'Call, Apply and Bind'
  • CentOS 7 修改主机名
  • java小心机(3)| 浅析finalize()
  • js中forEach回调同异步问题
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • passportjs 源码分析
  • Python利用正则抓取网页内容保存到本地
  • vue中实现单选
  • 反思总结然后整装待发
  • 开源地图数据可视化库——mapnik
  • 前端自动化解决方案
  • 提醒我喝水chrome插件开发指南
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 网络应用优化——时延与带宽
  • 译米田引理
  • 怎样选择前端框架
  • 7行Python代码的人脸识别
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云API、SDK和CLI应用实践方案
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #ifdef 的技巧用法
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (二)PySpark3:SparkSQL编程
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)linux 命令大全
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(六):替换字符串中匹配的子串
  • .net core 6 redis操作类
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 命令行参数包含应用程序路径吗?
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)