2011-07-12 11 views
40

Mam problem z aplikacją, którą tworzę. Próbuję uruchomić usługę systemu Windows za pośrednictwem mojej aplikacji C#. Kiedy klikam przycisk Start, wygląda na to, że wszystko przechodzi, ale kiedy loguję się do serwera, usługa nadal nie pokazuje, że jest uruchomiona. Jednak po drugim uruchomieniu go otrzymuję wyjątek, który mówi, że wystąpienie usługi jest już uruchomione. Znów, kiedy loguję się do serwera, usługa wydaje się być zatrzymana. Czy ktokolwiek to widział?C# uruchom program Windows automatycznie programowo

Oto mój kod.

try 
{ 
    while (reader.Read()) 
    { 
     int timeoutMilliseconds = 1000; 
     string serviceName = reader["ServiceName"].ToString(); 
     string permission = reader["Permission"].ToString(); 

     if (permission == "E") 
     { 
      lblServStartSuccess.Visible = true; 

      ServiceController service = new ServiceController(serviceName); 
      TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
     } 
     else 
     { 
      lblServErrorStart.Visible = true; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    Response.Write(ex.ToString()); 
} 

EDIT: Oto wyjątek dostałam na jednej usługi:

System.InvalidOperationException: obsługa Logical Disk Manager usługi administracyjne nie zostało znalezione na komputerze ''. ---> System.ComponentModel.Win32Exception: Określona usługa nie istnieje jako usługa zainstalowana --- Koniec wewnętrznego śledzenia stosu wyjątków ---

Wiem, że usługa istnieje. Czy muszę dodać coś przed usługą, aby powiedzieć, na jaki serwer się patrzy?

+1

Czy jesteś pewien, że usługa nie utknęła w stanie początkowym? Pamiętam, że panel kontrolny usług nie był genialny jeśli chodzi o pokazywanie tego (przynajmniej niektóre wersje systemu Windows temu) – Rup

+0

co masz na myśli mówiąc "kiedy loguję się do serwera" - czy próbujesz użyć SCM na innej maszynie? – BrokenGlass

+0

Tak Uruchomiłem usługę internetową ze zdalnego serwera. Używam konta z dostępem administratora. Nie jestem pewien, czy utknął. Czy mój limit czasu może być zbyt krótki i upłynął limit czasu? – Matt

Odpowiedz

31

Jeśli kod, który pokazałeś, jest wykonywany na innym komputerze niż miejsce, w którym ma działać usługa (nie jestem jasny z twoich komentarzy, czy tak jest), musisz podać nazwę komputera w Konstruktor ServiceController. Czy to możliwe, że pomyślnie uruchamiasz usługę, ale nie na komputerze, który myślisz? To pasuje do objawów, które opisujesz.

ServiceController service = new ServiceController(serviceName, serverName); 

http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx

+0

Edytowałem, aby pokazać użycie konstruktora, który przyjmuje nazwę zdalnego serwera. – hatchet

+0

Myślę, że masz rację, ponieważ teraz otrzymuję komunikat o błędzie, że do wykonania tego są wymagane inne uprawnienia. – Matt

+0

Jeśli zaloguję się jako podszywany użytkownik do serwera źródłowego, mogę uruchomić menedżera usług serwera docelowego i zdalnie uruchomić i zatrzymać usługi. Po prostu nie mogę tego zrobić z poziomu aplikacji internetowej. – Matt

0

Po prostu spróbuj service.Start(); bez limitu czasu lub waitforstatus i przechwyć jego zdarzenia, aby zobaczyć, co się dzieje.

+0

Wszystko wygląda na to, że działa. Po prostu nie pokazuje usługi jako działającej. – Matt

14

Oto kod mam w usłudze okna odpowiedzialnej za zatrzymanie zaczynające innych usług uruchomionych na tym samym serwerze.

ServiceController controller = new ServiceController(serviceName); 
if (controller.Status==ServiceControllerStatus.Running) 
    controller.Stop(); 

if (controller.Status==ServiceControllerStatus.Stopped) 
    controller.Start(); 
2
public static void StartService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 

      // count the rest of the timeout 
      int millisec2 = Environment.TickCount; 
      timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1)); 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 
    public static void StopService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 
      if (service.Status == ServiceControllerStatus.Running) 
      { 
       millisec1 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
      } 


     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 
    public static void RestartService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 
      if (service.Status == ServiceControllerStatus.Running) 
      { 
       millisec1 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
      } 
      // count the rest of the timeout 
      int millisec2 = Environment.TickCount; 
      timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 

nie zapomnij dodać ServiceProcess jak Referance użyciu System.ServiceProcess;

+0

Czy to coś dodaje do kodu w pytaniu? – Rup

3

To jest stary wątek, ale google mnie tutaj. Moje usługi, nawet po pomyślnym uruchomieniu, nadal będą odpytywać z powrotem jako zatrzymane. Jeśli dodać

service.Refresh(); 

Będzie zapytania aktualny stan aktualny zamiast zapisanego stanu z poprzedniego zapytania. Nie wiem, dlaczego tak działa, ale tak jest.

P.S .: Dodałem minutę czasu i nadal otrzymuję usługę, która została zatrzymana, bez odświeżania.

Powiązane problemy