zoukankan      html  css  js  c++  java
  • C# 无需管理员权限提示,操作C盘文件

    在C盘创建、移动文件,如果当前不是管理员身份,是没办法直接操作。

    如果当前程序有管理员权限,那可以直接操作。

    但是,添加管理员权限启动,会弹出用户确认提示框。

    在某些场景下,其实是不想让用户看到这样的确认框,会影响用户体验。本文来讲下如何获取权限默默的对C盘进行操作~

    对文件/文件夹添加权限控制

    我们创建一个应用程序SetFileAccessControlDemo,用于添加权限。

    添加应用程序项目后,在app.manifest中添加管理员权限。

    注:管理员权限,添加方式见链接 C# 程序管理员权限启动 - 唐宋元明清2188 - 博客园 (cnblogs.com)

    添加权限后,我们对C盘下的文件夹,添加权限控制:

     1     public partial class App : Application
     2     {
     3         public App()
     4         {
     5             AddSecurity(@"C:Program Files (x86)Test");
     6             Environment.Exit(0);
     7         }
     8         /// <summary>
     9         ///为文件夹添加users,everyone用户组的完全控制权限
    10         /// </summary>
    11         /// <param name="dirPath"></param>
    12         void AddSecurity(string dirPath)
    13         {
    14             //获取文件夹信息
    15             var dir = new DirectoryInfo(dirPath);
    16             //获得该文件夹的所有访问权限
    17             var dirSecurity = dir.GetAccessControl(AccessControlSections.All);
    18             //设定文件ACL继承
    19             var inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
    20             //添加ereryone用户组的访问权限规则 完全控制权限
    21             var everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
    22             //添加Users用户组的访问权限规则 完全控制权限
    23             var usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
    24             dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out var isModified);
    25             dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified);
    26             //设置访问权限
    27             dir.SetAccessControl(dirSecurity);
    28         }
    29     }

    这里是添加的所有Users,如果只想添加当前用户,可以设置identity:WindowsIdentity.GetCurrent().Name

    安装包安装过程中执行exe

    下面是innosetup安装试的处理,添加以下SetFileAccessControlDemo.exe的执行.

    1 [Run]
    2 Filename: "{app}SetFileAccessControlDemo.exe"; StatusMsg: "Add full access control to folder"; Check: IsWin64(); Flags: skipifsilent

    当然,安装包自身需要以管理员运行,设置如下:

    下载Resource Hacker编译器,在InnoSetup安装目录下找到配置SetupLdr.e32文件,设置Manifest中的权限启动参数(与VisualStudio类似)。

    详细操作可参考:用inno setup制作管理员权限启动的安装包

    设置完成后,生成安装包。安装包会在安装过程完成前,会默默的执行上面的SetAdminitorstorPermissionDemo.exe。权限设置结果如下:

    其它方案

    设置文件夹控制权限原理就是,当前程序没有管理员权限的话,那就另加个有权限的程序去操作就行了。 

    所以如果不想在安装包中设置,也可以在主程序中调用上面的SetFileAccessControlDemo.exe。

     1     public App()
     2     {
     3         if (IsAdministrator())
     4         {
     5             try
     6             {
     7                 AddSecurity(@"C:Program Files (x86)Test");
     8             }
     9             catch (Exception exception)
    10             {
    11                 MessageBox.Show(exception.Message);
    12             }
    13             this.Startup += App_Startup;
    14         }
    15         else
    16         {
    17             Process.Start(@"D:SetFileAccessControlDemo.exe"); 
    19 Environment.Exit(0);
    20     }
    21   }
    • 判断当前是否有管理员操作权限,如果没有则启动另一个SetFileAccessControlDemo.exe去设置文件夹权限,并退出当前exe。
    • SetFileAccessControlDemo.exe设置完权限后,启动原有exe,并退出自身进程。
    • 经过这样的流程,权限就设置完成了。
    IsAdministrator:
    1     public static bool IsAdministrator()
    2     {
    3         WindowsIdentity identity = WindowsIdentity.GetCurrent();
    4         WindowsPrincipal principal = new WindowsPrincipal(identity);
    5         return principal.IsInRole(WindowsBuiltInRole.Administrator);
    6     }
    View Code

    博客参考:

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    排序算法七:选择排序之堆排序
    排序算法七:选择排序之堆排序
    排序算法六:选择排序之直接选择排序
    排序算法六:选择排序之直接选择排序
    贝叶斯网络
    web 开发之js---js 中的数组操作
    web 开发之js---JS变量也要注意初始化
    web 开发之js---理解并解决IE的内存泄漏方式
    web 开发之js---巧用iframe实现jsp无刷新上传文件
    web 开发之js---js获取select标签选中的值
  • 原文地址:https://www.cnblogs.com/kybs0/p/14966527.html
Copyright © 2011-2022 走看看