如何在Windows服务中使用ManagementEventWatcher?

时间:2011-01-21 13:23:38

标签: c# .net

我正在尝试在C#.NET4 Windows服务应用程序中使用ManagementEventWatcher。在“OnStart”方法的某些时候,我有以下几行:

string scope = "\\root\\cimv2";
string query =
  "SELECT * FROM __InstanceCreationEvent " +
  "WITHIN 1 " +
  "WHERE TargetInstance ISA 'Win32_NTLogEvent' " +
  " AND ( " +
  "      targetInstance.EventCode = '4768' " + 
  "   OR targetInstance.EventCode = '4770' " + 
  "   OR targetInstance.EventCode = '672'" + 
  "   OR targetInstance.EventCode = '674'" + 
  " )";
eventListener = new ManagementEventWatcher(scope, query);
eventListener.EventArrived += new EventArrivedEventHandler(HandleEvent);


eventListener.Start();

eventListener.Start(); line给出了“拒绝访问”消息的异常。我尝试将我的服务设置为管理员或LOCALSYSTEM,但它没有帮助。

我也找到了这个文档:http://msdn.microsoft.com/en-us/library/aa392289(VS.85).aspx 但我无法弄清楚如何在C#中使用它。

如果放入WindowsForms应用程序,相同的代码将按预期工作。

感谢。

2 个答案:

答案 0 :(得分:0)

这里没有什么可以防止服务提供此功能。我实际上把你的代码运行在我的机器上作为服务(着名开发人员的最后一句话)在localsystem帐户下运行。如果运行的帐户缺少事件日志的权限,在您的情况下,或其他任何需要的权限,它将保释。 我在解决类似问题时遇到的一些常见技巧: 1.请记住,您可以选择“运行为”以使Windows窗体应用程序在不同于您登录的帐户下运行。我怀疑使用管理员帐户运行Windows窗体应用程序将完全失败,就像您的服务一样。 2.有选择地使用安全审计可以非常有助于查明访问问题。 3.使用Sysinternals ProcMon通常可以确定拒绝准确访问的内容。 4.要在不将其作为服务运行的情况下尽可能多地调试服务代码,请使用本博客文章中建议的#DEBUG(http://jclaes.blogspot.com/2010/03/cannot-start-service-从-命令line.html)

答案 1 :(得分:0)

事实证明这是Windows XP的一个问题。代码失败,但适用于任何较新的Windows版本,从Windows 2003开始。