2011-09-02 11 views
24

का उपयोग कर मैं एक सेटअप परियोजना है कि मैं और विजुअल स्टूडियो 2010कैसे नेट

का उपयोग कर संस्थापक आवेदन को स्थापित करने के मामले में ठीक काम करता है उसके सभी निर्भरता का निर्माण होता है स्थापना के दौरान एक फ़ोल्डर में पढ़ें/लिखें अनुमतियाँ देने के लिए उनकी उचित उप निर्देशिका और प्रोग्राम डेटा निर्देशिका में।

हालांकि, मैंने देखा है कि प्रत्येक निर्देशिका (रूट फ़ोल्डर और इसकी सभी उप निर्देशिका) जो कि इंस्टॉलर द्वारा बनाई गई "अनुमति" अनुमति नहीं देती है। केवल अनुमतियाँ "उपयोगकर्ता" समूह के लिए निर्देशिका में जोड़े गए हैं:

  • पढ़ें & निष्पादित
  • सूची फ़ोल्डर सामग्री
  • पढ़ें

यह स्पष्ट डिफ़ॉल्ट अनुमतियाँ की स्थापना, होगा भले ही उपयोगकर्ता एप्लिकेशन को "प्रशासक" के रूप में स्थापित करता है या नहीं।

यह मेरे लिए अजीब है कि इंस्टॉलर नहीं देता है "लिखें" एक फ़ोल्डर है कि अनुप्रयोग है कि स्थापित हो रही है द्वारा किया जा रहा करने के लिए अनुमति लगता है - यह और भी भ्रामक है कि फ़ोल्डर संस्थापक ProgramData फ़ोल्डर में बनाता है एप्लिकेशन के डेटाबेस के लिए "लिखें" अनुमतियां नहीं मिलती हैं।

मेरा प्रश्न है, सेटअप प्रोजेक्ट को कॉन्फ़िगर करने का कोई तरीका है ताकि अगर कोई फ़ोल्डर बनाये, तो हम उसे बता सकते हैं कि किस प्रकार की अनुमतियां और इसे किसके लिए देना है। मेरे मामले में, मुझे रूट उपयोगकर्ता निर्देशिका (एप्लिकेशन का) और इसकी सभी उप निर्देशिकाएं, और "उपयोगकर्ता समूह" के लिए ProgramData फ़ोल्डर "पढ़ें/लिखें" अनुमतियों में रखे गए फ़ोल्डर की आवश्यकता है। तकनीकी रूप से, मैं "उपयोगकर्ता समूह" को डीआईआर "पूर्ण नियंत्रण" देने के साथ शांत हूं।

+0

शायद आपको पुनर्विचार करना चाहिए कि सही उत्तर – copa017

उत्तर

9

डिफ़ॉल्ट रूप से उपयोगकर्ता समूह के पास प्रोग्राम फ़ाइलों जैसे प्रति-मशीन स्थानों में लेखन पहुंच नहीं है। यह एक विंडोज मानक है जो प्रतिष्ठानों से संबंधित नहीं है। हालांकि, इंस्टॉल के दौरान आप अपनी इच्छित अनुमतियां सेट कर सकते हैं।

विंडोज इंस्टालर कस्टम अनुमतियों का समर्थन करता है, लेकिन विजुअल स्टूडियो उन्हें सेट करने का कोई तरीका नहीं प्रदान करता है। तो विजुअल स्टूडियो में एकमात्र समाधान एक कस्टम कार्रवाई है।

दुर्भाग्यवश विजुअल स्टूडियो संलग्न कस्टम क्रियाओं का समर्थन नहीं करता है। इसलिए अनुमतियों को सेट करने के लिए XCACLS.EXE का उपयोग केवल तभी काम करेगा जब आप इसे अपने पैकेज में शामिल करेंगे (यह आपकी फ़ाइलों के साथ लक्ष्य मशीन पर स्थापित होगा)।

