ServiceController服务名称对于构造函数来说太长了

时间:2012-10-11 20:54:28

标签: windows-services

Oracle似乎已经做了一些不可能实现的事情(恕我直言):)

我有来自Oracle的服务(我想,不要拍我,我只是开发人员!)

Name =“Eclipse NodeManager的Oracle Enterprise Pack(C_Oracle_Middleware_Home_wlserver_12.1)”

所有87个字符。当我尝试通过使用System.ServiceProcess.ServiceController.get_ServicesDependedOn()调用来确定所依赖的服务时,我得到一个异常陈述

  

“Eclipse NodeManager的服务名称Oracle Enterprise Pack   (C_Oracle_Middleware_Home_wlserver_12.1)包含无效字符,   是空的,或者太长(最大长度= 80)“

此名称也是服务的注册表项的名称。我的理解是这个属性(Win32_Service类上的Name)应该限制为80个字符。

当构造函数barfs无效但成功安装服务时,使用ServiceController类真的很难。 -__-

我的快速修复,因为我明天必须发送代码,是截断任何服务名称,我将其归结为80个字符并称之为“Hail Mary Fix”。

你们有没有找到解决方法的方法更好?我无法控制Windows在这个领域的松散程度,服务开发人员(Oracle)也没有遵守服务短名称的80-char限制。

帮帮我,欧比万! ;)

1 个答案:

答案 0 :(得分:0)

你可能不得不寻找另一种方式。我反编译了ServiceController,我找到了一个已经烘焙了80个字符的方法。你可以改为使用sc.exe或其他东西。

// System.ServiceProcess.ServiceController
internal static bool ValidServiceName(string serviceName)
{
    if (serviceName == null)
    {
        return false;
    }
    if (serviceName.Length > 80 || serviceName.Length == 0)
    {
        return false;
    }
    char[] array = serviceName.ToCharArray();
    for (int i = 0; i < array.Length; i++)
    {
        char c = array[i];
        if (c == '\\' || c == '/')
        {
            return false;
        }
    }
    return true;
}