我正在编写一个监控ASP .NET应用程序的服务,我遇到的问题尤其在于获取服务描述。由于生产服务器上的注册表读取权限,我当前的方法(从注册表中读取)不起作用。
例如:
Microsoft.Win32.RegistryKey system, currentControlSet, services, service;
system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
currentControlSet = system.OpenSubKey("CurrentControlSet");
services = currentControlSet.OpenSubKey("Services");
service = services.OpenSubKey(scTemp.ServiceName, true);
row["service_description"] = service.GetValue("Description");
产地:
System.Security.SecurityException:不允许请求的注册表访问。
我的问题是:
是否有解决另一个.NET类(可能在System.ServiceProcess命名空间?)或者它是否总是以安全异常错误结束?
使用System.ServiceProcess命名空间获取服务名称和状态没有问题,但我找不到包含任何类来获取描述,这就是我从注册表中读取的原因。
答案 0 :(得分:3)
我认为这应该有用。
编辑:我应该更仔细地阅读问题。下面的代码获取了数组中第一个服务的描述。using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceProcess;
using System.Management;
namespace ServiceNames
{
class Program
{
static void Main(string[] args)
{
ServiceController[] services = ServiceController.GetServices();
string serviceName = services[0].ServiceName;
string objPath = string.Format("Win32_Service.Name='{0}'", serviceName);
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath)))
{
Console.WriteLine(service["Description"]);
}
Console.Read();
}
}
}
答案 1 :(得分:1)
之前的答案显示WMI解决方案是一个不错的选择,值得先尝试。
-
我不知道公开服务描述的.NET Framework类。
我要考虑的第一件事是需要经过身份验证的连接(例如NTLM)并模拟调用者。只要您不进行双跳(即使用您的模拟凭据进行远程通话),您可能会发现您能够成功地进行注册阅读。
如果无法做到这一点,那么进行P / Invoke呼叫可能会有效。
如果您的网络服务的凭据具有SERVICE_QUERY_CONFIG权限,您可以执行以下操作:
显然,从注册表中读取内容会更直接(最终权限问题在两种情况下都可能类似) - 但使用支持的API似乎是一个不那么脆弱的解决方案。
答案 2 :(得分:0)
附带问题:你有什么想要实现的,PerfMon和日志记录无法告诉你吗?