专注于.NET技术开发的博主,关注我个人微信公众号查看更多:承哥技术交流小作坊。
我们知道,windows操作系统系统盘的权限控制是比其它磁盘更严格的。我们应用程序如果想在C盘下进行文件读写,大部分需要管理员权限才行(像AppData,ProgramData这种目录除外)。
补充说明:
AppData:通常用于存放应用程序数据,该文件夹不存在权限问题,但绑定到当前用户。获取方法如下:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
ProgramData:通常用于存放应用程序数据,该文件夹不存在权限问题,本机用户均可以访问。获取方法如下:
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
如果你的应用程序必须在安装目录下进行数据的读写,同时用户权限并不是管理员,我们该怎么办?
能想到的办法当然很简单,没有权限就给它赋予权限呗!
先来看一段代码:
/// <summary>
///为文件夹添加users,everyone用户组的完全控制权限
/// </summary>
/// <param name="dirPath"></param>
public static bool AddSecurityControll2Folder(DirectoryInfo dir)
{
try
{
//获得该文件夹的所有访问权限
var dirSecurity = dir.GetAccessControl(AccessControlSections.All);
//设定文件ACL继承
var inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
//添加ereryone用户组的访问权限规则 完全控制权限
var everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
//添加Users用户组的访问权限规则 完全控制权限
FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out bool isEveryoneModified);
dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out bool isUsersModified);
//设置访问权限
dir.SetAccessControl(dirSecurity);
return isEveryoneModified && isUsersModified;
}
catch (Exception)
{
return false;
}
}
以上代码就可以用来修改文件夹的权限。
但是,我们的软件不是以管理员权限运行的话,此处的代码执行根本就没有用啊!在忽悠我么?
那是当然,如果不是管理员就能正常执行,这才奇怪了不是?那还要权限干嘛呢?
所以解决方法,我们只需要将修改文件夹权限的时机做个修改,我们放到安装的时候再执行就好了。
至于大家用什么方式打安装包,就用那种方式打,把权限控制的逻辑写进去就可以了。
专注于.NET技术开发的博主,关注我个人微信公众号查看更多:承哥技术交流小作坊。
标签:dirSecurity,C#,用户组,应用程序,Environment,文件夹,权限 From: https://blog.csdn.net/qq_22933729/article/details/143356336