2012-10-11 70 views
1

甲骨文似乎已經做了一些不應該是可能的(恕我直言):)ServiceController的服務名稱太長構造

我已經從Oracle服務(我想,不要拍我,我只是開發商!)

名稱= 「甲骨文Eclipse企業軟件包節點管理器(C_Oracle_Middleware_Home_wlserver_12.1)」

所有87個字符。當我試圖確定服務使用System.ServiceProcess.ServiceController.get_ServicesDependedOn()調用依靠,我得到一個異常說明

「服務名的Oracle Eclipse企業軟件包節點管理器 (C_Oracle_Middleware_Home_wlserver_12.1)包含無效字符, 是空的,或太長(最大長度= 80)」

此名稱是服務註冊表項的名稱爲好。我的理解是,這個屬性(名稱在Win32_Service類),應該被限制爲80個字符。

當無效但成功安裝的服務上的構造函數barfs時,使ServiceController類變得非常困難。 -__-

我的快速解決方案,因爲我必須明天發運代碼,將任何服務名稱截斷爲80個字符,並將其稱爲「Hail Mary Fix」。

有沒有人找到解決這個問題的方法?我無法控制Windows似乎在這個領域有多鬆散,服務開發人員(Oracle)不遵守服務短名稱的80個字符限制。

幫我,歐比旺! ;)

+0

剛剛意識到......這種方法不起作用。如果我截斷名稱以使構造函數正常工作,那麼獲取Property ServicesDependedOn的調用可能會失敗......現在正在測試...... – joebalt

+0

是的,它在嘗試訪問屬性時會自動彈出塊。除了通過一些MS支持的方式修復服務短名稱中的明顯漏洞之外,似乎沒有辦法解決這個問題。 – joebalt

+0

我沒有想法。 – joebalt

回答

0

你可能會找到另一種方式。我反編譯了ServiceController,並發現一個包含80個字符檢查的方法。您可以將shell.exe轉換爲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; 
} 
+0

80個字符是DLL和2.0版本的4.0版本的限制。 –