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

 

博客參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM