我正在创建一个监视狗服务,它将监视各种远程服务器上的其他服务(所有服务都位于同一个域中)。我用来连接远程服务器的用户不是管理员。当我尝试枚举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进行编码方面我不是很有经验,所以请在答案中尽可能详细说明:)
答案 0 :(得分:2)
我发现自己遇到了类似的问题。就我而言,它与权限无关,我通过以下链接设置了权限:http://www.poweradmin.com/help/enableWMI.aspx
所以,经过几个小时的想知道丢失后,我发现这篇文章讲述了UAC如何干扰您的权限集,以及如何解决这个问题: http://www.solarwinds.com/documentation/apm/docs/APMWMITroubleshooting.pdf
在我的情况下,注册表项不存在,所以我创建了它。
希望这也有所帮助,欢呼!
答案 1 :(得分:1)
我今天试图找到相同的答案,我一直在做很多谷歌搜索。经过半个小时的咒语后,我发现this MSDN article (907460)使用了sc sdet
。它似乎工作到目前为止,即使安全描述符是针对Windows Server 2003的。我发现你可以sc sdshow SCMANAGER
来获取当前值,所以当明天回到办公室时我将比较对比确保我没有锁定我不应该的东西: - )
为了完整起见,KB907460中的注释(如果它移动/消失):
症状:安装Microsoft Windows Server 2003 Service Pack 1(SP1)后,非管理员无法远程访问服务控制管理器。
原因: Windows Server 2003 SP1更改了服务控制管理中心的默认安全设置。
解决:强> 要解决此问题,请使用Sc.exe工具的5.2.3790.1830版。 此工具位于%windir%\ System32文件夹中。去做这个, 请按照以下步骤操作:
- 单击“开始”,单击“运行”,键入cmd,然后单击“确定”。
在命令提示符处键入以下命令,然后按Enter:
sc sdset SCMANAGER D:(A;;CCLCRPRC;;;AU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)