2012-04-22 17 views
5

मैं एक आवेदन जो उपयोगकर्ता के% APPDATA% निर्देशिका के अंदर इसकी सेटिंग्स निर्देशिका बनाने की जरूरत है।आवेदन% APPDATA% में नहीं लिख सकते हैं (लेकिन उपयोगकर्ता कर सकते हैं)

std::string appDataBase = getenv("APPDATA"); 
std::string appDir = appDataBase + "\\MyDir"; 

std::cerr << "About to invoke _mkdir(" << appDir << ")" << std::endl; 
int rv = _mkdir(appDir.c_str()); 
std::cerr << "_mkdir returned " << rv << ", errno = " << errno << std::endl; 

हालांकि, जब इस कोड को चलाता है, _mkdir कॉल विफल रहता है और errnoEACCES पर सेट है:

About to invoke _mkdir(C:\Users\mdm\AppData\Roaming\MyDir) 
_mkdir returned -1, errno = 13 

मैं मान लिया है | यह एक है ऐसा करने के लिए यह निम्न के समान कोड का उपयोग करता है सरल अनुमतियाँ समस्या, इस तथ्य को छोड़कर कि (1) मैं किसी भी अनुमति की समस्या के बिना एक्सप्लोरर में मैन्युअल रूप से निर्देशिका बना सकता हूं, और (2) सटीक उसी कोड ठीक काम करता है अगर मैं इसे किसी प्रोजेक्ट में कॉपी करता हूं।

मैं इस मुद्दे के बारे में जानकारी के लिए व्यापक खोज किया है, लेकिन केवल इस तरह के उपयोगकर्ता पहुँच में सक्षम नहीं होने के रूप में सामान्य अनुमतियाँ समस्याओं की चर्चा लगता है/इस फ़ोल्डर एक्सप्लोरर का उपयोग कर में लिख सकते हैं। मेरे आवेदन में कोड काम करता है अगर मैं इसे प्रशासक के रूप में चलाता हूं, तो स्पष्ट रूप से इसकी अनुमतियों के साथ कुछ अजीब चल रहा है, लेकिन मुझे नहीं पता कि और क्या जांचना है। मैंने प्रोसेस एक्सप्लोरर के साथ निरीक्षण किया है और पुष्टि की है कि एप्लिकेशन मेरे उपयोगकर्ता खाते के साथ चल रहा है, जिसमें% APPDATA% निर्देशिका में पूर्ण लेखन अनुमतियां हैं, और मैंने यह सुनिश्चित किया है कि% APPDATA% पेड़ छुपा या केवल पढ़ने के लिए सेट नहीं है।

वहाँ "प्रभावी यूजर आईडी" या "प्रभावी अनुमतियाँ" एक विंडोज़ अनुप्रयोग पर सेट किया जा सकता है कि किसी तरह का है, जो निर्माण विन्यास या प्रक्रिया initialisation में कुछ पर निर्भर कर सकते है? क्या कोई अन्य कारक है जो एक विशिष्ट एप्लिकेशन को% APPDATA% में लिखने से रोक देगा जबकि अन्य उपयोगकर्ता प्रक्रियाएं कर सकती हैं?

अद्यतन

आगे की जांच से पता चलता है कि व्यवहार में अंतर कोड की सामग्री है, लेकिन फाइल सिस्टम में निष्पादन की स्थान से संबंधित नहीं है। मेरा आवेदन मेरे उपयोगकर्ता निर्देशिका में Development फ़ोल्डर के अंदर एक स्रोत पेड़ से बनाया जा रहा है, और _mkdir कॉल इस निर्देशिका के भीतर निष्पादन योग्य के लिए विफल रहता है; हालांकि, .exe फ़ाइल को एक नई निर्देशिका में कॉपी करना C:\Development इसे ठीक काम करने की अनुमति देता है (हालांकि मौजूदा Development निर्देशिका को स्थानांतरित नहीं करता है)। सरल परीक्षण कार्यक्रम Documents\Visual Studio\Projects के अंदर था, जो एक संतोषजनक स्थान भी प्रतीत होता है।

+0

"ठीक उसी कोड ठीक काम करता है अगर मैं अपने आप में एक परियोजना में कॉपी" - तो आप शायद कुछ आसपास के कोड में दिलचस्प कर रहे हैं। वास्तव में क्या अनुमान लगाया नहीं जा सकता है। – Mat

+0

@Mat: यह मेरा अनुमान भी होगा - दुर्भाग्यवश मेरे पास विंडोज़ पर थोड़ा सा अनुभव विकसित हो रहा है, इसलिए मुझे यकीन नहीं है कि आस-पास के कोड में क्या देखना है। –

+0

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

उत्तर

0

विंडोज सुरक्षा संदर्भों को बदलने के लिए कार्यों की एक अलग (और बड़े) सेट है। कुछ के लिए here देखें।

शायद कि कोड युक्त परियोजना सुरक्षा संदर्भों बदल रहा है? यदि प्रोग्राम सार्वजनिक-पहुंच सर्वर के रूप में चल रहा है, तो मैं उदाहरण के लिए ImpersonateAnonymousToken() पर कॉल करने की अपेक्षा करता।

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

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