c# System.UnauthorizedAccessException प्रोग्राम फ़ाइलों के तहत.exe चलाते समय




windows wix (3)

वाईएक्सएक्स इंस्टॉलर के माध्यम से मैंने अपना विंडोज एप्लिकेशन इंस्टॉल किया और फ़ोल्डर को .exe और आवश्यक dll के साथ c:\ProgramFiles के तहत बनाया जा रहा है।

.Exe चलाते समय मुझे System.UnauthorizedAccessException मिल रहा है।

अगर कोई उपयोगी सुझाव हो तो कृपया मुझे बताएं।

कृपया संदर्भ के लिए नीचे दिए गए इवेंट लॉग को देखें।

Application: xxxxxxx.exe
Framework Version: v1.0.0
Description: The process was terminated due to an unhandled exception.
Exception Info: System.UnauthorizedAccessException
   at System.IO.__Error.WinIOError(Int32, System.String)
   at System.IO.FileStream.Init(System.String, System.IO.FileMode, System.IO.FileAccess, Int32, Boolean, System.IO.FileShare, Int32, System.IO.FileOptions, SECURITY_ATTRIBUTES, System.String, Boolean, Boolean, Boolean)
   at System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, Int32, System.IO.FileOptions, System.String, Boolean, Boolean, Boolean)
   at System.IO.StreamWriter.CreateFile(System.String, Boolean, Boolean)
   at System.IO.StreamWriter..ctor(System.String, Boolean, System.Text.Encoding, Int32, Boolean)
   at System.IO.StreamWriter..ctor(System.String, Boolean)
   at System.IO.File.AppendText(System.String)

आप .NET प्रतिरूपण अवधारणा का भी लाभ उठा सकते हैं, यदि कोई अन्य वैकल्पिक स्थान नहीं है जिसे प्रशासनिक विशेषाधिकारों की आवश्यकता नहीं है।

यहाँ .Net प्रतिरूपण का अवलोकन प्राप्त करने के लिए लिंक है।

आप .NET में प्रतिरूपण कैसे करते हैं?


कारण

यह एक साधारण पहुंच उल्लंघन की तरह दिखता है - आप एक फ़ाइल पर लिखने की पहुंच प्राप्त करने का प्रयास करते हैं, जिसके लिए आपके पास अनुमतियाँ नहीं हैं - आपके द्वारा %ProgramFiles% रहे संदर्भ में ( %ProgramFiles% तहत फ़ाइलें नियमित उपयोगकर्ताओं, या गैर-उन्नत एडमिट के लिए योग्य नहीं हैं - फाइल वर्चुअलाइजेशन, नीचे खंड 9 देखें)।

यहाँ एक सामान्य लॉन्च एरर चेक-लिस्ट है - शायद उपयोगी नहीं है क्योंकि आपके पास मूल रूप से एक सरल एक्सेस उल्लंघन है (इसलिए ऐसा लगता है)। यह सुनिश्चित नहीं है कि लिंक किए गए उत्तर को हालांकि अस्वीकृत कर दिया गया है। मैंने कुछ बिंदुओं को गड़बड़ कर दिया होगा - यह सिर्फ एक गड़बड़ सूची है जिसका मतलब कुछ विचारों को उगलना है। आसान पुनर्प्राप्ति के लिए यहां शामिल हैं।

सुझाए गए संभावित सुधार

यहाँ कुछ संभावित दृष्टिकोणों की एक सूची दी गई है जिनका उपयोग आप समस्या के आसपास काम करने के लिए कर सकते हैं, समस्या के कारण को ठीक कर सकते हैं, या चीजों को फिर से डिज़ाइन कर सकते हैं ताकि समस्या को प्रभावी रूप से टाला जा सके। और कुछ दृष्टिकोण हैं जो केवल संभव हैं और शायद ही कभी उपयोग किए जाते हैं।

नीचे दी गई सूची वरीयता क्रम में नहीं है । वास्तव में, मेरे विचार में दृष्टिकोण संख्या 1 बहुत अवांछनीय है। दृष्टिकोण 6 प्रभावी हो सकता है, लेकिन यह महान नहीं (निश्चित रूप से हालांकि 1 से बेहतर)। मैं अन्य दृष्टिकोणों ( 9 को छोड़कर) के साथ रह सकता हूं, और 2 शायद उपयोग करने के लिए सबसे आम है।

1. एलिवेट एप्लिकेशन (व्यवस्थापक अधिकार) : जैसा कि अन्य लोगों ने सुझाव दिया है कि आप इन दिनों अपना आवेदन अधिकार अधिकारों के साथ चला सकते हैं (इन दिनों बहुत बुरा व्यवहार - व्यवस्थापक अधिकार व्यापक, शहर की कुंजी हैं, और आपके आवेदन को हैकर लक्ष्य बनाते हैं और बनाता भी है। आवेदन अधिक खतरनाक है अगर इसमें कैलिबर के कीड़े हैं)। यहाँ एक छोटा-सा तरीका है: मैं अपने .NET अनुप्रयोग को व्यवस्थापक के रूप में चलाने के लिए कैसे बाध्य करूँ?

  • केवल व्यवस्थापक उपयोगकर्ता : सामान्य रूप से, सामान्य उपयोगकर्ताओं के लिए काम नहीं करेगा! (वे एक व्यवस्थापक पासवर्ड के लिए प्रेरित किया जाएगा)। केवल प्रवेश ही उत्थान कर सकते हैं !
  • रिक्त व्यवस्थापक पासवर्ड : यदि बॉक्स पर एक रिक्त व्यवस्थापक पासवर्ड है (घर के पीसी पर आम), कोई भी उपयोगकर्ता किसी भी बाइनरी सेट को अपनी इच्छा के अनुसार अपने स्वयं के प्रतिबंधित खाते में लॉग इन कर सकते हैं। (वे स्पष्ट रूप से पहले से ही खाली पासवर्ड खाते के साथ व्यवस्थापक के रूप में लॉग इन कर सकते हैं और पूरी तरह से कुछ भी लॉन्च कर सकते हैं - इसलिए सुरक्षा छेद पहले से ही खाली पासवर्ड के साथ है, भले ही ऊंचाई के मुद्दों की परवाह किए बिना - लेकिन क्यों खाली पासवर्ड खातों के साथ उन्नयन की अनुमति है? )।
  • UAC : UAC अक्षम होने पर क्या होता है? मानक उपयोगकर्ताओं को शायद केवल एक पासवर्ड के लिए संकेत नहीं दिया जाता है, और लॉन्च विफल हो जाता है? मुझे अभी तक प्रयास करने का मौका नहीं मिला है।
  • सुरक्षा : कुछ परिदृश्यों में, उन्नत प्रक्रियाएं अन्य उन्नत प्रक्रियाओं को लॉन्च करने में सक्षम दिखाई देती हैं जो मूल प्रक्रिया को समाप्त कर सकती हैं (उपयोगकर्ता के NT विशेषाधिकार लॉन्च करने पर निर्भर करती है)। पागलपन।

2. उपयोगकर्ता प्रोफ़ाइल (फ़ाइल को स्थानांतरित करें) : आप यह निर्धारित कर सकते हैं कि किस फ़ाइल का उपयोग उल्लंघन का कारण बन रहा है (कुछ प्रकार की सेटिंग्स फ़ाइल?) और इसे उस स्थान पर स्थानांतरित करें जहां उपयोगकर्ताओं के सभी मामलों में नियमित उपयोग अधिकार हैं। आम तौर पर उपयोगकर्ता प्रोफ़ाइल (अनुशंसित) में कहीं न कहीं।

3. केवल-पढ़ने के लिए पहुँच : बहुत बार आप सेटिंग्स फ़ाइलों के लिए केवल-पढ़ने के लिए पहुँच प्राप्त कर सकते हैं। शायद आप इसके बजाय इस दृष्टिकोण को लागू कर सकते हैं? यह सब आपके आवेदन के डिजाइन पर निर्भर करता है। शायद आप handle the access denied exception को handle the access denied exception सकते handle the access denied exception और फिर रीड-ओनली चला सकते हैं?

4. आंतरिक चूक : केवल-पढ़ने के दृष्टिकोण के स्वाद के रूप में, आप पूरी सेटिंग्स फ़ाइल को खो सकते हैं और आंतरिक चूक पर भरोसा कर सकते हैं। शायद ही कोई विकल्प मुझे लगता है, लेकिन संभव है।

5. ऑनलाइन सेटिंग्स? : कुछ लोग सेटिंग्स फ़ाइलों को पूरी तरह से समाप्त करना चाहते हैं (या उन्हें केवल पढ़ने के लिए बनाते हैं) और फिर लॉन्च पर एक डेटाबेस से "वास्तविक सेटिंग्स" को पुनः प्राप्त करते हैं। इस दृष्टिकोण के नाटकीय लाभ हो सकते हैं - विशेष रूप से कॉर्पोरेट अनुप्रयोगों के लिए - सेटिंग्स प्रबंधन और संस्करण, उपयोगकर्ता प्रोफ़ाइल रोमिंग मुद्दों का उन्मूलन, आदि ... (और पाठ्यक्रम की चुनौतियां - network issues , firewall , proxy , etc... )।

6. ACL अनुमति : आप स्थापना पर सवाल करने के लिए फ़ाइल में ACL अनुमतियाँ लागू कर सकते हैं, जिससे नियमित उपयोगकर्ता इसे लिख सकते हैं। महान डिजाइन बिल्कुल नहीं, लेकिन यह काम करेगा । और निश्चित रूप से व्यवस्थापक अधिकारों (उन्नत) के साथ चलने से बेहतर है - क्योंकि आप आवश्यक पहुंच को इंगित करते हैं, और पूरी प्रक्रिया को बढ़ाते नहीं हैं। केवल संपूर्ण फ़ोल्डर तक पूर्ण पहुंच का निपटान न करें - केवल एकल फ़ाइलों के लिए खुला लेखन पहुंच।

7. विंडोज सेवा : कुछ मामलों में, कोई ऐसे एप्लिकेशन के हिस्सों को चला सकता है, जिसे विंडोज सेवा के रूप में उन्नत अधिकारों की आवश्यकता होती है। ऐसा दृष्टिकोण नहीं जिसे मैंने बहुत बार देखा है, लेकिन संभव है। फिर आप LocalSystem या समतुल्य, उन्नत खाते ( या सेवा खातों का उपयोग करके - " अन्य दृष्टिकोण " अनुभाग - या इस वैकल्पिक उत्तर के रूप में चलाने के लिए सेवा स्थापित करते हैं)। शायद मैं scheduled task उल्लेख कर सकता हूं - मैंने कभी भी इस तरह के परिदृश्य के लिए निर्धारित कार्य का उपयोग करने की कोशिश नहीं की।

8. प्रतिरूपण करें : मुझे लगता है कि आप प्रश्न में स्थान पर लिखने के लिए पहुँच अधिकार के साथ एक खाता लगा सकते हैं। मैं इस दृष्टिकोण का उपयोग नहीं करता हूं इसलिए मैं तकनीकी विवरण, पहलुओं और चुनौतियों के बारे में अनिश्चित हूं। बस इसे एक विकल्प के रूप में तैयार करना।

9. वर्चुअलाइजेशन दृष्टिकोण : बस इसका उल्लेख करना। वर्चुअलाइजेशन के विभिन्न रूप - उदाहरण के लिए नीतियों के लिए आप फ़ाइल और रजिस्ट्री लिखने में विफलताओं को लिखने योग्य जगह पर पुनर्निर्देशित करने की अनुमति दे सकते हैं। भविष्य के विंडोज संस्करण में सुविधा को हटाने के लिए। विंडोज़ 10. राज्य में सुनिश्चित नहीं है। रजिस्ट्री वर्चुअलाइजेशन पर एमएसडीएन )। आम तौर पर कोई समस्या हल नहीं हुई, लेकिन कई समस्याओं को मान्यता नहीं मिली। कुल मिलाकर भ्रम पैदा करने के लिए निश्चित है क्योंकि लोग यह नहीं देखते कि डेटा कहां लिखा है, और डेटा उपयोगकर्ताओं के बीच साझा नहीं किया जाता है - लेकिन उपयोगकर्ता-विशिष्ट। और ऐप-वी और कंटेनर जैसे फुल-ऑन वर्चुअलाइजेशन / डेटा स्ट्रीमिंग हैं जो पूर्ण पहुंच की अनुमति देते हैं। मेरी खासियत नहीं, और मेरी पसंद नहीं।

कृपया इस वर्चुअलाइजेशन या डेटा पुनर्निर्देशन बकवास का उपयोग न करें (यह क्रैश अनुप्रयोगों के लिए है, उपयोग करने के लिए नए अनुप्रयोगों के लिए नहीं)। मैं अभी भी कुछ तकनीकी विवरणों के लिए एक लिंक जोड़ूंगा कि फीचर वास्तव में कैसे काम करता है (इस पुनर्निर्देशन के काम से पहले कई आवश्यक शर्तें हैं जो संतुष्ट होनी चाहिए): लॉग 4नेट लॉग फाइल विंडोज इंस्टॉलर में दिखाई नहीं देती है जो एप्लिकेशन इंस्टॉलेशन उप फ़ोल्डर में दिखाई देती है ( recommended to show why this feature should never be used )।

नीचे लिंक प्रति उपयोगकर्ता फ़ाइल परिनियोजन के विषय पर वापस रास्ते से एक उत्तर है और यह कैसे कुछ वैकल्पिक नेटवर्क / डेटाबेस / क्लाउड दृष्टिकोणों के साथ एक पैकेज में किया जा सकता है।

यह एक शामिल पढ़ा जा सकता है, लेकिन यहाँ यह है - यह अनिवार्य रूप से उपरोक्त संभावनाओं के कुछ और क्रमांकन प्रदान करता है :

कुछ लिंक :


जहां आवेदन नहीं लिखना चाहिए, वहां लिखने का प्रयास न करें। उदाहरण के लिए अन्य फ़ोल्डरों का उपयोग करें:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

यदि कोई संभावित विकल्प नहीं है, जिसे मैं गंभीरता से संदेह करता हूं, तो प्रशासनिक विशेषाधिकारों के साथ निष्पादन योग्य चलाएं।

https://msdn.microsoft.com/en-us/library/bb756929.aspx





windows-installer