授予远程用户(非管理员)使用WMI&;枚举命名空间cimv2中Win32_服务中的服务的能力;C#

授予远程用户(非管理员)使用WMI&;枚举命名空间cimv2中Win32_服务中的服务的能力;C#,c#,security,windows-services,wmi,C#,Security,Windows Services,Wmi,我正在创建一个监视服务,它将监视各种远程服务器上的其他服务(都在同一个域中)。我用来连接远程服务器的用户不是管理员。当我尝试枚举Win32_服务类中的服务时,我得到一个拒绝访问错误 我已将用户“远程启用”和“启用帐户”权限分配给WMI控件中的Root\CIMV2命名空间 我可以用以下代码连接到服务器。对象ServiceListItem只是一个包含服务器名称和服务名称的简单类: SecureString secureString = new SecureString(); foreach ( c

我正在创建一个监视服务,它将监视各种远程服务器上的其他服务(都在同一个域中)。我用来连接远程服务器的用户不是管理员。当我尝试枚举Win32_服务类中的服务时,我得到一个拒绝访问错误

我已将用户“远程启用”和“启用帐户”权限分配给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_服务类(SC_MANAGER_enumerate_服务)的权限


我只是没有找到任何关于如何为远程用户启用该权限的好例子。对于使用Windows api进行编码,我不是很有经验,所以请在回答中尽可能详细:)

今天我自己也在努力寻找同样的答案,我一直在用谷歌搜索。经过半个小时的咒语,我找到了使用
scsdet
。尽管安全描述符是针对WindowsServer2003的,但到目前为止它似乎仍然有效。我发现您可以执行
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)
    

我发现自己也陷入了类似的问题。在我的情况下,它与权限无关,我通过以下链接设置了权限:

因此,经过几个小时的思考,我找到了这篇文章,它告诉我UAC是如何干扰您的权限集的,以及您如何解决这一问题:

在我的例子中,注册表项不存在,所以我创建了它

希望这也有帮助,干杯