【问题标题】:How to use ManagementEventWatcher in a windoes service?如何在 Windows 服务中使用 ManagementEventWatcher?
【发布时间】:2011-01-31 16:52:48
【问题描述】:

我正在尝试在 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();行给出异常消息“拒绝访问”。我尝试将我的服务设置为管理员或本地系统,但没有帮助。

我还找到了这个文档:http://msdn.microsoft.com/en-us/library/aa392289(VS.85).aspx 但我不知道如何在 C# 中使用它。

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

谢谢。

【问题讨论】:

  • 如果您将 Windows 服务配置为模拟您自己的 Windows 帐户而不是 Localsystem 运行,它是如何工作的?
  • 正如我在问题中所说,我已将其模拟为系统上唯一的帐户“管理员”,但它仍然被“拒绝访问”。

标签: c# .net


【解决方案1】:

这里没有任何内在因素会阻止服务提供此功能。实际上,我将您的代码作为本地系统帐户下的服务(著名的开发人员遗言)在我的机器上运行良好。如果运行的帐户缺少对事件日志的权限,在您的情况下,或者它需要的任何其他内容,它将保释。 我在解决类似问题方面非常频繁的经验中提供了一些一般性提示: 1. 请记住,您可以选择“运行方式”让您的 Windows 窗体应用程序在与您登录时不同的帐户下运行。我怀疑使用管理员帐户运行您的 Windows 窗体应用程序会像您的服务一样失败。 2. 有选择地使用安全审计非常有助于查明访问问题。 3. 使用 Sysinternals ProcMon 通常可以查明拒绝访问的具体内容。 4. 要在不作为服务运行的情况下尽可能多地调试服务代码,请使用本博文中建议的#DEBUG (http://jclaes.blogspot.com/2010/03/cannot-start-service- from-command-line.html)

【讨论】:

  • 如何在windoes服务中使用ManagementEventWatcher?
  • Artur,您似乎花了很多时间投票(16 次投票)以获得当前低于 400 的堆栈溢出声誉。我认为我的回答是正确的。
  • 服务可以写入日志,所以日志访问没有问题。此外,如果我在 Windows 窗体应用程序中运行它,即使使用管理员帐户也可以正常工作。问题是,如果我从各种谷歌搜索结果中正确理解,服务不能简单地访问 ManagementEventWatcher 所在的 Windows WMI,所以你的回答对我没有帮助。我还查看了所有日志并尝试了不同的技巧,例如在范围选项中使用模拟,但这也没有帮助。
  • Patkos,我尽可能地尝试了您的方案。我实际上在我的 PC 上创建并运行了一个成功访问 WMI 的服务。可以通过 Windows 服务访问 WMI。这就是为什么我的答案集中在将其作为访问控制问题进行故障排除的原因。此外,我认为,您指向 MSDN 页面“降低单独进程中接收器的安全性”的链接是无关紧要的(除非您的方案涉及多个进程)。
  • 嗯,奇怪。你有什么版本的Windows?另外,请尝试将eventListener.Start(); 放入try { } catch { } 并告诉我它是否捕捉到了什么。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 2014-08-07
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多