दुर्भाग्यवश, ईवेंट स्रोत को व्यवस्थापकीय निजीकरण की आवश्यकता होती है। हालांकि, आपको ईवेंट लॉग पर लिखने के लिए व्यवस्थापक अधिकारों की आवश्यकता नहीं है, या इससे पढ़ा गया है।
इसके आसपास दो तरीके हैं।
जब आप व्यवस्थापक के रूप में एप्लिकेशन इंस्टॉल करते हैं तो आप नया ईवेंट स्रोत जोड़ते हैं।
आप एक सरल ऐप बनाते हैं जिसे आप अपने एप्लिकेशन को कॉन्फ़िगर करने के लिए व्यवस्थापक के रूप में चलाते हैं। यह इंस्टॉलर में भी शामिल किया जा सकता है।
यदि आपके पास इंस्टॉलर नहीं है या नहीं, तो ऐप को कंप्यूटर पर व्यवस्थापक के रूप में लोड करें और प्रोग्राम को एक बार चलाएं। आपके ऐप स्टार्टअप को ईवेंट स्रोत को कॉन्फ़िगर करना चाहिए यदि यह पहले से मौजूद नहीं है, है ना? (ठीक है, यह तीन तरीकों से है।)
यह कोड स्निपेट माइक्रोसॉफ्ट से है: 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/
मुझे लगता है कि एक ऐप लोड करने और इसे चलाने का आपका तीसरा विचार क्लिकऑन के पूरे उद्देश्य के रूप में मेरा समाधान होना होगा जो इसे तैनाती और स्थापना को संभालता है। हालांकि अगर मैं इस तरह के एप्लिकेशन में इवेंट स्रोत बनाता हूं तो मुझे लिखने के लिए एक त्रुटि मिलती है। यह कहता है "स्रोत 'MySource' के लिए लॉग नहीं खोल सकता है। आपके पास लेखन पहुंच नहीं हो सकती है।" ऐसा लगता है कि मैं करीब आ रहा हूं, लेकिन यह काफी नहीं है। – Fr33dan
क्या आप लिखने का प्रयास करने से पहले आवेदन से बाहर निकले थे? एमएस से उस कोड स्निपेट में वे स्पष्ट रूप से बताते हैं कि लॉग स्रोत को नव निर्मित नहीं किया जाना चाहिए और तत्काल उपयोग किया जाना चाहिए क्योंकि स्रोत को सक्षम करने के लिए आवश्यक विलंब अवधि है। –
हां, फिलहाल मैंने सेटअप एप्लिकेशन को मैन्युअल रूप से चलाने के लिए चलाया कि यह काम करेगा या नहीं, इसलिए सोर्स सृजन के बीच 20+ सेकंड और इसे लिखने का प्रयास किया गया था। – Fr33dan