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)
首先,请记住,Microsoft建议使用半同步操作(如Brian所建议的):
如果可以,我们建议您改用半同步操作。性能影响很小,并且半同步操作允许相同的功能,但不需要反向连接。
另请参见在VBScript中为异步调用设置安全性。
如果仍要使用异步操作,请参考以下文章:
YMMV,但对我来说(客户端:Win7 x64 SP1服务器:Windows Server 2008 Enterprise SP2,没有防火墙)E_ACCESSDENIED,在第三篇文章中找到了该异常的解决方案:
请注意,我在客户端执行了上述操作。在为我解决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)