दिलचस्प पोस्ट
विभाजित करने के लिए कैसे उद्धृत स्ट्रिंग्स में विभाजकों को अनदेखा करें, अजगर में? अजगर: सूची संकेतों में लैम्ब्डा फ़ंक्शन एक सूची में लगातार डुप्लिकेट की पहचान करने के लिए सबसे पायथनिक तरीका क्या है? क्या एंडवॉव () वैकल्पिक, सॉर्ट-इन वैकल्पिक, या निश्चित रूप से वैकल्पिक नहीं है? जावा स्ट्रिंग पर हैशोड () का संगतता प्रिंटफ़ के साथ 64-बिट पूर्णांक के क्रॉस-प्लेटफ़ॉर्म प्रिंटर MySQL में "रिवर्स ग्रुप_CONCAT"? स्ट्रिंग को एक मूल्य प्रकार या एक संदर्भ प्रकार है? पायथन: MySQLdb और "लाइब्रेरी लोड नहीं है: libmysqlclient.16.dylib" एचटीएमएल में "सभी का चयन करें" चेक बॉक्स कैसे कार्यान्वित करें? क्या "सी ++ प्रोग्रामिंग लैंग्वेज" के 4 वी संस्करण खंड 36.3.6 के इस कोड से अच्छी तरह परिभाषित व्यवहार है? जावास्क्रिप्ट / जेक्यू पेज पुनः लोड होने तक काम नहीं कर रहा है आईओएस – ViewController से ऐप डेलेगेट विधि कॉलिंग एंड्रॉइड – गतिविधि नहीं मिला अपवाद mysql लेनदेन – किसी भी अपवाद पर वापस रोल

सी # परीक्षा अगर उपयोगकर्ता ने किसी फ़ोल्डर में प्रवेश लिखना है

मुझे यह परीक्षण करने की आवश्यकता है कि कोई उपयोगकर्ता वास्तव में ऐसा करने का प्रयास करने से पहले किसी फ़ोल्डर में लिख सकता है।

