2008-12-18 3 views
8

के भीतर से app.config तक नहीं पहुंच सकता है। मैं ऐप.कॉन्फिग में अपने विंडोज़ सेवा 'लॉगऑन के रूप में' उपयोगकर्ता की उपयोगकर्ता नाम/पासवर्ड जानकारी स्टोर करना चाहता हूं।विंडोज सेवा, मेरे इंस्टॉलर के कन्स्ट्रक्टर

तो मेरे इंस्टॉलर में, मैं app.config से उपयोगकर्ता नाम/पासवर्ड पकड़ने की कोशिश कर रहा हूं और संपत्ति सेट कर रहा हूं लेकिन सेवा स्थापित करने का प्रयास करते समय मुझे एक त्रुटि मिल रही है।

अगर मैं मुश्किल कोड नाम/पासवर्ड यह ठीक काम करता है, और विफल रहता है, जब मैं कोशिश करते हैं और app.config

public class Blah : Installer 
{ 

    public Blah() 
    { 

     ServiceProcessInstaller oServiceProcessInstaller = new ServiceProcessInstaller(); 
       ServiceInstaller oServiceInstaller = new ServiceInstaller();    

       oServiceProcessInstaller.Account = ServiceAccount.User; 

     oServiceProcessInstaller.Username =    ConfigurationManager.AppSettings["ServiceProcessUsername"].ToString(); 

    } 
} 

उत्तर

6

समस्या का उपयोग यह है कि जब अपने संस्थापक रन, आप स्थापना चरण में अभी भी कर रहे हैं और आपका आवेदन पूरी तरह से स्थापित नहीं किया गया है। ऐप.कॉन्फिग केवल तभी उपलब्ध होगा जब वास्तविक एप्लिकेशन चलाया जाए।

लेकिन आप निम्न कर सकते हैं:

  1. शीघ्र यूज़रनेम और पासवर्ड संस्थापक के भीतर के लिए उपयोगकर्ता (या कमांड लाइन पर)।
  2. अपने संस्थापक वर्ग के लिए इस जानकारी दर्रा (यह गूगल)
  3. अपने संस्थापक वर्ग के भीतर, एक चर है कि आप स्थापना पथ
  4. बताता संस्थापक में उपयुक्त घटना के भीतर है, को खोलने के लिए System.IO कार्यों का उपयोग app.config फ़ाइल और उपयोगकर्ता दर्ज की गई जानकारी
0

आपको वास्तव में एक app.config फ़ाइल में कोई पासवर्ड स्टोर नहीं करना चाहिए, यह बहुत बुरा है। आपको या तो सेवा खाते, वर्तमान उपयोगकर्ता या उन्हें संकेत देने की आवश्यकता है। इसके अलावा कोई उपयोगकर्ता एक .exe (जो संभवतः आपके इंस्टॉल को ट्रिगर कर रहा है) पर क्लिक कर सकता है और स्थापना से पहले अपने क्रेडेंशियल्स को बदलने के लिए "के रूप में चलाएं" का चयन करें (जिस स्थिति में वर्तमान उपयोगकर्ता एक अच्छा चयन होगा)।

अतिरिक्त रूप से सेवा प्रबंधक में कोई उपयोगकर्ता यह बदल सकता है कि इंस्टॉलेशन समाप्त हो जाने के बाद सेवा किस उपयोगकर्ता को चलाना चाहिए। लेकिन आप निश्चित रूप से सादे पाठ फ़ाइलों में पासवर्ड स्टोर नहीं करना चाहते हैं।

13

इंस्टॉलर के अंदर कॉन्फ़िगरेशन फ़ाइलों तक पहुंचने पर बस कुछ विचार। अंदर इंस्टालर वर्ग कार्यान्वयन के साथ:

this.Context.Parameters["assemblypath"].ToString(); 

या कभी कभी प्रतिबिंब के साथ:

Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyPath); 
ConnectionStringsSection csSection = config.ConnectionStrings; 

विधानसभा पथ के कई तरीके हो गया जा सकता है

Assembly service = Assembly.GetAssembly(typeof(MyInstaller)); 
string assemblyPath = service.Location; 
2

मैं एक सेवा संस्थापक के साथ एक ही समस्या थी । आपको अपनी कॉन्फ़िगरेशन फ़ाइल "myService.exe.config" पर कॉल करना होगा और सही कॉन्फ़िगरेशन फ़ाइल देखने के लिए असेंबली पथ के साथ OpenExe कॉन्फ़िगरेशन विधि का उपयोग करना होगा (जैसा कि पहले इंस्टॉल में समझाया गया है, जब आपके इंस्टॉलर चलते हैं, आधार निर्देशिका है InstallUtil की निर्देशिका और नहीं अपने संस्थापक)

{ 
Assembly __ServiceAssembly = Assembly.GetAssembly(typeof(MyServiceInstaller)); 
Configuration config = ConfigurationManager.OpenExeConfiguration(__ServiceAssembly.Location); 
KeyValueConfigurationCollection svcSettings = config.AppSettings.Settings; 
info("Service name : " + svcSettings["ServiceName"].Value); 
} 

आप "myService.exe.config" प्रारूप का पालन करें, एक exeConfigurationFileMap उपयोग करने के लिए नहीं करना चाहते हैं:

{ 
Assembly __ServiceAssembly = Assembly.GetAssembly(typeof(SyslogServiceInstaller)); 
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap(); 
configFileMap.ExeConfigFilename = 
    Path.Combine(Directory.GetParent(__ServiceAssembly.Location).ToString(), 
    "App.config"); 

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
    configFileMap, ConfigurationUserLevel.None); 
KeyValueConfigurationCollection mySettings = config.AppSettings.Settings; 

Console.Out.WriteLine(mySettings["ServiceName"].Value); 
} 
+0

मैं विन्यास उपयोग नहीं कर सकते या इंस्टॉलर क्लास के अंदर ConfigurationManager ... क्या मुझे कुछ संदर्भ जोड़ना है? – Aditi

+0

इसे बहुत समय पहले लिखा था। यहां मेरी उपयोग सूची है: 'सिस्टम का उपयोग करना; System.Collections का उपयोग कर ; System.Collections.Generic का उपयोग कर ; System.ComponentModel का उपयोग कर ; System.Configuration.Install का उपयोग कर ; System.Linq का उपयोग कर ; सिस्टम का उपयोग कर ; कॉन्फ़िगरेशन; System.ServiceProcess का उपयोग कर ; System.Reflection का उपयोग कर ; System.IO का उपयोग कर ; ' – BenC