2012-04-10 4 views
6

मैं यह सुनिश्चित करने के लिए सी # में एक छोटी उपयोगिता लिख ​​रहा हूं कि एक निर्दिष्ट फ़ोल्डर और इसकी सभी सामग्री के पास उचित पहुंच अधिकार हैं (मैं Authenticated Users समूह पूर्ण पहुंच देना चाहता हूं)। निम्नलिखित कोड शीर्ष स्तर फ़ोल्डर की एसीएल (अभिगम नियंत्रण सूची) को अद्यतन करने के लिए ठीक से काम करने लगता है:यह देखने के लिए कि "विरासत अनुमतियां शामिल हैं" को फ़ाइल या फ़ोल्डर के लिए अनचेक किया गया है या नहीं?

SecurityIdentifier allUsers = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 
InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 
FileSystemAccessRule newRule = new FileSystemAccessRule(allUsers, 
    FileSystemRights.FullControl, iFlags, 
    PropagationFlags.None, AccessControlType.Allow); 

DirectoryInfo info = new DirectoryInfo(folderPath); 
DirectorySecurity security = info.GetAccessControl(); 
security.AddAccessRule(newRule); 
info.SetAccessControl(security); 

मैंने देखा है, तथापि, कि इस नए पहुंच नियम सबफ़ोल्डर है कि "शामिल करने के लिए प्रचार नहीं कर रहा है विरासत अनुमतियां ... "विकल्प उनके सुरक्षा गुणों में अनचेक किया गया। यह केवल समझ में आता है। तो, मैं जो करना चाहता हूं वह इस तरह के सबफ़ोल्डर के लिए सुरक्षा अनुमति विरासत को वापस चालू करना है।

मेरी खुदाई ने ObjectSecurity.SetAccessRuleProtection विधि को अनदेखा कर दिया है जो मुझे चाहिए जो आधा होना चाहिए। हालांकि, यह उन ऑब्जेक्ट्स पर उपरोक्त विधि का अंधाधुंध उपयोग करने के लिए मैला लगता है जो पहले से ही अपने माता-पिता के डीएसीएल का उत्तराधिकारी है। इस प्रकार, मैं यह निर्धारित करना चाहता हूं कि कौन सी ऑब्जेक्ट्स की अनुमति विरासत बंद हो गई है, लेकिन मुझे इस विधि को संबंधित विधि या संपत्ति नहीं मिल रही है। क्या कोई है? क्या मुझसे कोई चूक हो रही है?

+0

यह क्यों फर्क पड़ता है अगर एक मूल फ़ोल्डर पहले से ही यह स्थापित किया है? इसे फिर से स्थापित करना किसी भी दुःख का कारण नहीं बनना चाहिए। –

+0

@ एम। बाबाकॉक - व्यावहारिक कारणों से यह एक फ़ाइल या फ़ोल्डर में अद्यतन को मजबूर करने के लिए अपर्याप्त और अक्षम लगता है जिसे अपडेट करने की आवश्यकता नहीं है। मेरे विशिष्ट मामले में, केवल कुछ उपफोल्डर्स हैं जो * एक्सेस अधिकारों का वारिस नहीं करते हैं, लेकिन उन फ़ोल्डर्स में सैकड़ों या हजारों फाइलें हैं जो * * * करती हैं। प्रदर्शन कारणों से मैं इन सभी वस्तुओं की तुलना में इन वस्तुओं की एक मुट्ठी भर अद्यतन करूँगा। – Jeremy

+1

हालांकि डुप्लिकेट नहीं है, यह http://stackoverflow.com/questions/6574196/programatically-removing-include-heheritable-permissions-from-this-objects-par – emd

उत्तर

4

मैं कुछ इस तरह का उपयोग कर याद रखें:

मैं भी इस के लिए जाँच करने के लिए एक विधि को खोजने के लिए कोशिश कर रहा था, लेकिन मैं किसी भी (सी में भी ++) नहीं पा सके। तो मैं उपरोक्त कोड का उपयोग कर समाप्त हो गया। इसने एक जादू की तरह काम किया।

+0

के विपरीत है यह एमएस से नहीं की तरह दिखता है इसे जांचने के लिए एक और सीधी विधि प्रदान करें, लेकिन यह वही है जो मैं ढूंढ रहा था। :) – Jeremy

+1

आपका उदाहरण केवल 'अगर थ्रेरे विरासत में मिला है' दिखाता है और 'विरासत को चालू करने पर दिखाया नहीं जाता है'। यह एक अंतर है जब मूल फ़ोल्डर केवल मूल फ़ोल्डर (और सबफ़ोल्डर या फ़ाइलों के लिए नहीं) या जब एसीएल दूषित हो जाता है, तो अधिकारों का प्रचार करता है। दोनों मामलों में आपको 'चालू होने पर भी कोई विरासत नहीं मिलेगी'। – boboes

1

लगता है कि वहाँ एक कामयाब तरीका यह है है की तरह:

DirectorySecurity ds = System.IO.Directory.GetAccessControl(@"C:\test"); 
byte[] rawBytes = ds.GetSecurityDescriptorBinaryForm(); 
RawSecurityDescriptor rsd = new RawSecurityDescriptor(rawBytes, 0); 

if ((rsd.ControlFlags & ControlFlags.DiscretionaryAclProtected) == 
         ControlFlags.DiscretionaryAclProtected) 
{ 
    // "Include inheritable permissions from this object's parent" is unchecked 
} 
else 
{ 
    // "Include inheritable permissons from this object's parent" is checked 
} 
संबंधित मुद्दे

 संबंधित मुद्दे