nor*_*pro 5 c# security wmi windows-services
我正在创建一个看门狗服务,它将监视各种远程服务器(都在同一个域中)上的其他服务。我用来连接远程服务器的用户不是管理员。当我尝试枚举 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;
}
}
Run Code Online (Sandbox Code Playgroud)
managementScope.Connect() 运行良好,这意味着 cimv2 上的 wmi 安全设置正确。但是,当我尝试枚举 objectCollection 时,出现“拒绝访问”异常。这告诉我(我认为)用户没有枚举 Win32_Service 类 (SC_MANAGER_ENUMERATE_SERVICE) 的权限。
我只是找不到任何关于如何为远程用户启用该权限的好例子。在使用 Windows api 进行编码时,我不是很有经验,所以请在您的回答中尽可能详细:)
今天我自己也尝试着找到同样的答案,我做了很多谷歌搜索。经过半个小时的咒语,我找到了这篇 MSDN 文章 (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:
Run Code Online (Sandbox Code Playgroud)sc sdset SCMANAGER D:(A;;CCLCRPRC;;;AU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)