2012-09-24 7 views
6

मुझे एक लाइब्रेरी मिली है जिसे मैं एकाधिक क्लिकऑन एप्लिकेशन में उपयोग करता हूं। इस लाइब्रेरी में एक त्रुटि की स्थिति में मैं विंडोज EventLog में त्रुटि लिखना चाहता हूं।क्लिकऑन एप्लिकेशन में EventLog का उपयोग

मुझे KB article पर कैसे मिला लेकिन ऐसा लगता है कि इसके लिए स्रोत की खोज करने के लिए व्यवस्थापक अनुमतियों की आवश्यकता है। विशेष रूप से Security ईवेंट लॉग खोजने की कोशिश करते समय यह चुटकुले करता है।

क्या इसके आसपास काम करने और क्लिकऑन एप्लिकेशन में ईवेंट लॉग को लिखने के लिए वैसे भी है? मैंने एक व्यक्ति को trying to write to a known source देखा, लेकिन ऐसा लगता है कि वे लगातार उपलब्ध स्रोत ढूंढने में सक्षम नहीं थे।

संपादित करें:

जवाब के आधार पर यहाँ मैं एक प्रोग्राम है जो अपने आवेदन है कि मैं घटना स्रोत है कि व्यवस्थापक विशेषाधिकार प्राप्त कर सकते हैं स्थापित करने के लिए पहली बार चलाने पर चला सकते हैं के साथ शामिल है बनाएँ। हालांकि स्रोत बनने के बाद ऐसा लगता है कि मैं अभी भी इसे लिख नहीं सकता हूं।

/// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     if (!EventLog.SourceExists("ATE")) 
     { 
      EventLog.CreateEventSource("ATE", "Application"); 
     } 
    } 

ठीक से एक स्रोत बनाता है (जो यानिक गोराऊ द्वारा प्रदान किए गए रजिस्ट्री संपादन के बराबर है)। जब मैं अपने गैर-उन्नत एप्लिकेशन में स्रोत को लिखता हूं तो मुझे एक नई त्रुटि मिलती है, लेकिन यह अभी भी काम नहीं करती है। नई त्रुटि है:

Cannot open log for source 'ATE'. You may not have write access.

संपादित करें 2:

मैं अब यह रजिस्ट्री CustomSD key पर संपादित करता है के माध्यम से काम करने के लिए प्राप्त करने की कोशिश कर रहा हूँ। मैंने प्रमाणीकृत उपयोगकर्ताओं को पूर्ण पहुंच देने के लिए (ए ;; 0x7 ;; एयू) जोड़ने की कोशिश की लेकिन ऐसा कोई प्रभाव नहीं प्रतीत होता।

उत्तर

8

दुर्भाग्यवश, ईवेंट स्रोत को व्यवस्थापकीय निजीकरण की आवश्यकता होती है। हालांकि, आपको ईवेंट लॉग पर लिखने के लिए व्यवस्थापक अधिकारों की आवश्यकता नहीं है, या इससे पढ़ा गया है।

इसके आसपास दो तरीके हैं।

जब आप व्यवस्थापक के रूप में एप्लिकेशन इंस्टॉल करते हैं तो आप नया ईवेंट स्रोत जोड़ते हैं।

आप एक सरल ऐप बनाते हैं जिसे आप अपने एप्लिकेशन को कॉन्फ़िगर करने के लिए व्यवस्थापक के रूप में चलाते हैं। यह इंस्टॉलर में भी शामिल किया जा सकता है।

यदि आपके पास इंस्टॉलर नहीं है या नहीं, तो ऐप को कंप्यूटर पर व्यवस्थापक के रूप में लोड करें और प्रोग्राम को एक बार चलाएं। आपके ऐप स्टार्टअप को ईवेंट स्रोत को कॉन्फ़िगर करना चाहिए यदि यह पहले से मौजूद नहीं है, है ना? (ठीक है, यह तीन तरीकों से है।)

यह कोड स्निपेट माइक्रोसॉफ्ट से है: http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx और इसे व्यवस्थापक उपयोगकर्ता के रूप में चलाने के लिए डिज़ाइन किया गया है।

using System; 
using System.Diagnostics; 
using System.Threading; 

class MySample 
{ 
    public static void Main() 
    { 
     // Create the source, if it does not already exist. 
     if (!EventLog.SourceExists("MySource")) 
     { 
      //An event log source should not be created and immediately used. 
      //There is a latency time to enable the source, it should be created 
      //prior to executing the application that uses the source. 
      //Execute this sample a second time to use the new source. 
      EventLog.CreateEventSource("MySource", "MyNewLog"); 
      Console.WriteLine("CreatedEventSource"); 
      Console.WriteLine("Exiting, execute the application a second time to use the source."); 
      // The source is created. Exit the application to allow it to be registered. 
      return; 
     } 
     // Create an EventLog instance and assign its source. 
     EventLog myLog = new EventLog(); 
     myLog.Source = "MySource"; 

     // Write an informational entry to the event log.  
     myLog.WriteEntry("Writing to event log."); 
    } 
} 

मुझे पता है कि यह ठीक नहीं हो सकता है कि आप क्या कर रहे थे, लेकिन मुझे लगता है कि ऐसा करने का यह एकमात्र तरीका है।

