C#實現(xiàn)讀取和設置文件與文件夾的權限
C#程序運行時經(jīng)常遇到文件或文件夾權限問題,導致程序運行失敗。為了解決這個頭疼的問題,我們通常要讀取和設置文件、文件夾權限。
讀取文件、文件夾權限
/// <summary> /// 讀取文件、文件夾權限 /// </summary> /// <param name="path"></param> private void ReadPathRule(string path) { DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(AccessControlSections.All); foreach (FileSystemAccessRule rule in ds.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) { Console.WriteLine("----------------------------------"); Console.WriteLine(rule.IdentityReference.Value); if ((rule.FileSystemRights & FileSystemRights.Read) != 0) Console.WriteLine(rule.FileSystemRights.ToString()); } }
設置文件權限
/// <summary> /// 為文件添加users,everyone用戶組的完全控制權限 /// </summary> /// <param name="filePath"></param> static void AddSecurityControll2File(string filePath) { //獲取文件信息 FileInfo fileInfo = new FileInfo(filePath); //獲得該文件的訪問權限 System.Security.AccessControl.FileSecurity fileSecurity = fileInfo.GetAccessControl(); //添加ereryone用戶組的訪問權限規(guī)則 完全控制權限 fileSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow)); //添加Users用戶組的訪問權限規(guī)則 完全控制權限 fileSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow)); //設置訪問權限 fileInfo.SetAccessControl(fileSecurity); }
設置文件夾權限
/// <summary> ///為文件夾添加users,everyone用戶組的完全控制權限 /// </summary> /// <param name="dirPath"></param> static void AddSecurityControll2Folder(string dirPath) { //獲取文件夾信息 DirectoryInfo dir = new DirectoryInfo(dirPath); //獲得該文件夾的所有訪問權限 System.Security.AccessControl.DirectorySecurity dirSecurity = dir.GetAccessControl(AccessControlSections.All); //設定文件ACL繼承 InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; //添加ereryone用戶組的訪問權限規(guī)則 完全控制權限 FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); //添加Users用戶組的訪問權限規(guī)則 完全控制權限 FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); bool isModified = false; dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified); dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified); //設置訪問權限 dir.SetAccessControl(dirSecurity); }
注意:修改權限有時候需要程序有管理員權限,怎么以管理員身份運行程序,請參考:
C#/WPF 以管理員身份運行程序
在Vista 和 Windows 7 及更新版本的操作系統(tǒng),增加了 UAC(用戶賬戶控制) 的安全機制,如果 UAC 被打開,用戶即使以管理員權限登錄,其應用程序默認情況下也無法對系統(tǒng)目錄、系統(tǒng)注冊表等可能影響系統(tǒng)正常運行的設置進行寫操作。這個機制大大增強了系統(tǒng)的安全性,但對應用程序開發(fā)者來說,我們不能強迫用戶去關閉UAC,但有時我們開發(fā)的應用程序又需要以Administrator 的方式運行。
解決辦法有以下幾種方式:
通過 System.Diagnostics.Process.Start() 方式啟動(推薦)
通過添加應用程序清單文件(過于暴力,且有提示)
直接修改程序文件的屬性(不方便部署)
方法一:通過 System.Diagnostics.Process.Start() 方式啟動:
WPF App.xaml代碼:
<Application x:Class="AdminLoadDemo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:AdminLoadDemo" Startup="Application_Startup"> <Application.Resources> </Application.Resources> </Application>
WPF App.xaml.cs代碼:
private void Application_Startup(object sender, StartupEventArgs e) { /** * 當前用戶是管理員的時候,直接啟動應用程序 * 如果不是管理員,則使用啟動對象啟動程序,以確保使用管理員身份運行 */ //獲得當前登錄的Windows用戶標示 System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); //判斷當前登錄用戶是否為管理員 if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) { //如果是管理員,則直接運行 new MainWindow().Show(); } else { //創(chuàng)建啟動對象 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; //設置啟動動作,確保以管理員身份運行 startInfo.Verb = "runas"; try { System.Diagnostics.Process.Start(startInfo); } catch { return; } //退出 Environment.Exit(0); }
到此這篇關于C#實現(xiàn)讀取和設置文件與文件夾的權限的文章就介紹到這了,更多相關C#文件權限內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在C#中根據(jù)HardwareID獲取驅動程序信息的實現(xiàn)代碼
這篇文章主要介紹了C#中根據(jù)HardwareID獲取驅動程序信息的實現(xiàn)代碼,需要的朋友可以參考下2016-12-12