我正在尝试在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应用程序,相同的代码将按预期工作。
感谢。
答案 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开始。