消息资源存在但在字符串/消息表中找不到该消息

时间:2011-05-18 21:33:11

标签: .net events

在系统事件日志下有一个名为“Service Control Manager”的事件提供程序。它的EventMessageFile是%SystemRoot%\system32\services.exe。它包含一个id = 7036的事件,该事件是“%1服务进入%2状态”。您可以通过在services.msc中停止或运行任何服务来非常简单地生成它。

我想要的就是自己将该事件写入系统事件日志。

这是我的简单日志代码:

 public static void Main()
 {      
     EventLog myNewLog = new EventLog("System", ".", "Service Control Manager");

     myNewLog.WriteEntry("Test",EventLogEntryType.Information, 7036);
 }

我使用“以管理员身份运行”运行应用程序。事件被写入系统日志,具有正确的事件ID,源等。但描述是“消息资源存在但消息未在字符串/消息表中找到”,其中包含“测试服务进入%2状态”

我的错误是什么?

1 个答案:

答案 0 :(得分:1)

错误在于您无法通过WriteEntry实现这一目标,因为您需要提供多个参数以及正确的EventIdentifier

如果切换到WriteEvent,您可以实现目标:

 var myNewLog = new EventLog("System", ".", "Service Control Manager");

 myNewLog.WriteEvent( new EventInstance( (1 << 30) + 7036 ,0)
                    , null
                    , new object[] { "foobar","running" }
                    );

请注意,Eventinstance提供了一个EventIdentifier,它最低的16位是您找到的7036但是位30(客户位)需要为1表示我们有客户代码。

以管理员身份运行此代码会在事件日志中显示:

  

foobar服务进入运行状态。

使用此xml:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
  <Provider Name="Service Control Manager" Guid="{some-guid-here}" EventSourceName="Service Control Manager" /> 
  <EventID Qualifiers="16384">7036</EventID> 
  <Version>0</Version> 
  <Level>4</Level> 
  <Task>0</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x80000000000000</Keywords> 
  <TimeCreated SystemTime="2014-01-13T00:13:56.000000000Z" /> 
  <EventRecordID>999999</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="0" ThreadID="0" /> 
  <Channel>System</Channel> 
  <Computer>internal.example.com</Computer> 
  <Security /> 
</System>
<EventData>
  <Data Name="param1">foobar</Data> 
  <Data Name="param2">running</Data> 
  <Binary /> 
</EventData>
</Event>