2012-01-20 13 views
8

में सभी उपयोगकर्ताओं के लिए निर्देशिका अनुमतियां सेट करें यह एक काफी साधारण समस्या होनी चाहिए, लेकिन किसी कारण से मुझे यह काम करने के लिए प्रतीत नहीं होता है। मैं बस इतना करना चाहता हूं कि सभी उपयोगकर्ताओं को पूर्ण पहुंच की अनुमति देने के लिए किसी दिए गए निर्देशिका पर अनुमतियां सेट करें। यहां मेरे पास अब तक का कोड है:सी # - विंडोज 7

System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(destinationDirectory); 
FileSystemAccessRule fsar = new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow); 
DirectorySecurity ds = null; 

    if (!di.Exists) 
    { 
     System.IO.Directory.CreateDirectory(destinationDirectory); 
    } 

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 

कोई अपवाद नहीं फेंक दिया गया है, लेकिन कुछ भी नहीं होता है। जब कोड चलाए जाने के बाद मैं निर्देशिका अनुमतियों की जांच करता हूं, तो मुझे कोई बदलाव दिखाई नहीं देता है।

कोई विचार?

अग्रिम धन्यवाद,
सन्नी

+0

क्या आपने यूएसी अक्षम के साथ ऊपर कोड चलाने की कोशिश की? – rkosegi

+1

@ डेविड - मैंने संकलित एक्सई को व्यवस्थापक के रूप में चलाने का प्रयास किया है और इससे परिणाम में कोई फर्क नहीं पड़ता है। –

+0

@rkosegi - मैं यह कैसे कर सकता हूं? क्या यह विजुअल स्टूडियो में एक सेटिंग है? –

उत्तर

25

तुम भी SetAccessControl कॉल करने के लिए परिवर्तनों को लागू करने की जरूरत है।

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 
di.SetAccessControl(ds); // nothing happens until you do this 

ऐसा नहीं है कि MSDN पर उदाहरण अत्यंत कष्ट, विस्तार में कमी है के रूप में चर्चा here लगता है। मैं जिसके बाद अच्छी तरह से बर्ताव करता है पाने के लिए इस लेख से कोड को हैक कर लिया:

static bool SetAcl() 
{ 
    FileSystemRights Rights = (FileSystemRights)0; 
    Rights = FileSystemRights.FullControl; 

    // *** Add Access Rule to the actual directory itself 
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights, 
           InheritanceFlags.None, 
           PropagationFlags.NoPropagateInherit, 
           AccessControlType.Allow); 

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory); 
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access); 

    bool Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result); 

    if (!Result) 
     return false; 

    // *** Always allow objects to inherit on a directory 
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit; 
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 

    // *** Add Access rule for the inheritance 
    AccessRule = new FileSystemAccessRule("Users", Rights, 
           iFlags, 
           PropagationFlags.InheritOnly, 
           AccessControlType.Allow); 
    Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result); 

    if (!Result) 
     return false; 

    Info.SetAccessControl(Security); 

    return true; 
} 
+0

धन्यवाद, डेविड। फिर भी कोई भाग्य नहीं है। क्या इस उद्देश्य के लिए समूह "उपयोगकर्ता" का मेरा उपयोग सही है? मैंने exe को व्यवस्थापक के रूप में चलाने का प्रयास किया है और अभी भी कुछ भी नहीं हो रहा है जब मैं विंडोज के माध्यम से जाता हूं और फ़ोल्डर पर अनुमतियों की जांच करता हूं। –

+2

करीब आना। "उपयोगकर्ताओं" को "हर किसी" में बदलकर अब फ़ोल्डर में "हर कोई" समूह जोड़ा गया है, लेकिन अनुमतियां खाली दिखाई देती हैं; कुछ भी नहीं दिया गया। –

+0

कोड "उपयोगकर्ताओं" के साथ भी मेरे लिए ठीक काम कर रहा है। उस ने कहा, मुझे लगता है कि पूरा नाम '@" बिल्टिन \ उपयोगकर्ता "है लेकिन यह किसी भी तरह से काम करता है। –

5

डेविड हेफेरनान जवाब एक गैर अंग्रेजी मशीन, जहां "उपयोगकर्ता" पर अनुमतियों को सेट करने का प्रयास एक IdentityNotMapped अपवाद के साथ विफल रहता है पर काम नहीं करता । निम्नलिखित कोड WellKnownSidType.BuiltinUsersSid का उपयोग करके हर जगह काम करेगा:

static void SetFullControlPermissionsToEveryone(string path) 
{ 
    const FileSystemRights rights = FileSystemRights.FullControl; 

    var allUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 

    // Add Access Rule to the actual directory itself 
    var accessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.None, 
     PropagationFlags.NoPropagateInherit, 
     AccessControlType.Allow); 

    var info = new DirectoryInfo(path); 
    var security = info.GetAccessControl(AccessControlSections.Access); 

    bool result; 
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

    if (!result) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission to all users for path " + path); 
    } 

    // add inheritance 
    var inheritedAccessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.InheritOnly, 
     AccessControlType.Allow); 

    bool inheritedResult; 
    security.ModifyAccessRule(AccessControlModification.Add, inheritedAccessRule, out inheritedResult); 

    if (!inheritedResult) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission inheritance to all users for " + path); 
    } 

    info.SetAccessControl(security); 
} 
+1

बहुत बहुत धन्यवाद, आपने मुझे बहुत दर्द बचाया। –