我们知道,windows操作系统系统盘的权限控制是比其它磁盘更严格的。我们应用程序如果想在C盘下进行文件读写,大部分需要管理员权限才行(像appdata这种目录除外)。

如果你的应用程序必须在安装目录下进行数据的读写,同时用户权限并不是管理员,我们该怎么办?

能想到的办法当然很简单,没有权限就给它赋予权限呗!

先来看一段代码:

        /// <summary>
        ///为文件夹添加users,everyone用户组的完全控制权限
        /// </summary>
        /// <param name="dirPath"></param>
        static bool AddSecurityControll2Folder(string dirPath)
        {
            try
            {
                //获取文件夹信息
                var dir = new DirectoryInfo(dirPath);
                //获得该文件夹的所有访问权限
                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 isModified);
                //dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out bool isModified);
                //设置访问权限
                dir.SetAccessControl(dirSecurity);

                return isModified;
            }
            catch (Exception)
            {
                return false;
            }
        }

以上代码就可以用来修改文件夹的权限。

但是,我们的软件不是以管理员权限运行的话,此处的代码执行根本就没有用啊!在忽悠我么?

那是当然,如果不是管理员就能正常执行,这才奇怪了不是?那还要权限干嘛呢?

所以解决方法,我们只需要将修改文件夹权限的时机做个修改,我们放到安装的时候再执行就好了。

至于大家用什么方式打安装包,就用那种方式打,把权限控制的逻辑写进去就可以了。


本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/C-%E5%A6%82%E4%BD%95%E7%BB%99%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B5%8B%E4%BA%88%E6%9D%83%E9%99%90-%E4%BB%A5%E8%A7%A3%E5%86%B3%E6%9D%83%E9%99%90%E4%B8%8D%E8%B6%B3%E9%97%AE%E9%A2%98.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系