获取Windows服务描述ASP .NET

时间:2009-06-13 03:19:40

标签: c# asp.net

我正在编写一个监控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命名空间获取服务名称和状态没有问题,但我找不到包含任何类来获取描述,这就是我从注册表中读取的原因。

3 个答案:

答案 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权限,您可以执行以下操作:

  1. 使用ServiceController类
  2. 查找您感兴趣的服务
  3. 使用ServiceHandle属性,使用SERVICE_CONFIG_DESCRIPTION信息级别对QueryServiceConfig2进行P / Invoke调用,为缓冲区传递null,为长度传递0,从pcbBytesNeeded读取所需的缓冲区长度。
  4. 分配适当的缓冲区长度并再次调用QueryServiceConfig2获取服务描述。
  5. 显然,从注册表中读取内容会更直接(最终权限问题在两种情况下都可能类似) - 但使用支持的API似乎是一个不那么脆弱的解决方案。

答案 2 :(得分:0)

附带问题:你有什么想要实现的,PerfMon和日志记录无法告诉你吗?