संपादित करें 1: जोड़ा गया कुछ और कोड

public class EventLogger 
{ 
    private const string logName = "Application"; 
    private static string appName = ""; 
    private static bool sourceExists = false; 

    public static string AppName 
    { 
     get { return appName; } 
     set { appName = value; } 
    } 

    public static void Init(string appName) 
    { 
     AppName = appName; 
     sourceExists = EventLog.SourceExists(AppName); 

     if (!sourceExists) 
     { 
      EventLog.CreateEventSource(AppName, logName); 
      sourceExists = true; 
     } 
    } 

    private static void Write(string entry, EventLogEntryType logType, int eventID) 
    { 
     if (sourceExists) 
     { 
      EventLog.WriteEntry(AppName, entry, logType, eventID); 
     } 
    } 

    public static void Warning(string entry) { Write(entry, EventLogEntryType.Warning, 200); } 
    public static void Warning(string entry, int eventID) { Write(entry, EventLogEntryType.Warning, eventID); } 
    public static void Error(string entry) { Write(entry, EventLogEntryType.Error, 300); } 
    public static void Error(string entry, int eventID) { Write(entry, EventLogEntryType.Error, eventID); } 
    public static void Info(string entry) { Write(entry, EventLogEntryType.Information, 100); } 
    public static void Info(string entry, int eventID) { Write(entry, EventLogEntryType.Information, eventID); } 
} 

इस तरह है कि मैं अपने EventLogger वर्ग है जो एक उत्पादन आवेदन में उपयोग में है को लागू किया है है।

यदि आप अपना कोड पोस्ट कर सकते हैं तो हम तुलना कर सकते हैं।

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

संपादित करें 2: शून्य

के एक उपयोगकर्ता टोकन मूल्य के साथ प्रतिरूपित उपयोगकर्ता यह एक विकेटकीपर का एक सा है।

घटना कोड लिखने के चारों ओर लिपटे इस कोड को आज़माएं।

System.Security.Principal.WindowsImpersonationContext wic = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero); 
// your code to write to event log or any to do something which needs elevated permission-- 
wic.Undo(); 

मैं इस प्रयास नहीं किया है, बस क्योंकि मेरी कूट चल रहा है, इसे यहाँ से आता है: http://sharenotes.wordpress.com/2008/03/18/cannot-open-log-for-source-you-may-not-have-write-access/

+0

मुझे लगता है कि एक ऐप लोड करने और इसे चलाने का आपका तीसरा विचार क्लिकऑन के पूरे उद्देश्य के रूप में मेरा समाधान होना होगा जो इसे तैनाती और स्थापना को संभालता है। हालांकि अगर मैं इस तरह के एप्लिकेशन में इवेंट स्रोत बनाता हूं तो मुझे लिखने के लिए एक त्रुटि मिलती है। यह कहता है "स्रोत 'MySource' के लिए लॉग नहीं खोल सकता है। आपके पास लेखन पहुंच नहीं हो सकती है।" ऐसा लगता है कि मैं करीब आ रहा हूं, लेकिन यह काफी नहीं है। – Fr33dan

+0

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

+0

हां, फिलहाल मैंने सेटअप एप्लिकेशन को मैन्युअल रूप से चलाने के लिए चलाया कि यह काम करेगा या नहीं, इसलिए सोर्स सृजन के बीच 20+ सेकंड और इसे लिखने का प्रयास किया गया था। – Fr33dan

0

ClickOnce documentation में, यह कहा जाता है कि उपयोगकर्ता एक ClickOnce आवेदन चल रहा है, तो कोई व्यवस्थापक नहीं है , एप्लिकेशन इवेंट लॉग में लेखन विफल हो जाएगा।

पूर्ण बोली:

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

मैन्युअल घटना स्रोत बनाने के लिए, आप अपने तैनाती की प्रक्रिया के दौरान इस तरह रजिस्ट्री में एक प्रविष्टि जोड़ना होगा:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\YourApp] 
"EventMessageFile"="%SystemRoot%\\Microsoft.NET\\Framework\\v2.0.50727\\EventLogMessages.dll" 

यह दृष्टिकोण तैनाती चरण में ऊंचाई जरूरत सीमित कर देगा।

+0

चूंकि क्लिकऑन परिनियोजन और स्थापना को संभालता है, इसलिए मुझे इसे व्यवस्थापक के रूप में चलाने के लिए एक और तरीका पता लगाना होगा। मैंने व्यवस्थापक के रूप में कोड चलाने के लिए एक पैक किया गया निष्पादन योग्य बनाया है। आपका रजिस्ट्री संपादन इवेंट स्रोत बनाता है, लेकिन मुझे अभी भी त्रुटि मिलती है "स्रोत के लिए लॉग खोल नहीं सकता 'MySource'। आपके पास लेखन पहुंच नहीं हो सकती है।" जब मैं कोशिश करता हूं और लिखता हूं। – Fr33dan

2

क्लिकऑन setup.exe फ़ाइल डाउनलोड करने के लिए इसका एक वैकल्पिक दृष्टिकोण है, राइट क्लिक करें और व्यवस्थापक के रूप में चलाएं। बहुत संतोषजनक नहीं है लेकिन काम करता है।

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