2009-10-09 16 views
18

Próbuję napisać aplikację i usługę, które monitorują dany zestaw usług i a) upewnia się, że działają i b) w oparciu o określone kryteria, zrestartuj je w razie potrzeby.Usługa zatrzymania/uruchomienia w kodzie w systemie Windows 7

Występuje błąd odmowy dostępu.

Gdybym po prostu iterację procesów w systemie, znaleźć taki chcę tak:

foreach (ServiceController sc in ServiceController.GetServices()) 
    {     
     if(sc.ServiceName == "MyServiceName") 
     { 
      sc.Stop(); 
      sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60)); 
      sc.Start(); 
     }    
    } 

uzyskać:

InnerException: System.InvalidOperationException 
     Message="Cannot open My Service service on computer '.'." 
     Source="System.ServiceProcess" 
     StackTrace: 
      at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) 
      at System.ServiceProcess.ServiceController.Stop() 
      at lib.ListServices() in D:\lib.cs:line 552 
      at lib.Init() in D:\lib.cs:line 56 
    InnerException: System.ComponentModel.Win32Exception 
      Message="Access is denied" 
      ErrorCode=-2147467259 
      NativeErrorCode=5 
      InnerException: 

Próbowałem personifikować użytkownika, mam próbował wykonać ten sam kod z innej usługi, która działa jako usługa systemowa. Żadne z nich nie mogło wpłynąć na usługę. Jeśli to się zaczęło, nie mogę tego zatrzymać. Jeśli się zatrzyma, nie mogę go uruchomić. Wiem, że to wszystko jest związane z uprawnieniami. Nie znajduję mechanizmu, który faktycznie pozwala mi kontrolować usługę.

Każda pomoc będzie mile widziana.

Odpowiedz

0

Czy może to być zasada bezpieczeństwa .net, która uniemożliwia aplikacji kontrolowanie usługi?

Zgodnie z MSDN, Twój zespół potrzebuje pełnego zaufania, aby to zadziałało.

10

Myślę, że to błąd UAC ... Spróbuj uruchomić plik exe, klikając prawym przyciskiem myszy i "Uruchom jako administrator". Jeśli to pomaga, możesz dodać plik manifestu do swojego pliku wykonywalnego z poziomem = "requireAdministrator".

0

Musisz ustawić, aby aplikacja działała jako administrator. Jeśli zajrzysz do menu właściwości plików. Na karcie zgodności znajduje się opcja Poziom Privilige, umożliwiająca uruchomienie programu jako administrator. To działało na własne tac systemowych w systemie Windows 7.

10

diagnoz:


UAC jest rzeczywiście problem. Twoja aplikacja wymaga podwyższonych uprawnień użytkownika. Dlatego "uruchom jako administrator" działa poza IDE.

Niektóre witryny sugerują wyłączenie funkcji Kontrola konta użytkownika. Ponieważ nie jest to możliwe w moim środowisku, postanowiłem poprosić użytkownika o podwyższonym poziomie prawa za pomocą kodu. Wikipedia pod warunkiem, że potrzebuję pomocy. Sekcja "Żądanie elewacji" zapewnia rozwiązanie.

Rozwiązanie w skrócie:


Edit aplikacja plik manifestu, aby odzwierciedlić swoje wymagania.


1.1. Kliknij prawym przyciskiem myszy swój projekt
1.2. Kliknij "Właściwości"
1.3. Wybierz zakładkę "Aplikacja" - domyślna strona
1.4. Kliknij "Wyświetl ustawienia UAC" - Ten przycisk otwiera plik manifestu aplikacji (app.manifest).
1.5.Poszukaj opcji "Opcje manifestu UAC"
1.6. Usuń lub skomentuj bieżący wpis - {requestedExecutionLevel level = "asInvoker" uiAccess = "false"}
1.7. Zmień na {requestedExecutionLevel level = "requireAdministrator" uiAccess = "false"}. MS udostępnia 3 opcje jako część komentarza sekcji.

Powiązane problemy