2009-10-22 13 views
9

मेरे पास एक लाइब्रेरी है जिसे मैंने कुछ व्यावसायिक तर्क के साथ बनाया है जिसमें System.Diagnostics.EventLog उदाहरण के लिए लेखन शामिल है। लाइब्रेरी को आमतौर पर विंडोज सर्विस एप्लिकेशन से बुलाया जाता है, लेकिन अब मैं अपने एएसपी.नेट एमवीसी एप्लिकेशन से वही लाइब्रेरी फ़ंक्शंस कॉल करने का प्रयास कर रहा हूं।एएसपी.नेट एमवीसी अनुप्रयोग से इवेंटलॉग पर लिखते समय सुरक्षा अपवाद

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

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp") 

निम्न त्रुटि उत्पन्न होती है जब पुस्तकालय विधि के भीतर कोड लॉग में लिखने के लिए कोशिश करता है:

[SecurityException: Requested registry access is not allowed.] 
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51 
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217 
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366 
System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14 

मेरे वेब अनुप्रयोग विंडोज सर्वर पर नेटवर्क सेवा उपयोगकर्ता के रूप में चल रहा है 2003 चल रहा है IIS 6 क्या नेटवर्क सेवा उपयोगकर्ता को रजिस्ट्री में पहुंच देने के लिए मुझे कुछ करने की ज़रूरत है?

क्या एएसपी.नेट एमवीसी अनुप्रयोग में उपयोग के लिए इवेंटलॉग उदाहरण बनाने का कोई बेहतर तरीका है? क्या पहले से ही ढांचे द्वारा बनाया गया है जिसे मुझे संदर्भित करने की आवश्यकता है?

उत्तर

19

MSDN से: "अनुप्रयोग जो नेटवर्क सेवा पहचान का उपयोग करके चलाए घटना को लिख सकते हैं लोग इनमौजूदा घटना सूत्रों का उपयोग करके, पर वे अपर्याप्त रजिस्ट्री अनुमतियों की नई घटना सूत्रों नहीं बना सकते।"

और ...

"तो इवेंटलॉग उदाहरण के साथ जुड़े ईवेंट लॉग के लिए स्रोतमौजूद नहीं है, एक नई घटना स्रोत बन जाता है।"

तो अपने घटना की तरह दिखता है लॉग स्रोत मौजूद नहीं है, और यह नेटवर्क सेवा उपयोगकर्ता का उपयोग कर एक नया इवेंट लॉग स्रोत बनाने की कोशिश कर रहा है (जिसके लिए रजिस्ट्री को लिखना आवश्यक है, इसलिए काम न करें)।

"एक घटना स्रोत है कि पहले से ही मौजूद नहीं है का उपयोग कर ईवेंट लॉग में लिखने के लिए अपने ASP.NET अनुप्रयोग को सक्षम करने के लिए दो विकल्प हैं:"

  • समय आवेदन पर नई घटना स्रोत बनाएं स्थापित
  • रजिस्ट्री में मैन्युअल रूप से नया ईवेंट स्रोत प्रविष्टि बनाएं।

इसलिए, एप्लिकेशन के बाहर लॉग बनाने की आवश्यकता है (आप इसे इस उपयोगकर्ता के साथ प्रोग्रामिक रूप से नहीं कर सकते हैं। इसे मैन्युअल रूप से करें या इंस्टॉलेशन को सरल बनाने के लिए एक सरल कमांड लाइन ऐप बनाएं)।

पूरी जानकारी के लिए:

http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

व्यक्तिगत तौर पर मैं सलाह देते हैं कि आप नेट उपयोगकर्ता अनुमतियों को परिवर्तित न करें, बल्कि वेब एप्लिकेशन से बाहर लॉग स्रोत पैदा करते हैं। मेरी वरीयता एक कंसोल ऐप में है (जो आपको लिखने के लिए लगभग 5 मिनट ले जाएगी, और जिसे आप अन्य मशीनों को प्रीपे करने के लिए भी उपयोग कर सकते हैं)। VS.NET में एक नया कंसोल ऐप प्रारंभ करें, और लॉग स्रोत बनाने के लिए कोड जोड़ें।एक उदाहरण:

http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

तो बस cmd लाइन, जब उपयुक्त अनुमतियों वाले में लॉग इन से सांत्वना अनुप्रयोग चलाने के।

5

यदि आप सुनिश्चित नहीं हैं कि यह कौन सा ईवेंट स्रोत बनाने का प्रयास कर रहा है, तो उपरोक्त स्वीकृत उत्तर को समझना मुश्किल होगा।

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

0

मुझे नहीं पता कि आप एप्लिकेशन लॉग पर लिखने के बजाय अपना खुद का EventLog क्यों नहीं बना सकते हैं।

आप निम्न कोड के साथ एक विंडो/कंसोल एप्लिकेशन बना सकते हैं और इसे व्यवस्थापक के रूप में चला सकते हैं, यह आपके लिए एक नया लॉग बनाएगा।

if (!EventLog.Exists("LOG_NAME")) 
    EventLog.CreateEventSource("LOG_NAME", "LOG_NAME"); 

यह इवेंट लॉग के अंदर एक नया लॉग बनाएगा और एप्लिकेशन और सेवा लॉग में दिखाई देगा।

if (!EventLog.SourceExists("MyMVCApp")) 
    EventLog.CreateEventSource("MyMVCApp", "LOG_NAME"); 

यह कस्टम "LOG_NAME" के भीतर एक नया स्रोत पैदा करेगा और आप एक कस्टम लॉग बनाने के लिए कोड

Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp") 

का उपयोग कर सकते।

+0

यह देखें कि लॉग को अनुमति कैसे असाइन करें: http://stackoverflow.com/questions/1823433/eventlog-permission-failing-in-asp-net-on-win7/35086503#35086503 –

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