मेरे पास Win32 अनुप्रयोगों का एक सेट है जो CreateFileMapping()
और MapViewOfFile()
के साथ बनाए गए साझा मेमोरी सेगमेंट का उपयोग करके जानकारी साझा करता है। अनुप्रयोगों में से एक एक सिस्टम सेवा है; शेष लॉग इन उपयोगकर्ता द्वारा शुरू किया जाता है। विंडोज एक्सपी पर, कोई समस्या नहीं थी। हमने अपने सेगमेंट "ग्लोबल \ समथिंग" नाम दिया और सब ठीक थे।सेवाओं और उपयोगकर्ता प्रक्रियाओं के बीच मेमोरी साझा करने के लिए कैसे?
Vista में अतिरिक्त सुरक्षा (और माना जाता है कि विंडोज 7) इस आर्किटेक्चर को काम करने से रोकने के लिए प्रतीत होता है। सामान्य उपयोगकर्ताओं को वैश्विक नामस्थान में (Win32 त्रुटि 5) ऑब्जेक्ट्स बनाने की अनुमति नहीं है। एमएसडीएन इंगित करता है कि यदि खाते में "वैश्विक बनाएं" विशेषाधिकार है तो सभी को अच्छी तरह से होना चाहिए, लेकिन यह अभ्यास में मामला प्रतीत नहीं होता है। इसके अलावा, Vista की "अखंडता" विशेषताएं "कम अखंडता" उपयोगकर्ता प्रक्रियाओं को "उच्च अखंडता" सेवा-निर्मित साझा मेमोरी ऑब्जेक्ट तक पहुंचने से रोकने के लिए दिखाई देती हैं। ऐसा लगता है कि मुझे कुछ जादुई SetSecurityDescriptorSacl()
इंकेंटेशन के माध्यम से इसे ठीक करने में सक्षम होना चाहिए, लेकिन मुझे sacl बोलने में कठिनाई हो रही है।
तो सवाल यह है: सेवाओं और सामान्य उपयोगकर्ता प्रक्रियाओं के बीच साझा मेमोरी सेगमेंट का उपयोग करने का सही तरीका क्या है?
"यूएसी बंद करें" के आसान उत्तर को मुक्त करने के लिए, हम काफी लॉक डाउन वातावरण में हैं और यह संभावना नहीं है।
संपादित करें: सेवा और उपयोगकर्ता प्रक्रिया दोनों को सेगमेंट तक पहुंच पढ़ने/लिखने की आवश्यकता है।
दुर्भाग्य से, सामान्य उपयोगकर्ताओं को भी लेखन पहुंच – Clay
अद्यतन उत्तर होना चाहिए। आपको बस सुरक्षा डिस्क्रिप्टर को ट्विक करने की आवश्यकता है। – Michael
अच्छा जवाब - हम एक अजीब सुरक्षा स्थिति में हैं। अंतिम उपयोगकर्ताओं को सिस्टम के साथ बातचीत करने के लिए भरोसा किया जाता है (इस प्रकार वे सेवा के स्वामित्व वाली स्मृति को संशोधित कर सकते हैं) लेकिन हमें उनकी पहुंच सीमित करने की आवश्यकता है (यूएसी चालू होना चाहिए)। सरकारी नेटवर्क दुनिया की पागलपन में आपका स्वागत है। – Clay