使用C#程式驗證系統登入使用者與目錄許可權
阿新 • • 發佈:2020-12-09
Windows使用者型別:Administrator、Guest、自定義使用者等;檔案的許可權不外乎:Read、Write、Modify、Remove等等,其中擁有所有許可權的字元叫做FullControl。
C#當前程式使用者路徑許可權驗證
/// <summary> /// 是否擁有程式資料路徑許可權 /// </summary> private static bool HasProgramDataRights=false; public static bool IsAdministrator() { System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator); } /// <summary> /// 讀取系統程式資料路徑許可權&判斷是否可以使用臨時目錄進行儲存操作 /// </summary> /// <param name="path"></param> public void ReadProgramDataRights(string path) { // 通過判定檔案的許可權來控制路徑 System.Security.AccessControl.DirectorySecurity dirSec = new System.IO.DirectoryInfo(path).GetAccessControl(); System.Security.AccessControl.AuthorizationRuleCollection rules = dirSec.GetAccessRules(true,true,typeof(System.Security.Principal.NTAccount)); foreach (System.Security.AccessControl.FileSystemAccessRule rule in rules) { Console.WriteLine(path + "檔案目錄許可權字元:" + rule.FileSystemRights); // 判定檔案是否具有FullControl或Write許可權 if (rule.FileSystemRights.ToString().Equals("FullControl") || rule.FileSystemRights.ToString().Equals("Write")) { HasProgramDataRights = true; break; } } // 為IE保護模式建立臨時儲存路徑 if (HasProgramDataRights) { // 建立操作路徑 string recordTemp = FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Record\\"; string screenshotTemp = FileHelp.GetAppDataLocalLow() + "\\CvNetVideo\\Screenshot\\"; string recordDst = FileHelp.GetCommonApplicationData() + "\\CvNetVideo\\Record\\"; string screenshotDst = FileHelp.GetCommonApplicationData() + "\\CvNetVideo\\Screenshot\\"; Directory.CreateDirectory(recordTemp); Directory.CreateDirectory(screenshotTemp); Directory.CreateDirectory(recordDst); Directory.CreateDirectory(screenshotDst); } }
C#檔案操作工具類
public class FileHelp { public enum GetDirectoryType { ByAppDomain,ByAssembly } public static string GetCurrentDirectory(GetDirectoryType type = GetDirectoryType.ByAppDomain) { switch (type) { case GetDirectoryType.ByAppDomain: return AppDomain.CurrentDomain.BaseDirectory; case GetDirectoryType.ByAssembly: return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); default: return AppDomain.CurrentDomain.BaseDirectory; } } public static string GetCurrentDirectoryByAssembly() { return GetCurrentDirectory(GetDirectoryType.ByAssembly); } /// <summary> ///程式資料路徑- C:\ProgramData /// </summary> /// <returns></returns> public static string GetCommonApplicationData() { return Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); } /// <summary> /// 使用者資料路徑 /// </summary> /// <returns></returns> public static string GetApplicationData() { return Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); } /// <summary> /// 使用者資料本地路徑 /// </summary> /// <returns></returns> public static string GetLocalApplicationData() { return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); } /// <summary> /// 使用者路徑 /// </summary> /// <returns></returns> public static string GetUserProfile() { return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); } /// <summary> /// 使用者的圖片路徑 /// </summary> /// <returns></returns> public static string GetMyPictures() { return Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); } /// <summary> /// 使用者的視訊路徑 /// </summary> /// <returns></returns> public static string GetMyVideos() { return Environment.GetFolderPath(Environment.SpecialFolder.MyVideos); } /// <summary> /// 使用者的文件路徑 /// </summary> /// <returns></returns> public static string GetMyDocuments() { return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); } /// <summary> /// IE保護模式下的低許可權操作路徑(Temporary Internet Files/Low) /// </summary> /// <returns></returns> public static string GetTemporaryInternetFiles() { return GetLocalApplicationData()+ "\\Microsoft\\Windows\\Temporary Internet Files\\Low"; } /// <summary> /// IE保護模式下的低許可權操作路徑(%userprofile%/AppData/LocalLow) /// </summary> /// <returns></returns> public static string GetAppDataLocalLow() { return GetUserProfile() + "\\AppData\\LocalLow"; } /// <summary> /// 獲取系統字型檔案路徑 /// </summary> /// <returns></returns> public static string GetFonts() { return Environment.GetFolderPath(Environment.SpecialFolder.Fonts); } /// <summary> /// 二進位制檔案讀取 /// </summary> /// <param name="FileUrl">檔案路徑</param> /// <returns></returns> public static byte[] BinaryRead(string FileUrl) { List<byte> lst = new List<byte>(); try { //檔案路徑 String filename = FileUrl; //開啟檔案 FileStream FStream; if (File.Exists(filename)) { FStream = new FileStream(filename,FileMode.Open); } else { return null; } int BufferSize = 1048576; //每次讀取的位元組數 每次讀取1MB byte[] Buffer = new byte[BufferSize]; long FileLength = FStream.Length;//檔案流的長度 int ReadCount = (int)(FileLength / BufferSize) + 1; //需要對檔案讀取的次數 //資料讀取 BinaryReader BWrite = new BinaryReader(FStream); //br.BaseStream.Seek(0,SeekOrigin.Begin); //while (br.BaseStream.Position < br.BaseStream.Length){} for (int a = 0; a < ReadCount; a++) { Buffer = BWrite.ReadBytes(BufferSize); lst.AddRange(Buffer); } BWrite.Close(); BWrite.Close(); return lst.ToArray(); } catch (System.Exception ex) { Log.WriteLog4Ex("FileHelp.BinaryRead",ex); return null; } } /// <summary> /// 二進位制檔案寫入 /// </summary> /// <param name="Bts"></param> /// <param name="DirectoryUrl">檔案目錄路徑</param> /// <param name="FileName">檔名稱</param> /// <returns></returns> public static bool BinaryWrite(byte[] Bts,string DirectoryUrl,string FileName) { try { //檔案路徑 string Filepath = DirectoryUrl + "\\" + FileName; //目錄建立 if (!Directory.Exists(DirectoryUrl)) Directory.CreateDirectory(DirectoryUrl); //檔案建立 FileStream FStream; if (File.Exists(Filepath)) { FStream = new FileStream(Filepath,FileMode.Append); } else { FStream = new FileStream(Filepath,FileMode.Create); } //資料寫入 BinaryWriter BWrite = new BinaryWriter(FStream); BWrite.Write(Bts); BWrite.Close(); FStream.Close(); return true; } catch (System.Exception ex) { Log.WriteLog4Ex("FileHelp.BinaryWrite",ex); return false; } } /// <summary> /// 二進位制檔案刪除 /// </summary> /// <param name="FileUrl">檔案路徑</param> public static void FileDelete(string FileUrl) { try { //檔案路徑 String filename = FileUrl; //刪除檔案 if (File.Exists(filename)) { File.Delete(filename); } } catch (System.Exception ex) { Log.WriteLog4Ex("FileHelp.FileDelete",ex); } } }
注:如果您是開發OCX遇到路徑問題請使用工具類中IE保護模式下的低許可權路徑。
補充知識:C#修改檔案或資料夾的許可權,為指定使用者、使用者組新增完全控制權限
寫在前面
在windows系統中,c盤中的目錄許可權比較高,有時製作安裝包的時候,預設的安裝路徑就是在c盤,但對執行可執行檔案,有時候需要為其新增完全控制權限,或者讀寫許可權。這裡將當時的解決方案記錄一下。
程式碼實現
在C盤新增一個資料夾,並在資料夾內部,新建一個文字檔案,如圖所示:
該資料夾下,新建一個文字檔案,如圖所示:
為檔案新增完全控制權限:
/// <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使用者組的訪問許可權規則 完全控制權限 fileSecurity.AddAccessRule(new FileSystemAccessRule("Everyone",FileSystemRights.FullControl,AccessControlType.Allow)); //新增Users使用者組的訪問許可權規則 完全控制權限 fileSecurity.AddAccessRule(new FileSystemAccessRule("Users",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使用者組的訪問許可權規則 完全控制權限 FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone",inherits,PropagationFlags.None,AccessControlType.Allow); //新增Users使用者組的訪問許可權規則 完全控制權限 FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users",AccessControlType.Allow); bool isModified = false; dirSecurity.ModifyAccessRule(AccessControlModification.Add,everyoneFileSystemAccessRule,out isModified); dirSecurity.ModifyAccessRule(AccessControlModification.Add,usersFileSystemAccessRule,out isModified); //設定訪問許可權 dir.SetAccessControl(dirSecurity); }
總結
在操作檔案的時候,還是比較簡單的,不過資料夾就比較複雜了,牽扯到是否要繼承的問題。
以上這篇使用C#程式驗證系統登入使用者與目錄許可權就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。