2011-01-28 18 views
11

मैं Microsoft .Net Framework के माध्यम से काम कर रहा हूँ के कारण AppDomain.CreateDomain (स्ट्रिंग, सबूत) के लिए वैकल्पिक की तलाश - अनुप्रयोग विकास फाउंडेशन प्रशिक्षण किट पुस्तक अध्याय 8 पाठ 2: कॉन्फ़िगर आवेदन डोमेनअप्रचलित कैस नीति

ShowWinIni किया जा रहा है कार्यक्रम मैं

object[] hostEvidence = { new Zone(SecurityZone.MyComputer) }; 
Evidence e = new Evidence(hostEvidence, null); 

// Create an AppDomain. 
AppDomain d = AppDomain.CreateDomain("New Domain", e); 

// Run the assembly 
d.ExecuteAssemblyByName("ShowWinIni"); 

निष्पादित करने के लिए चाहते हैं के लिए विधानसभा नाम जब मैं निष्पादित करें:

AppDomain d = AppDomain.CreateDomain("New Domain", e); 

मैं निम्न संदेश मिलता है: "यह विधि पूरी तरह से सीएएस नीति का उपयोग करती है, जिसे .NET Framework द्वारा अप्रचलित कर दिया गया है। संगतता कारणों के लिए सीएएस नीति को सक्षम करने के लिए, कृपया NetFx40_LegacySecurityPolicy कॉन्फ़िगरेशन स्विच का उपयोग करें। अधिक जानकारी के लिए http://go.microsoft.com/fwlink/?LinkID=155570 देखते हैं। "

जब मैं एक साक्ष्य वस्तु के बिना एक AppDomain बनाने मैं विधानसभा ठीक निष्पादित कर सकते हैं।

बेशक

, मैं http://go.microsoft.com/fwlink/?LinkID=155570 आए थे, लेकिन मैं अभी भी कैसे एक आवेदन पत्र बनाने के लिए करने के लिए के रूप में उलझन में हूँ निर्दिष्ट विशेषाधिकारों के साथ डोमेन।

अगले सबसे उपयोगी साइट मैंने पाया http://msdn.microsoft.com/en-us/library/bb763046.aspx था लेकिन मेरे StrongName वस्तु शून्य करने के लिए गणना करता है।

StrongName fullTrustAssembly = 
    typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>(); 

कार्यक्रम किया जा रहा है इस कोड को लागू करने वाले वर्ग का नाम।

आपकी सलाह और सुझावों के लिए अग्रिम धन्यवाद!

उत्तर

11

मुझे नेटफैक्स 40_LegacySecurityPolicy को सक्षम किए बिना मूल कोड उदाहरण काम करने का एक तरीका मिला।

EvidenceBase[] hostEvidence = { new Zone(SecurityZone.MyComputer) }; 
Evidence e = new Evidence(hostEvidence, null); 

AppDomain d = AppDomain.CreateDomain("New Domain", e); 

d.ExecuteAssemblyByName("ShowWinIni"); 

यदि आप इंटरनेट से SecurityZone बदल यह काम नहीं करेगा, यह पुराना हो कैस सुरक्षा एक NotSupportedException में जिसके परिणामस्वरूप नीति का उपयोग करने की कोशिश करेंगे। मैं जो चाहता हूं वह सुरक्षा अपवाद है ... जिसका अर्थ है कि मैं जिस असेंबली को निष्पादित करना चाहता हूं उसके पास अनुमतियों की आवश्यकता नहीं है।

प्रतिबंधित अनुमतियों वाले ऐपडोमेन में एक असेंबली निष्पादित करने के लिए, आपको सैंडबॉक्सिंग का उपयोग करने की आवश्यकता है। मैंने पाया सैंडबॉक्सिंग का सबसे अच्छा उदाहरण यहां है: http://www.simple-talk.com/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0---part-i/

मुझे लगता है कि पृष्ठ 4.0 में सीएएस में किए गए परिवर्तनों को भी बहुत अच्छी तरह से बताता है!

MSDN सहित कई स्रोतों, मुझे विश्वास है कि मैं एक StrongName सरणी प्रदान करने के लिए जब फोन करने की जरूरत थी:

AppDomain.CreateDomain(string friendlyName, 
         Evidence securityInfo, 
         AppDomainSetup info, 
         PermissionSet grantSet, 
         params StrongName[] fullTrustAssemblies); 

जैसा कि मेरे मूल पोस्ट में कहा गया है, मैं था (और अब भी कर रहा हूँ) मुसीबत एक StrongName वस्तु हो रही null के बजाय। बाहर निकलता है मुझे इसकी आवश्यकता भी नहीं थी!

