2010-10-31 23 views
5

नामक डब्ल्यूसीएफ की अखंडता को कम करने के लिए मेरे पास एक इंटरनेट एक्सप्लोरर ऐड-इन है, जो सी # में लिखा गया है, जो एक डब्लूसीएफ नामित पाइप के माध्यम से एक .NET डेस्कटॉप एप्लिकेशन पर बात करता है। डेस्कटॉप ऐप NetNamedPipeBinding के लिए ServiceHost बनाता है, और आईई ऐड-इन का प्रत्येक उदाहरण ऐप से बात करने के लिए एक चैनल फैक्टरी बनाता है। सब कुछ विंडोज एक्सपी के तहत ठीक काम करता है, लेकिन विंडोज 7 में आईई के संरक्षित मोड के तहत एक अपवाद फेंक दिया गया है।पाइप

सिस्टम। सर्विसमोडेल। कॉम्यूनिकेशन अपवाद: एंडपॉइंट 'net.pipe: //localhost/MyApp.MyID' से कनेक्ट नहीं हो सकता है। ---> System.IO.PipeException: एक पाइप एंडपॉइंट '\। \ पाइप ... guid ...' के लिए मौजूद है, लेकिन कनेक्ट विफल रहा: एक्सेस अस्वीकार कर दी गई है। (5, 0x5)

संरक्षित मोड के तहत ऐड-इन चलाना एक परिदृश्य है जिसे मुझे समर्थन देना चाहिए। मेरी समझ यह है कि अगर मैं नामित पाइप के अखंडता स्तर को कम करता हूं, तो मेरे आईई ऐड-इन को इसके माध्यम से बात करने की अनुमति होगी। मेरा सवाल यह है कि यह कैसे करें। मेरे पास डब्ल्यूसीएफ का उपयोग करने के लिए चीजें हैं, और अधिमानतः इसे इस तरह रखना पसंद करेंगे। क्या मैं डब्ल्यूसीएफ को कम अखंडता स्तर के साथ नामित पाइप बना सकता हूं? ऐसा करने के लिए मैं कौन सा कोड लिखूं?

उत्तर

7

मुझे नहीं लगता कि यह संभव होने जा रहा है।

समस्या यह है कि नामित पाइप बनाया गया है जब सुरक्षा डिस्क्रिप्टर में अखंडता लेबल निर्दिष्ट किया जाना चाहिए। मानक NetNamedPipeBinding में, CreateNamedPipe पर कॉल करने के लिए आंतरिक WCF वर्ग System.ServiceModel.Channels.PipeConnectionListener की निजी CreatePipe() विधि के अंदर होता है। मैं पाइप के लिए प्रारंभिक सुरक्षा वर्णनकर्ता को निर्दिष्ट करने के तरीके को बदलने का तरीका नहीं देख सकता।

this question and answer देखें जो हमें प्राप्त करने की आवश्यकता है।

स्क्रैच से एक कस्टम नामित पाइप परिवहन बाध्यकारी तत्व लिखना इस दौर को पाने के लिए वर्तमान में एकमात्र तरीका लगता है, जिससे विफल होने के लिए हमें डब्ल्यूसीएफ के भविष्य के संस्करण में कुछ सक्षम सुविधाओं को जोड़ने के लिए माइक्रोसॉफ्ट के लिए इंतजार करना होगा। यदि आपके पास माइक्रोसॉफ्ट कनेक्ट तक पहुंच है, तो आप add your voice to the others requesting this feature कर सकते हैं।

संपादित करें: मैं बहुत निराशावादी था। अब मुझे ऐसा करने का एक तरीका मिला है।

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

पहला पाइप हैंडल पकड़ना एक मामूली उपक्रम नहीं है। डब्ल्यूसीएफ पाइप कनेक्शन श्रोता द्वारा बनाए गए सूची में संग्रहीत System.ServiceModel.Channels.PipeConnectionListener.PendingAccept प्रकार के उदाहरण में इसे गिलहरी करता है। कनेक्शन श्रोता चैनल श्रोता के समान नहीं है (जिसे बाध्यकारी तत्व की BuildChannelListener<> विधि को ओवरराइड करके सीधे पकड़ लिया जा सकता है), और इसे प्राप्त करना बहुत कठिन है। इसमें एंडपॉइंट के लिए ट्रांसपोर्ट मैनेजर का पता लगाने के लिए प्रतिबिंब का उपयोग करके वीरता शामिल है, जिसमें एंडपॉइंट के कनेक्शन श्रोता का संदर्भ होता है, और फिर कनेक्शन श्रोताओं की एक श्रृंखला (जो ट्रेसिंग इत्यादि के कॉन्फ़िगरेशन के अनुसार भिन्न होता है) तक काम करता है जब तक कि पाइप कनेक्शन श्रोता नहीं मिल जाता । यदि हम भाग्यशाली हैं तो पहले पाइप हैंडल श्रोता की लंबित स्वीकृति सूची में पाया जा सकता है (हालांकि यहां एक रेस हालत है - यदि कोई ग्राहक हैंडल पकड़ने से पहले कनेक्ट होता है, तो यह हमेशा के लिए चला जाएगा)।

एक बार हैंडल उपलब्ध हो जाने के बाद, अखंडता लेबल को जोड़ने के लिए कम अखंडता क्लाइंट को संचार करने की अनुमति देने के लिए अखंडता को कम करना, अखंडता लेबल जोड़ने के लिए हैंडल पर SetSecurityInfo को कॉल करने का मामला है।

मैं इसे कवर करने की योजना बना रहा हूं, यह जल्द ही my blog पर कुछ विस्तार है।