मैंने निम्नलिखित विधि (सी # 2.0) को कार्यान्वित किया है जो फ़ोल्डर के लिए Directory.GetAccessControl () विधि का उपयोग करने के लिए सुरक्षा अनुमतियों को पुनर्प्राप्त करने का प्रयास करता है।

private bool hasWriteAccessToFolder(string folderPath) { try { // Attempt to get a list of security permissions from the folder. // This will raise an exception if the path is read only or do not have access to view the permissions. System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath); return true; } catch (UnauthorizedAccessException) { return false; } } 

जब मैं गोगग्लिंग था कि लिखने की एक्सेस के लिए कैसे परीक्षण किया जाए, ऐसा कुछ भी नहीं आया और यह वास्तव में विंडोज में अनुमतियों का परीक्षण करने के लिए बहुत जटिल दिखाई दिया। मुझे चिंतित है कि मैं चीजों को सरलीकृत कर रहा हूं और यह तरीका मजबूत नहीं है, हालांकि यह काम करने में प्रतीत होता है।

क्या मेरा तरीका परीक्षण करने के लिए होगा यदि वर्तमान उपयोगकर्ता ने प्रवेश कार्य ठीक से लिखा है?

Solutions Collecting From Web of "सी # परीक्षा अगर उपयोगकर्ता ने किसी फ़ोल्डर में प्रवेश लिखना है"

यह सी # में फ़ोल्डर पहुंच की जांच करने के लिए एक बिल्कुल मान्य तरीका है। यह एकमात्र जगह गिर सकता है, अगर आपको इसे एक तंग लूप में कॉल करना है जहां एक अपवाद के ओवरहेड एक मुद्दा हो सकता है

पहले से पूछे गए अन्य समान प्रश्न हैं ।

मुझे इसकी सराहना है कि इस पोस्ट के लिए दिन में थोड़ी देर हो चुकी है, लेकिन आपको यह कोड उपयोगी हो सकता है

 string path = @"c:\temp"; string NtAccountName = @"MyDomain\MyUserOrGroup"; DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity acl = di.GetAccessControl(AccessControlSections.All); AuthorizationRuleCollection rules = acl.GetAccessRules(true, true, typeof(NTAccount)); //Go through the rules returned from the DirectorySecurity foreach (AuthorizationRule rule in rules) { //If we find one that matches the identity we are looking for if (rule.IdentityReference.Value.Equals(NtAccountName,StringComparison.CurrentCultureIgnoreCase)) { //Cast to a FileSystemAccessRule to check for access rights if ((((FileSystemAccessRule)rule).FileSystemRights & FileSystemRights.WriteData)>0) { Console.WriteLine(string.Format("{0} has write access to {1}", NtAccountName, path)); } else { Console.WriteLine(string.Format("{0} does not have write access to {1}", NtAccountName, path)); } } } Console.ReadLine(); 

इसे एक कंसोल ऐप में ड्रॉप करें और देखें कि यह आपके लिए क्या आवश्यक है।

 public bool IsDirectoryWritable(string dirPath, bool throwIfFails = false) { try { using (FileStream fs = File.Create( Path.Combine( dirPath, Path.GetRandomFileName() ), 1, FileOptions.DeleteOnClose) ) { } return true; } catch { if (throwIfFails) throw; else return false; } } 

उदाहरण के लिए सभी उपयोगकर्ताओं (बिल्टिन \ उपयोगकर्ता) के लिए, यह विधि ठीक काम करती है – आनंद लें

 public static bool HasFolderWritePermission(string destDir) { if(string.IsNullOrEmpty(destDir) || !Directory.Exists(destDir)) return false; try { DirectorySecurity security = Directory.GetAccessControl(destDir); SecurityIdentifier users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); foreach(AuthorizationRule rule in security.GetAccessRules(true, true, typeof(SecurityIdentifier))) { if(rule.IdentityReference == users) { FileSystemAccessRule rights = ((FileSystemAccessRule)rule); if(rights.AccessControlType == AccessControlType.Allow) { if(rights.FileSystemRights == (rights.FileSystemRights | FileSystemRights.Modify)) return true; } } } return false; } catch { return false; } } 

मैंने इनमें से अधिकतर कोशिश की, लेकिन वे झूठी सकारात्मक हैं, सभी एक ही कारण के लिए .. यह उपलब्ध अनुमति के लिए निर्देशिका का परीक्षण करने के लिए पर्याप्त नहीं है, आपको यह जांचना होगा कि लॉग इन उपयोगकर्ता समूह का सदस्य है जिसके पास अनुमति। ऐसा करने के लिए आपको उपयोगकर्ता पहचान मिलती है, और जांचें कि क्या वह एक समूह का सदस्य है जिसमें FileSystemAccessRule IdentityReference शामिल है। मैंने यह परीक्षण किया है, flawlessly काम करता है ..

  /// <summary> /// Test a directory for create file access permissions /// </summary> /// <param name="DirectoryPath">Full path to directory </param> /// <param name="AccessRight">File System right tested</param> /// <returns>State [bool]</returns> public static bool DirectoryHasPermission(string DirectoryPath, FileSystemRights AccessRight) { if (string.IsNullOrEmpty(DirectoryPath)) return false; try { AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)); WindowsIdentity identity = WindowsIdentity.GetCurrent(); foreach (FileSystemAccessRule rule in rules) { if (identity.Groups.Contains(rule.IdentityReference)) { if ((AccessRight & rule.FileSystemRights) == AccessRight) { if (rule.AccessControlType == AccessControlType.Allow) return true; } } } } catch { } return false; } 

आईएमएचओ केवल 100% विश्वसनीय तरीके से परीक्षण करने के लिए यदि आप किसी निर्देशिका को लिख सकते हैं तो वास्तव में इसे लिखना है और अंत में अपवादों को पकड़ना है।

इसे इस्तेमाल करे:

 try { DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity acl = di.GetAccessControl(); AuthorizationRuleCollection rules = acl.GetAccessRules(true, true, typeof(NTAccount)); WindowsIdentity currentUser = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(currentUser); foreach (AuthorizationRule rule in rules) { FileSystemAccessRule fsAccessRule = rule as FileSystemAccessRule; if (fsAccessRule == null) continue; if ((fsAccessRule.FileSystemRights & FileSystemRights.WriteData) > 0) { NTAccount ntAccount = rule.IdentityReference as NTAccount; if (ntAccount == null) { continue; } if (principal.IsInRole(ntAccount.Value)) { Console.WriteLine("Current user is in role of {0}, has write access", ntAccount.Value); continue; } Console.WriteLine("Current user is not in role of {0}, does not have write access", ntAccount.Value); } } } catch (UnauthorizedAccessException) { Console.WriteLine("does not have write access"); } 

आपके कोड को DirectorySecurity लिए DirectorySecurity प्रदान की जाती है, और एक अपवाद (सुरक्षा जानकारी तक पहुंच न होने के कारण) को सही तरीके से प्रबंधित करता है। हालांकि, आपके नमूने में आप वास्तव में लौटे हुए ऑब्जेक्ट से पूछते हैं कि क्या पहुंच की अनुमति है – और मुझे लगता है कि आपको इसे जोड़ने की आवश्यकता है।

मैंने जांचने के लिए एक ही फ़ंक्शन का उपयोग किया है कि फ़ाइल में है WrititeAccess:

  private static bool HasWriteAccessToFile(string filePath) { try { // Attempt to get a list of security permissions from the file. // This will raise an exception if the path is read only or do not have access to view the permissions. File.GetAccessControl(filePath); return true; } catch (UnauthorizedAccessException) { return false; } } 

यहां CsabaS के जवाब का एक संशोधित संस्करण है, जो स्पष्ट रूप से इनकार करने के नियमों को अस्वीकार करते हैं। फ़ंक्शंस निर्देशिका के लिए सभी FileSystemAccessRules के माध्यम से चला जाता है, और यह जांचता है कि क्या वर्तमान उपयोगकर्ता उस भूमिका में है, जिसमें निर्देशिका तक पहुंच है। यदि ऐसी कोई भूमिका नहीं मिली है या उपयोगकर्ता अस्वीकृत पहुंच के साथ एक भूमिका में है, तो फ़ंक्शन गलत देता है। पढ़ने के अधिकारों की जांच करने के लिए, FileSystemRights पास करें। फ़ंक्शन पर पढ़ें; लिखने के अधिकार के लिए, FileSystemRights पास करें। लिखें। यदि आप एक मनमाने ढंग से उपयोगकर्ता के अधिकारों को देखना चाहते हैं और वर्तमान में नहीं है, तो वांछित WindowsIdentity के लिए currentUser WindowsIdentity का स्थान बदलें। मैं यह भी निर्धारित करता हूं कि इस तरह के कार्यों पर निर्भर होने के लिए सलाह दी जाए कि उपयोगकर्ता सुरक्षित रूप से निर्देशिका का उपयोग कर सकता है या नहीं। यह जवाब पूरी तरह से बताता है कि क्यों

  public static bool UserHasDirectoryAccessRights(string path, FileSystemRights accessRights) { var isInRoleWithAccess = false; try { var di = new DirectoryInfo(path); var acl = di.GetAccessControl(); var rules = acl.GetAccessRules(true, true, typeof(NTAccount)); var currentUser = WindowsIdentity.GetCurrent(); var principal = new WindowsPrincipal(currentUser); foreach (AuthorizationRule rule in rules) { var fsAccessRule = rule as FileSystemAccessRule; if (fsAccessRule == null) continue; if ((fsAccessRule.FileSystemRights & accessRights) > 0) { var ntAccount = rule.IdentityReference as NTAccount; if (ntAccount == null) continue; if (principal.IsInRole(ntAccount.Value)) { if (fsAccessRule.AccessControlType == AccessControlType.Deny) return false; isInRoleWithAccess = true; } } } } catch (UnauthorizedAccessException) { return false; } return isInRoleWithAccess; } 

आप निम्न कोड ब्लॉक का उपयोग करके जांच सकते हैं कि डायरेक्ट्री लिखने का उपयोग कर रही है या नहीं। यह FileSystemAccessRule जांचता है

 string directoryPath = "C:\\XYZ"; //folderBrowserDialog.SelectedPath; bool isWriteAccess = false; try { AuthorizationRuleCollection collection = Directory.GetAccessControl(directoryPath) .GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); foreach (FileSystemAccessRule rule in collection) { if (rule.AccessControlType == AccessControlType.Allow) { isWriteAccess = true; break; } } } catch (UnauthorizedAccessException ex) { isWriteAccess = false; } catch (Exception ex) { isWriteAccess = false; } if (!isWriteAccess) { //handle notifications } 

आपके पास अपने कोड में एक संभावित दौड़ की स्थिति है – क्या होगा अगर उपयोगकर्ता को फ़ोल्डर में लिखने की अनुमति है जब आप चेक करते हैं, लेकिन उपयोगकर्ता वास्तव में फ़ोल्डर को लिखने से पहले यह अनुमति वापस ले ली जाती है? लिखना एक अपवाद फेंक देगा जिसे आपको पकड़ने और संभाल करने की आवश्यकता होगी। तो प्रारंभिक जांच निरर्थक है आप लिख सकते हैं और किसी भी अपवाद को संभाल सकते हैं। यह आपकी स्थिति के लिए मानक पैटर्न है

http://www.codeproject.com/KB/files/UserFileAccessRights.aspx

बहुत उपयोगी वर्ग, संदेश में सुधार संस्करण के लिए जांच करें।

बस सवाल में फाइल का उपयोग करने की कोशिश करना जरूरी पर्याप्त नहीं है परीक्षा कार्यक्रम चलाने वाले उपयोगकर्ता की अनुमति के साथ चलती है – यह जरूरी नहीं है कि आप जिस उपयोगकर्ता अनुमति के खिलाफ परीक्षण करना चाहते हैं

स्वीकार्य उत्तर में अनुशंसित के रूप में मुझे विंडोज 7 पर अपवाद फेंकने के लिए GetAccessControl () प्राप्त नहीं हो सका।

मैं sdds के जवाब की एक विविधता का उपयोग कर समाप्त हो गया:

  try { bool writeable = false; WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); DirectorySecurity security = Directory.GetAccessControl(pstrPath); AuthorizationRuleCollection authRules = security.GetAccessRules(true, true, typeof(SecurityIdentifier)); foreach (FileSystemAccessRule accessRule in authRules) { if (principal.IsInRole(accessRule.IdentityReference as SecurityIdentifier)) { if ((FileSystemRights.WriteData & accessRule.FileSystemRights) == FileSystemRights.WriteData) { if (accessRule.AccessControlType == AccessControlType.Allow) { writeable = true; } else if (accessRule.AccessControlType == AccessControlType.Deny) { //Deny usually overrides any Allow return false; } } } } return writeable; } catch (UnauthorizedAccessException) { return false; } 

उम्मीद है की यह मदद करेगा।

मैं ऐश से सहमत हूँ, यह ठीक होना चाहिए। वैकल्पिक रूप से आप घोषणात्मक सीएएस का इस्तेमाल कर सकते हैं और वास्तव में प्रोग्राम को पहले स्थान पर चलने से रोक सकते हैं यदि उनके पास पहुंच नहीं है।

मेरा मानना ​​है कि सीएएस सुविधाओं में से कुछ सी # 4.0 में जो मैंने सुना है, में मौजूद नहीं हो सकता है, यह निश्चित नहीं है कि अगर यह कोई समस्या हो या नहीं।

मुझे एक ही समस्या का सामना करना पड़ा: यह कैसे सत्यापित करें कि मैं किसी विशेष निर्देशिका में पढ़ / लिख सकता / सकती हूं। मुझे आसान समाधान के साथ समाप्त हुआ … वास्तव में इसका परीक्षण करें। यहाँ मेरी सरल हालांकि प्रभावी समाधान है

  class Program { /// <summary> /// Tests if can read files and if any are present /// </summary> /// <param name="dirPath"></param> /// <returns></returns> private genericResponse check_canRead(string dirPath) { try { IEnumerable<string> files = Directory.EnumerateFiles(dirPath); if (files.Count().Equals(0)) return new genericResponse() { status = true, idMsg = genericResponseType.NothingToRead }; return new genericResponse() { status = true, idMsg = genericResponseType.OK }; } catch (DirectoryNotFoundException ex) { return new genericResponse() { status = false, idMsg = genericResponseType.ItemNotFound }; } catch (UnauthorizedAccessException ex) { return new genericResponse() { status = false, idMsg = genericResponseType.CannotRead }; } } /// <summary> /// Tests if can wirte both files or Directory /// </summary> /// <param name="dirPath"></param> /// <returns></returns> private genericResponse check_canWrite(string dirPath) { try { string testDir = "__TESTDIR__"; Directory.CreateDirectory(string.Join("/", dirPath, testDir)); Directory.Delete(string.Join("/", dirPath, testDir)); string testFile = "__TESTFILE__.txt"; try { TextWriter tw = new StreamWriter(string.Join("/", dirPath, testFile), false); tw.WriteLine(testFile); tw.Close(); File.Delete(string.Join("/", dirPath, testFile)); return new genericResponse() { status = true, idMsg = genericResponseType.OK }; } catch (UnauthorizedAccessException ex) { return new genericResponse() { status = false, idMsg = genericResponseType.CannotWriteFile }; } } catch (UnauthorizedAccessException ex) { return new genericResponse() { status = false, idMsg = genericResponseType.CannotWriteDir }; } } } public class genericResponse { public bool status { get; set; } public genericResponseType idMsg { get; set; } public string msg { get; set; } } public enum genericResponseType { NothingToRead = 1, OK = 0, CannotRead = -1, CannotWriteDir = -2, CannotWriteFile = -3, ItemNotFound = -4 } 

आशा करता हूँ की ये काम करेगा !