これらは、パラメーターのみが異なる同じメソッドの 4 つの呼び出しです。
SynchronizationServiceController.InstallAndStart("test", "test", path);
SynchronizationServiceController.InstallAndStart("test1", "test1", path);
SynchronizationServiceController.InstallAndStart("test2", "\"Usługa synchronizacji systemu B2B1\"", path);
SynchronizationServiceController.InstallAndStart(serviceName, "Usługa synchronizacji systemu B2B", path);
試行錯誤の結果、 CreateServiceメソッドの「サービス名の表示」パラメーター (lpDisplayName [in, optional]) が問題の原因であることがわかりました。短くて単純な場合 (スペースがなく (エスケープされた角かっこを使用しても)、発音区別記号がない場合)、サービス リストに svc が表示されます (ケース 1 および 2)。それ以外の場合は、適切にインストールされ、エラーなしでプログラムで管理(開始/停止/アンインストール) できますが、リストには表示されません。
これはインストール方法のコードです:
public static void InstallAndStart(string serviceName, string displayName, string fileName)
{
IntPtr scm = OpenSCManager(ScmAccessRights.AllAccess);
try
{
IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.AllAccess);
if (service == IntPtr.Zero)
{
service = CreateService(scm, serviceName, displayName, ServiceAccessRights.AllAccess, SERVICE_WIN32_OWN_PROCESS, ServiceBootFlag.AutoStart, ServiceError.Normal, fileName, null, IntPtr.Zero, null, null, null);
しかし、私が言うように - それは動作します。リストに自分のサービスが表示されません。