2010-05-06 70 views
4

我试图从使用WMI和C#的远程计算机的事件查看器中获取通知。我可以通过使用ManagementObjectSearcher连接系统并获取事件日志。但是当我尝试使用ManagementEventWatcher.Start方法时,我收到一个异常:ManagementEventWatcher(WMI)异常通知远程计算机的事件

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

我已经给在WMI控制的permisions到root\cimv2,并且还给出了管理权限,以在DCOM配置用户的帐户。

我有正常的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 

回答

4

试听半同步与WaitForNextEvent():

var managementScope = new ManagementScope(@"\\mysever\root\onguard"); 
    managementScope.Connect(); 

    var query = new EventQuery("select * from lnl_AccessEvent"); 
    var eventWatcher = new ManagementEventWatcher(managementScope, query); 
    var wmiEvent = eventWatcher.WaitForNextEvent(); 
    Console.Out.WriteLine(wmiEvent.GetPropertyValue("Description")); 

我们还发现WBEMTEST.EXE有用。点击通知查询...按钮以收听活动。您可以尝试各种连接方法(同步,异步或半同步)。所有连接方法在连接到本地计算机时都能正常工作,但我们只能通过半同步远程工作。异步(您正在使用)更复杂(并且不太安全),因为服务器必须连接回客户端。

一些有用的信息在这里安全和配置设置: http://www.packettrap.com/network/Knowledge-Base/PacketTrap-MSP/WMI-Troubleshooting.aspx#_Toc239699682

+3

这显然应该是被接受的答案。我花了很多时间来解决这个错误,异步版本根本无法使用身份验证。谢谢你的回答。 – 2011-05-23 13:33:56

+0

@Pieter - 这是可能的,看到我的答案。尽管如此,微软仍然推荐使用半同步方法。 – 2012-02-15 22:55:42

4

首先,请记住,Microsoft recommends the use of semi-synchronous operations(布赖恩建议):

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

另请参阅Setting Security on an Asynchronous Call in VBScript

如果你仍然想使用异步操作,请参阅下面的文章:

情况因人而异,但对我来说(客户端:Win7 x64 SP1服务器:Windows Server 20 08企业SP2 W/O防火墙)的E_ACCESSDENIED异常溶液第三篇文章中找到:

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

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

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

下面的注册表项需要进行修改,以允许匿名 回调:HKLM \ SOFTWARE \微软\ WBEM \ CIMOM \ AllowAnonymousCallback

如果AllowAnonymousCallback项设置为0,WMI服务 防止匿名回调客户端。如果该值设置为1,则 WMI服务允许匿名回拨给客户端。

请注意,您需要在服务器中设置上述内容。一旦我这样做,异步回调工作。您可以尝试的其他方法是以管理员身份运行客户端,并将ConnectionOptions.EnablePrivileges设置为true。

有关故障排除,请参阅:

最后,我建议你充分利用微软的WMI测试仪(%windir%\system32\wbem\wbemtest.exe

0

我花了几个小时FIGUR这一个出来。以上都不适合我。

我的IIS服务器上分析事件日志后,我发现我每次叫ManagementEventWatcher对象的Start方法时我是在系统日志receivingthe以下错误事件:

机器默认权限设置不授予本地激活 许可具有CLSID COM服务器应用程序 {49BD2028-1523-11D1-AD79-00C04FD8FDFF}和APPID {49BD2028-1523-11D1-AD79-00C04FD8FDFF}给用户IIS APPPOOL \默认应用SID ( S-1-5-82-3006700770-424185619-1745488364-794895919-4004696415)从 地址LocalHost(使用LRPC)。此安全许可可以是使用组件服务管理工具修改的 。

注册表搜索发现,随着APPID错误中指定的应用程序是

微软WBEM不安全公寓

为了让你需要授予本地激活权限异步回调工作将此COM对象添加到IIS APPPOOL \ DefaultAppPool用户,这听起来很容易,除非用户在安全数据库中没有显示为有效的帐户。这是因为它是在创建IIS应用程序池时自动生成的系统生成的用户帐户。

的过程,使这项工作如下:

  1. 运行MMC,添加组件服务管理单元中
  2. 打开Computers->我的电脑> DCOM配置
  3. 向下滚动到“ Microsoft WBEM不安全的公寓对象“
  4. 右键单击并选择属性
  5. 单击安全选项卡并在”启动和激活权限“部分下选择自定义选项并点击编辑
  6. 如果您的IIS服务器是域的一部分,请确保您具有在位置字段中指定的本地计算机,而不是域。
  7. 点击添加按钮并在用户框中输入“IIS APPPool \ DefaultAppPool”并点击检查姓名按钮。如果您未使用DefaultAppPool,则替换您正在使用的App Pool的名称。
  8. 你会看到一个有效的用户出现在框中,点击确定。
  9. 在列表中选择用户并选中允许本地启动和本地激活框。
  10. 享受在您的WMI事件侦听器的异步回调中不再看到E_ACCESSDENIED的事实。