我创建了一个事件日志创建器,它在本地工作得很好。当尝试远程创建事件日志时,它给了我这样的信息:
如果事件源自另一台计算机,则显示信息 不得不与事件一起得救。
并将其添加到事件日志中。 我当前的方法涉及在远程服务器上进行注册表更改。我在网上读到你可以使用网络服务远程执行事件日志?我完全迷失了创建一个Web服务,因为我之前从未创建过,有人能指出我正确的方向。我也试图避免在远程服务器上进行注册表更改,因为它们位于生产环境中。
我目前的代码:
else if (RemoteText.Text != "")
{
int EventID = Convert.ToInt32(EventIdText.Text);
string myLogName = "";
if (!EventLog.SourceExists(SourceText.Text))
{
//Create source.
EventLog.CreateEventSource(SourceText.Text, myLogName, RemoteText.Text);
Console.WriteLine("Creating EventSource");
}
else
{
// Get the EventLog associated if the source exists.
myLogName = EventLog.LogNameFromSourceName(SourceText.Text, RemoteText.Text);
EventLog myEventLog1 = new EventLog(myLogName, RemoteText.Text);
myEventLog1.Source = myLogName;
// Write an entry into log.
myEventLog1.WriteEntry("This is for your information",
EventLogEntryType.Error, EventID);
}
MessageBox.Show("Event Creation was SUCCESSFUL");
我的目标是删除远程计算机上的通用邮件,避免在远程计算机上进行注册表更改。
答案 0 :(得分:0)
创建事件源确实需要HKLM\System\CurrentControlSet\eventlog
密钥上的写访问权限。
尝试EventSourceCreationData
,您可能错过了消息文件。
如果您在远程计算机上拥有管理员访问权限,并且所述服务器未关闭远程注册表,则可以使用WMI
更改注册表权限并再次尝试使用该方法。
答案 1 :(得分:0)
如果事件源自另一台计算机,则必须使用事件保存显示信息
如果事件源未定义,则会出现此错误。将事件日志条目写入事件日志时,基本上只会写入一个ID以及与事件日志条目关联的一些参数。然后,当您查看事件日志条目时,Windows将使用与事件源关联的消息文件来实际格式化条目。从ID中检索消息模板,并在消息模板中替换参数以创建可在事件查看器中查看的格式化消息。此方法可以为Windows的不同语言版本提供已翻译的事件日志消息。
如果事件源未定义,则Windows无法找到消息文件,当您尝试在事件查看器中查看事件日志条目时,您将收到所描述的错误。
因此,要正确地将事件日志条目记录到需要创建源的计算机上的源,这需要对注册表进行管理写入访问(可以使用提升的安装程序完成)。因此,您当前的方法似乎是正确的方法,而不是您应该避免的方法。
.NET开发人员通常没有使用事件日志消息文件的经验。 .NET中用于写入事件日志的基本API将注册并使用通用消息文件,该文件只是将您提供的任何字符串参数替换为格式化消息。这使得从.NET写入事件日志非常容易,但它也使它有点混乱,因为你没有意识到它需要一个中间消息文件。