摘要

在对winform打包,进行安装的时候,一般会采用默认的安装路径,默认安装在C:\Program Files\xx或者C:\Program Files(x86)目录下,但windows有一种安全策略,默认是不允许操作c盘文件或者文件夹的。

解决办法

在软件发布的时候,一般会对软件exe进行签名的,使其发布者显示为某某公司,这里建议另建一个软件启动程序,对启动程序进行签名。这样你的软件如果更新,就不需要反复的对软件进行签名了。

1、启动程序可以,在配置文件中,设置启动的exe名称。可以多个软件公用一个启动程序,而改变启动程序名称对签名是没有影响的。

2、可以在启动程序中,对软件目录进行权限验证。如果没有权限,可以让其弹出UAC窗口,以管理员身份运行,并在主程序中,对软件所在目录进行授权操作。

核心代码

启动程序

  class Program{static string _exeName = ConfigurationManager.AppSettings["exeName"];static string _exeDir = AppDomain.CurrentDomain.BaseDirectory;static string _startExePath = Path.Combine(_exeDir, _exeName);static EventLog log = new EventLog() { Source = Path.GetFileNameWithoutExtension(_exeName) };static void Main(string[] args){try{if (string.IsNullOrEmpty(_exeName)){log.WriteEntry("no set exe name", EventLogEntryType.Error);}else{if (!IsAdmin()){//是否有完全控制权限if (CheckFolderPermissions(_exeDir, FileSystemRights.FullControl)){//运行主进程,不弹出UAC窗口RunAsAdmin(false);}else{//弹出UAC窗口,以管理员身份运行程序,并在主程序中,进行文件夹授权RunAsAdmin(true);}}else{//运行主进程,不弹出UAC窗口RunAsAdmin(false);}}}catch (Exception ex){log.WriteEntry(ex.Message, EventLogEntryType.Error);}}/// <summary>/// 检查文件夹权限/// </summary>/// <param name="dirPath"></param>/// <param name="accessType"></param>/// <returns></returns>public static bool CheckFolderPermissions(string dirPath, FileSystemRights accessType){bool havePermission = false;try{AuthorizationRuleCollection collection = Directory.GetAccessControl(dirPath).GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));foreach (FileSystemAccessRule rule in collection){if ((rule.FileSystemRights & accessType) > 0){havePermission=true;                        break;}}}catch{havePermission = false;}return havePermission;}/// <summary>/// 以管理员身份运行,弹出UAC控制窗口/// </summary>/// <param name="isRunAsAdmin">是否弹出uac控制</param>private static void RunAsAdmin(bool isRunAsAdmin){//创建启动对象 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();//设置运行文件 startInfo.FileName = _startExePath;if (isRunAsAdmin){//设置启动动作,确保以管理员身份运行 startInfo.Verb = "runas";}if (File.Exists(_startExePath)){//如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);}else{log.WriteEntry("not find the appication to run", EventLogEntryType.Error);}}/// <summary>/// 是否是管理员/// </summary>/// <returns></returns>static bool IsAdmin(){try{System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);}catch{return false;}}}

主程序在Main函数中进行授权

SetAccess("Users", StaticParameter.ExeDir);

        /// <summary>/// 为指定用户组,授权目录指定完全访问权限/// </summary>/// <param name="user">用户组,如Users</param>/// <param name="folder">实际的目录</param>/// <returns></returns>public static bool SetAccess(string user, string folder){//定义为完全控制的权限const FileSystemRights Rights = FileSystemRights.FullControl;//添加访问规则到实际目录var AccessRule = new FileSystemAccessRule(user, Rights,InheritanceFlags.None,PropagationFlags.NoPropagateInherit,AccessControlType.Allow);var Info = new DirectoryInfo(folder);var Security = Info.GetAccessControl(AccessControlSections.Access);bool Result;Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);if (!Result) return false;//总是允许再目录上进行对象继承const InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;//为继承关系添加访问规则AccessRule = new FileSystemAccessRule(user, Rights,iFlags,PropagationFlags.InheritOnly,AccessControlType.Allow);Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result);if (!Result) return false;Info.SetAccessControl(Security);return true;}

在授权的时候,需要保证是管理员身份运行的。所在在启动程序中,可以先判断目录的权限,如果还未授权,则弹出UAC窗口,使其以管理员身份运行,首次运行授权,之后运行就可以跳过这个过程。

总结

文件及文件夹提权,在C/s中是经常遇到的一个问题。比如,如果你没有读写权限,如果操作sqlite就会提示没权限操作数据库的bug。

参考

http://www.cnblogs.com/wuhuacong/p/5645172.html

转载于:https://www.cnblogs.com/wolf-sun/p/7325205.html

[Winform]安装在C盘,无操作权限的一个解决办法相关推荐

  1. 百度网盘安装在c盘显示系统权限限制的解决方法

    只有一个c盘,安装百度网盘更改路径的时候出现系统权限限制的结局方法 刚买的笔记本只有一个c盘,想着把百度网盘放在一个新建的文件夹中,这样的话比较好管理 在更改路径的时候出现了报错:系统权限限制 我们需 ...

  2. onyx for mac如何修复权限?onyx mac版操作无法执行的解决办法

    本来可以打开的操作,突然打不开了,怎么办?当有提示需要修复权限,或者某些本来可以执行的操作无法执行的时候,我们可以通过「维护」尝试修复权限解决问题.因为系统使用的时间长了安装的程序多了,可能有些操作就 ...

  3. cmd输入pip报错_安装虚拟环境+pip安装XXX包的常见操作与报错解决

    安装虚拟环境+pip安装XXX包的常见操作与报错解决​blog.csdn.net 文章目录: 一.开始前提 二.安装虚拟环境的常见操作 三.pip 的命令的常见操作:安装.更新.卸载.指定源 四.安装 ...

  4. window10 WIFI图标(WLAN)突然没有了,电脑搜索不到网络的一个解决办法: 重新下载安装WiFi驱动,电脑没有网络可以用U盘或者手机传到电脑安装

    1. 问题 window10 WIFI图标(WLAN)突然没有了,电脑搜索不到网络的一个解决办法 2. 原因之一 WiFi驱动(无线网卡驱动)没有更新或者其他问题,特别是系统更新后,经常就突然出现网络 ...

  5. MacPS安装服务器当前无响应,最新:M1芯片Mac安装Photoshop2021闪退/卡在启动屏页解决办法...

    原标题:最新:M1芯片Mac安装Photoshop2021闪退/卡在启动屏页解决办法 最近M1芯片的版本更新和PS更新,好多M1用户终于可以在M1芯片上安装PS2020以上的版本了! 但是,可能很多小 ...

  6. win7虚拟机上安装visual studio2017社区版的相关问题以及解决办法

    win7虚拟机上安装visual studio2017社区版的相关问题以及解决办法 一.visual studio community_2017在虚拟机win7安装时出现的问题 1.右击软件图标,点击 ...

  7. linux装win之后C盘爆满,win7c盘突然爆满的三种解决办法

    win7c盘突然爆满怎么办?前段时间有用户和我们反馈,自己电脑原来都是好好的,突然有一天变得非常卡顿,打开计算机一看C盘处于爆满的红色状态,明明之前还有很多空间,这是什么原因呢?小编今天就来告诉大家w ...

  8. Ubuntu安装ros rotors 以及中间出现的问题的解决办法

    Ubuntu安装ros rotors 以及中间出现的问题的解决办法 下文列出了我的问题 在文档末尾,自行查看 安装ubuntu 这个网上的教程很多 我使用的是vmware安装,基本上就是连点 我所使用 ...

  9. 软件工程专业画图工具Jude的安装与Windows找不到javaw文件的解决办法

    画图工具JUDE的安装与Windows找不到javaw文件的解决办法 文章目录 画图工具JUDE的安装与Windows找不到javaw文件的解决办法 1.工具 2.安装 3.Windows找不到jav ...

最新文章

  1. 漫画:如何在数组中找到和为 “特定值” 的两个数?
  2. 使用gotoxy()函数移动控制台光标
  3. 花生增产万书波谋定中国农民丰收节交易会 山东科技最高奖
  4. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
  5. QT学习笔记(十二):透明窗体设置
  6. DeVOpS 实战:Kubernetes 微服务监控体系
  7. 【Python】AxisError: axis 0 is out of bounds for array of dimension 0
  8. 目标检测voc转coco改良版
  9. 大数据分析平台如何选择
  10. mybatis-plus 自定义QueryWrapper(一)实现查询函数
  11. 命名实体识别NER探索(5) Bert+BiLSTM+CRF模型实战应用
  12. 银联支付之在线网关支付
  13. 为什么总是封板又打开涨停_多次涨停多次被打开,涨停板打开然后封住反复
  14. python3 最基础
  15. 解决问题就像剥洋葱,解决的关键是基础知识
  16. 分享【珠海】联想 IBM X3850 X6服务器维修真实案例
  17. update 增加datetime 时间
  18. 毕业论文必备技巧:Word页脚及页眉设置
  19. 笔记本电脑没有鼠标怎么右键_鼠标右键失灵怎么办,你知道原因吗?
  20. Linux 打包压缩-文件打包-打包工具【tar】命令使用简介

热门文章

  1. android 格式化代码
  2. Source Insight中查看文件显示全路径
  3. Activity动态增加Fragment
  4. JVM学习笔记之-对象的实例化,内存布局与访问定位,直接内存(Direct Memory)
  5. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
  6. 攻防:如何防止动态hook绕过jni签名校验
  7. python (八)迭代器、生成器、列表推导式
  8. 她说:我希望你好好写代码
  9. 在html中用js代替${pagecontext.request.getcontextpath}这样就不用使用jsp了
  10. IIS 7 php 7.0 部署WE MALL