एक क्लीनर, लेकिन अधिक जटिल समाधान आप चाहते हैं कि अनुमतियों को सेट करने के लिए एक कस्टम कार्रवाई (कस्टम कोड का उपयोग कर) लिखना है।

सबसे तेज़ और साफ समाधान एक अलग सेटअप संलेखन उपकरण का उपयोग करना होगा जो अनुमतियों पर अधिक नियंत्रण प्रदान करता है।

3

व्यवहार डिज़ाइन द्वारा है। कार्यक्रमों को अपडेट (इसलिए उनकी स्थापना निर्देशिका) को कुछ भी नहीं बल्कि अपडेट के लिए संशोधित नहीं किया जाना चाहिए (जिसे बिना किसी समस्या के विंडोज इंस्टालर के साथ किया जा सकता है)। यदि आप .NET का उपयोग कर रहे हैं, isolated storage उपयोगकर्ता डेटा स्टोर करने के लिए एक उत्कृष्ट स्थान है।

32

मुझे लगता है कि मेरे दूसरे पोस्ट कुछ ज़्यादा ही सामान्य होने के लिए हटा दिया गया था, तो मैं इसे नीचे परिष्कृत किया है:

करने के लिए बात एक कस्टम क्रिया करते हैं।यह बहुत सरल है, सी # कस्टम एक्शन here लिखने के लिए एमएसडीएन वॉकथ्रू देखें। आप इंस्टॉल विधि के अंदर अपना अनुमति बदलने वाला कोड डाल देंगे:

अपने इंस्टॉलर समाधान से संदर्भित एक नया इंस्टॉलर प्रोजेक्ट प्राप्त करने के लिए लिंक से पहले कुछ चरणों का पालन करें। आपको इसे इस तरह से करना है, इसलिए आप स्थापना के अंत में एक डीएलएल बना सकते हैं जिसे कॉल किया जाता है।

असल में उपयोगकर्ताओं के लिए पढ़ने/लिखने के विशेषाधिकारों को सेट करना थोड़ा सा ट्रिकियर था, और सबसे नज़दीक मैं प्राप्त कर सकता था प्रमाणीकृत उपयोगकर्ताओं के लिए सेट करना था। मैं एक साथ पत्थर में कुछ अन्य समाधान मैं इंटरनेट पर पाया इस साथ आने के लिए:

public override void Install(IDictionary stateSaver) 
{ 
    // This gets the named parameters passed in from your custom action 
    string folder = Context.Parameters["folder"]; 

    // This gets the "Authenticated Users" group, no matter what it's called 
    SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 

    // Create the rules 
    FileSystemAccessRule writerule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow); 

    if (!string.IsNullOrEmpty(folder) && Directory.Exists(folder)) 
    { 
     // Get your file's ACL 
     DirectorySecurity fsecurity = Directory.GetAccessControl(folder); 

     // Add the new rule to the ACL 
     fsecurity.AddAccessRule(writerule); 

     // Set the ACL back to the file 
     Directory.SetAccessControl(folder, fsecurity); 
    } 

    // Explicitly call the overriden method to properly return control to the installer 
    base.Install(stateSaver); 
} 

तब, जब आप अपने कस्टम कार्रवाई बनाने, उसके गुण संपादित करें, और CustomActionData गुण के तहत कुछ इस तरह जोड़ें:

/folder="[CommonAppDataFolder][ProductName]" 
+1

+1 है, सिवाय इसके कि मुझे ओवरराइड विधि के अंत में 'आधार। स्थापित करें (राज्यसेवर);' जोड़ना था। –

+0

@ DejanJanjušević अच्छा कॉल, मैंने अपना जवाब उसमें शामिल करने के लिए संपादित किया है। –

+2

जानकारी के लिए एसीके [आपकी पोस्ट से] _ "और सबसे नज़दीकी मैं प्राप्त कर सकता था प्रमाणीकृत उपयोगकर्ताओं के लिए सेट" _।एक ** BuildinUsersSid ** है जो ** उपयोगकर्ता ** संग्रह का प्रतिनिधित्व करता है। –

3
DirectoryInfo info = new DirectoryInfo(path[x]); 

