【发布时间】:2010-10-12 17:41:04
【问题描述】:
我正在创建一个监视服务,它将监视各种远程服务器上的其他服务(都在同一个域中)。我用来连接远程服务器的用户不是管理员。当我尝试枚举 Win32_Service 类中的服务时,我收到拒绝访问错误。
我已授予用户“远程启用”和“启用帐户”权限以访问 WMI 控件中的 Root\CIMV2 命名空间。
我可以使用以下代码连接到服务器。对象 ServiceListItem 只是一个包含服务器名称和服务名称的简单类:
SecureString secureString = new SecureString();
foreach ( char c in "password" )
{
secureString.AppendChar( c );
}
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = "domain\\user";
connectionOptions.SecurePassword = secureString;
foreach ( ServiceListItem service in _serviceList )
{
ManagementScope managementScope = new ManagementScope();
managementScope = new ManagementScope( String.Format( @"\\{0}\root\cimv2", service.ServerName ), connectionOptions );
managementScope.Connect();
//RelatedObjectQuery relatedObjectQuery = new RelatedObjectQuery( String.Format( "Win32_Service.Name='{0}'", service.ServiceName ) );
//ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher( managementScope, relatedObjectQuery );
ObjectQuery objectQuery = new ObjectQuery( "SELECT * FROM Win32_Service WHERE Name = '" + service.ServiceName + "'" );
ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher( managementScope, objectQuery );
ManagementObjectCollection objectCollection = objectSearcher.Get();
foreach ( ManagementObject managementObject in objectCollection )
{
serviceStatus = managementObject.Properties["State"].Value.ToString();
Debug.Print(service.ServiceName + " - " + serviceStatus);
//break;
}
}
managementScope.Connect() 运行良好,这意味着 cimv2 上的 wmi 安全设置正确。但是,当我尝试枚举 objectCollection 时,我得到了“拒绝访问”异常。这告诉我(我认为)用户没有权限枚举 Win32_Service 类 (SC_MANAGER_ENUMERATE_SERVICE)。
我只是找不到任何关于如何为远程用户启用该权限的好例子。在使用 Windows api 进行编码时,我不是很有经验,所以请在你的答案中尽可能详细:)
【问题讨论】:
标签: c# security windows-services wmi