在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 }
博客參考: