Windows services ServiceController服务名称对于构造函数太长

Windows services ServiceController服务名称对于构造函数太长,windows-services,Windows Services,甲骨文似乎做了一些不可能的事情(IMHO):) 我有一个来自Oracle的服务(我想,别杀我,我只是个开发人员!) Name=“Oracle Enterprise Pack for Eclipse NodeManager(C_Oracle_中间件_Home_wlserver_12.1)” 全部87个字符。当我试图通过使用System.ServiceProcess.ServiceController.get_ServicesDependedOn()调用确定所依赖的服务时,我得到一个异常 “用于Ec

甲骨文似乎做了一些不可能的事情(IMHO):)

我有一个来自Oracle的服务(我想,别杀我,我只是个开发人员!)

Name=“Oracle Enterprise Pack for Eclipse NodeManager(C_Oracle_中间件_Home_wlserver_12.1)”

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

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

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

当构造函数在无效但已成功安装的服务上出错时,很难使用ServiceController类-__-

我的快速解决方案,因为我明天必须发布代码,就是把我得到的任何服务名称缩减到80个字符,并称之为“Hail Mary fix”

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


救救我,欧比万

你可能必须找到另一种方法。我反编译了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;
}
//System.ServiceProcess.ServiceController
内部静态bool ValidServiceName(字符串serviceName)
{
if(serviceName==null)
{
返回false;
}
如果(serviceName.Length>80 | | serviceName.Length==0)
{
返回false;
}
char[]数组=serviceName.ToCharArray();
for(int i=0;i
刚刚实现……这种方法行不通。如果我使用trunc名称使构造函数工作,那么获取属性servicesdependendon的调用可能会失败…现在测试…是的,在尝试访问属性时它会崩溃。在我看来,除了通过一些MS支持的方式修复服务短名称中的明显漏洞之外,似乎没有其他方法可以解决这个问题。在2.0和4.0版本的DLL中,80个字符是限制。