मुझे नहीं लगता कि यह संभव होने जा रहा है।
समस्या यह है कि नामित पाइप बनाया गया है जब सुरक्षा डिस्क्रिप्टर में अखंडता लेबल निर्दिष्ट किया जाना चाहिए। मानक NetNamedPipeBinding में, CreateNamedPipe
पर कॉल करने के लिए आंतरिक WCF वर्ग System.ServiceModel.Channels.PipeConnectionListener
की निजी CreatePipe()
विधि के अंदर होता है। मैं पाइप के लिए प्रारंभिक सुरक्षा वर्णनकर्ता को निर्दिष्ट करने के तरीके को बदलने का तरीका नहीं देख सकता।
this question and answer देखें जो हमें प्राप्त करने की आवश्यकता है।
स्क्रैच से एक कस्टम नामित पाइप परिवहन बाध्यकारी तत्व लिखना इस दौर को पाने के लिए वर्तमान में एकमात्र तरीका लगता है, जिससे विफल होने के लिए हमें डब्ल्यूसीएफ के भविष्य के संस्करण में कुछ सक्षम सुविधाओं को जोड़ने के लिए माइक्रोसॉफ्ट के लिए इंतजार करना होगा। यदि आपके पास माइक्रोसॉफ्ट कनेक्ट तक पहुंच है, तो आप add your voice to the others requesting this feature कर सकते हैं।
संपादित करें: मैं बहुत निराशावादी था। अब मुझे ऐसा करने का एक तरीका मिला है।
कुंजी यह थी कि यह पता चला कि आपको पाइप बनाया जाने पर सुरक्षा डिस्क्रिप्टर में अखंडता लेबल निर्दिष्ट करने की आवश्यकता नहीं है - लेकिन श्रोता के बाद CreateNamedPipe से लौटाए गए हैंडल का उपयोग करके आपको एसएसीएल को संशोधित करना होगा खोला - यानी पाइप के लिए पहला सर्वर-साइड हैंडल। किसी भी अन्य हैंडल का उपयोग करके, अखंडता लेबल जोड़ने का प्रयास हमेशा विफल रहता है, क्योंकि dwOpenMode
CreateNamedPipe
पर ध्वज पैरामीटर FILE_FLAG_FIRST_PIPE_INSTANCE
और WRITE_OWNER
दोनों के लिए बिट्स का उपयोग ओवरलोड करता है। अखंडता लेबल जोड़ने के लिए हमें बाद की पहुंच अनुमति की आवश्यकता है, लेकिन पूर्व की उपस्थिति कॉल को किसी भी पाइप उदाहरण पर विफल होने का कारण बनती है।
पहला पाइप हैंडल पकड़ना एक मामूली उपक्रम नहीं है। डब्ल्यूसीएफ पाइप कनेक्शन श्रोता द्वारा बनाए गए सूची में संग्रहीत System.ServiceModel.Channels.PipeConnectionListener.PendingAccept
प्रकार के उदाहरण में इसे गिलहरी करता है। कनेक्शन श्रोता चैनल श्रोता के समान नहीं है (जिसे बाध्यकारी तत्व की BuildChannelListener<>
विधि को ओवरराइड करके सीधे पकड़ लिया जा सकता है), और इसे प्राप्त करना बहुत कठिन है। इसमें एंडपॉइंट के लिए ट्रांसपोर्ट मैनेजर का पता लगाने के लिए प्रतिबिंब का उपयोग करके वीरता शामिल है, जिसमें एंडपॉइंट के कनेक्शन श्रोता का संदर्भ होता है, और फिर कनेक्शन श्रोताओं की एक श्रृंखला (जो ट्रेसिंग इत्यादि के कॉन्फ़िगरेशन के अनुसार भिन्न होता है) तक काम करता है जब तक कि पाइप कनेक्शन श्रोता नहीं मिल जाता । यदि हम भाग्यशाली हैं तो पहले पाइप हैंडल श्रोता की लंबित स्वीकृति सूची में पाया जा सकता है (हालांकि यहां एक रेस हालत है - यदि कोई ग्राहक हैंडल पकड़ने से पहले कनेक्ट होता है, तो यह हमेशा के लिए चला जाएगा)।
एक बार हैंडल उपलब्ध हो जाने के बाद, अखंडता लेबल को जोड़ने के लिए कम अखंडता क्लाइंट को संचार करने की अनुमति देने के लिए अखंडता को कम करना, अखंडता लेबल जोड़ने के लिए हैंडल पर SetSecurityInfo
को कॉल करने का मामला है।
मैं इसे कवर करने की योजना बना रहा हूं, यह जल्द ही my blog पर कुछ विस्तार है।
स्रोत
2010-12-21 12:38:02