ManagementEventWatcher(WMI)从远程计算机通知事件时发生异常

Dev*_*dra 4 c# wmi managementeventwatcher

我正在尝试使用WMI和C#从远程计算机的事件查看器获取通知。我能够连接系统,也可以使用来获取事件日志ManagementObjectSearcher。但是,当我尝试使用ManagementEventWatcher.Start方法时,出现了一个异常:

访问被拒绝。(来自HRESULT的异常:0x80070005(E_ACCESSDENIED))

我已经在WMI控制中root\cimv2赋予了权限,并且还赋予了DCOM Config中用户帐户的管理员权限。

我有普通的Windows应用程序,因此我不使用ASP.net(ASPNET用户)。

我的代码是:

ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = @"Domain\UName";//txtUserName.Text;
connectionOptions.Password = "pass";//txtPassword.Text;
connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope managementScope = new ManagementScope(@"\\server\root\cimv2",connectionOptions);
managementScope.Options.EnablePrivileges = true;
managementScope.Connect(); // this line is executing fine.
eventWatcher = new ManagementEventWatcher(managementScope, new EventQuery("Select * From __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'  and TargetInstance.LogFile = 'Application'"));
eventWatcher.EventArrived += new EventArrivedEventHandler(Arrived);
eventWatcher.Scope.Options.EnablePrivileges = true;
eventWatcher.Start(); // Error occurs here
Run Code Online (Sandbox Code Playgroud)

Oha*_*der 5

首先,请记住,Microsoft建议使用半同步操作(如Brian所建议的):

如果可以,我们建议您改用半同步操作。性能影响很小,并且半同步操作允许相同的功能,但不需要反向连接。

另请参见在VBScript中为异步调用设置安全性

如果仍要使用异步操作,请参考以下文章:

YMMV,但对我来说(客户端:Win7 x64 SP1服务器:Windows Server 2008 Enterprise SP2,没有防火墙)E_ACCESSDENIED,在第三篇文章中找到了该异常的解决方案:

  1. 单击开始,单击运行,键入DCOMCNFG,然后单击确定。
  2. 在“ 组件服务”对话框中,展开“ 组件服务”,再展开“ 计算机”,然后右键单击“ 我的电脑”,然后单击“ 属性”
  3. 在“ 我的电脑属性”对话框中,单击“ COM安全性”选项卡。
  4. 在“ 访问权限”下,单击“ 编辑限制”
  5. 在“ 访问权限”对话框中,在“ 组或用户名”框中选择“ 匿名登录”名称。在“ 用户权限”下的“ 允许”列中,选择“ 远程访问”,然后单击“ 确定”

请注意,我在客户端执行了上述操作。在为我解决DCOM权限问题的同时,我随后遇到了WMI访问被拒绝的错误(0x80041003)。原来是由于第二篇文章中提到的注册表项所致:

如果远程连接是在没有信任关系的计算机之间,则需要更新CIMOM设置。否则,异步连接将失败。对于同一域或受信任域中的计算机,不应修改此设置。

需要修改以下注册表项以允许匿名回调:HKLM \ SOFTWARE \ Microsoft \ WBEM \ CIMOM \ AllowAnonymousCallback

如果AllowAnonymousCallback键设置为0,则WMI服务将阻止匿名回调到客户端。如果该值设置为1,则WMI服务将允许匿名回调到客户端。

请注意,您需要在服务器中设置以上内容。一旦这样做,异步回调就起作用了。您还可以尝试以管理员身份运行客户端,并将ConnectionOptions.EnablePrivileges设置为true。

有关故障排除,请参阅:

最后,我建议您利用Microsoft的WMI测试器(%windir%\system32\wbem\wbemtest.exe