DirectorySecurity security = info.GetAccessControl(); 

security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.Modify, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); 

security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.Modify, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); 

info.SetAccessControl(security); 

इनहेरिट हिस्सा स्थापना करता है, तो आप सहेजना चाहते हैं और ProgramData फ़ोल्डर में फ़ाइल सिर्फ एक से अधिक का उपयोग भी महत्वपूर्ण है।

0

यह उपयोगकर्ता समूह ऊपर उल्लेख किया गया के रूप में प्रोग्राम फ़ाइलें में लिखने की अनुमति नहीं देता है। यदि आप इंस्टॉलर क्लास या विक्स (यदि यह एक साधारण प्रोग्राम है) से निपटना नहीं चाहते हैं, तो बस अपने वॉल्यूम के तहत अपने सॉफ़्टवेयर को इंस्टॉल करना पसंद करें।

मैं के बारे में दृश्य स्टूडियो सेटअप विज़ार्ड बात कर रहा हूँ: बदलें आवेदन फ़ोल्डर 'DefaultLocation' [ProgramFilesFolder] से संपत्ति करने के लिए [WindowsVolume] [निर्माता] [उत्पाद का नाम] लक्ष्य मशीन पर फाइल सिस्टम में।

5
private static void GrantAccess(string file) 
     { 
      bool exists = System.IO.Directory.Exists(file); 
      if (!exists) 
      { 
       DirectoryInfo di = System.IO.Directory.CreateDirectory(file); 
       Console.WriteLine("The Folder is created Sucessfully"); 
      } 
      else 
      { 
       Console.WriteLine("The Folder already exists"); 
      } 
      DirectoryInfo dInfo = new DirectoryInfo(file); 
      DirectorySecurity dSecurity = dInfo.GetAccessControl(); 
      dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow)); 
      dInfo.SetAccessControl(dSecurity); 

     } 

उपर्युक्त कोड प्रत्येक उपयोगकर्ता (सभी) को पूर्ण नियंत्रण/पढ़ने-लिखने के लिए फ़ोल्डर के एक्सेस अधिकार सेट करेगा।

+0

इस कोड को कुछ भी स्थापित करने की आवश्यकता नहीं है, बस अपना वीएस चलाएं और कोड कॉपी करें, यह सिर्फ मेरे लिए प्रत्येक उपयोगकर्ता के लिए ठीक काम करता है –

0

मुझे लगता है कि यह सर्वर ऑपरेटिंग सिस्टम पर निर्भर करता है, और क्या आप उसी सर्वर पर कोड बना रहे हैं जैसे आप तैनात कर रहे हैं, या रिमोट एक?

cacls c:\[PathToWebsite]\[ChartImagesFolder] /E /G [AccountSiteRunsUnder]:C 

या एक तिथि विकल्प अप करने के लिए और अधिक (मैं का उपयोग नहीं किया गया है:

सरल बात करने के लिए एक बैच फ़ाइल में अपने xcopy आदेश रखा, और xcopy के बाद निम्नलिखित की तरह कुछ शामिल करने के लिए है इस, इसलिए मेरे मापदंडों बंद हो सकता है):

icacls c:\[PathToWebsite]\[ChartImagesFolder] /grant [AccountSiteRunsUnder]:M 

असल में, उन दोनों में से किसी उपयोगकर्ता खाते साइट को संशोधित (बदलें) फ़ोल्डर निर्दिष्ट में अधिकार के तहत चल रहा है देना चाहिए। यह फ़ोल्डर पर किसी भी मौजूदा अधिकार के अतिरिक्त होना चाहिए, मौजूदा अधिकारों को बदलने के लिए संशोधक या स्विच हैं।

यदि आप किसी दूरस्थ सर्वर पर तैनात कर रहे हैं, तो आपको वहां कमांड चलाने के लिए कुछ तंत्र की आवश्यकता होगी, हमने पाया है कि PSExec एक इलाज (SysInternals से पीएस टूल्स का हिस्सा) काम करता है।