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
复制代码

 

博客参考:

posted @   唐宋元明清2188  阅读(2398)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示
剑桥
16:15发布
剑桥
16:15发布
7°
西南风
3级
空气质量
相对湿度
66%
今天
2°/10°
周三
2°/8°
周四
中雨
2°/7°