यह सैंडबॉक्सिंग के लिए मेरे पूरा उदाहरण है:

Evidence ev = new Evidence(); 
ev.AddHostEvidence(new Zone(SecurityZone.Internet)); 
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev); 

AppDomainSetup adSetup = new AppDomainSetup(); 
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted); 

AppDomain newDomain = AppDomain.CreateDomain("Sandbox Domain", null, adSetup, internetPS); 

newDomain.ExecuteAssemblyByName(untrustedAssembly); 

pathToUntrusted = मेरी विधानसभा

untrustedAssembly लिए फ़ाइल पथ के एक स्ट्रिंग प्रतिनिधित्व विधानसभा नाम के एक स्ट्रिंग प्रतिनिधित्व =

7

सहकर्मियों से सहायता प्राप्त करने के बाद, मुझे यह काम मिल गया।

स्पष्ट रूप से पुस्तक का अभ्यास नेट के 3.5 ढांचे में उपयोग करने के लिए डिज़ाइन किया गया था, जबकि मैं 4.0 का उपयोग कर रहा हूं। 3.5 फ्रेमवर्क का उपयोग करने के लिए मेरी परियोजना और शोविनइनी प्रोजेक्ट गुणों को संशोधित करने के बाद, सबकुछ काम करता था ... लेकिन मैं अभी भी 4.0 फ्रेमवर्क के साथ यह काम करना चाहता था।

निम्न संदेश के समाधान के लिए:।। "यह पद्धति परोक्ष कैस नीति है, जो .NET फ्रेमवर्क द्वारा समाप्त कर दिया गया है का उपयोग करता है के क्रम संगतता कारणों के लिए कैस नीति को सक्षम करने के लिए, NetFx40_LegacySecurityPolicy विन्यास स्विच का उपयोग करें कृपया http://go.microsoft.com/fwlink/?LinkID=155570 के लिए देख अधिक जानकारी।"

मैं एक app.config फ़ाइल बनाया है और उसमें निम्नलिखित कहा:

<configuration> 
    <runtime> 
     <NetFx40_LegacySecurityPolicy enabled="true"/> 
    </runtime> 
</configuration> 

आप http://msdn.microsoft.com/en-us/library/dd409253.aspx

यह मेरा कार्यक्रम किसी अविश्वसनीय आवेदन करने से समाप्त हो गया पर NetFx40_LegacySecurityPolicy के बारे में अधिक पढ़ सकते हैं, एक सुरक्षा फेंक अपवाद जब मैंने डीबग करने की कोशिश की। मेरे एप्लिकेशन को दोबारा भरोसेमंद बनाने के लिए, मैंने क्लिकऑन सुरक्षा सेटिंग्स को सक्षम किया और मेरे प्रोजेक्ट की गुणों में "यह एक पूर्ण ट्रस्ट एप्लिकेशन" चिह्नित किया।

इस बिंदु पर, मैं अपने कार्यक्रम डिबग सकता है, लेकिन एक सुरक्षा अपवाद अब फेंक दिया जा रहा था जब मैं इस कथन निष्पादित:

d.ExecuteAssemblyByName("ShowWinIni"); 

यह बयान ठीक काम किया इससे पहले कि मैं एक साक्ष्य वस्तु को शामिल करने की कोशिश कर रहा है जब मैं बनाया शुरू कर दिया मेरा ऐपडोमेन ऑब्जेक्ट। वैसे यह पता चला है कि एक और तरीका है ... AppDomain।ExecuteAssemblyByName (स्ट्रिंग, सबूत), आप http://msdn.microsoft.com/en-us/library/5kd4z003.aspx पर पढ़ सकते हैं। तो मैंने उपरोक्त कोड स्निपेट को निम्नलिखित के साथ बदल दिया:

d.ExecuteAssemblyByName("ShowWinIni", e); 

'ई' मेरे मूल प्रश्न में मेरा साक्ष्य वस्तु बन गया।

अब मुझे नहीं लगता कि यह सबसे अच्छा समाधान है। आदर्श रूप से, मैं अपने प्रोग्राम को NetFx40_LegacySecurityPolicy का उपयोग करने के लिए मजबूर नहीं करूंगा और मेरा मानना ​​है कि असली दुनिया ऐप्स अप्रचलित तरीकों पर भरोसा नहीं करना चाहिए। मैंने सोचा कि यह समाधान पोस्टिंग के लायक था, क्या कोई भी मेरे जैसा ही किताब के माध्यम से काम कर रहा है।

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