Mam usługę Windows, którą instaluję za pomocą InstallUtil.exe. Mimo że ustawiłem metodę uruchamiania na automatyczną, usługa nie uruchamia się po zainstalowaniu, muszę ręcznie otworzyć usługi i kliknąć start. Czy istnieje sposób, aby uruchomić go za pomocą wiersza poleceń lub kodu usługi?Automatyczne uruchamianie usługi systemu Windows przy instalacji
Odpowiedz
w klasie Instalatora, dodać moduł obsługi dla zdarzenia AfterInstall. Następnie można wywołać ServiceController w module obsługi zdarzeń, aby uruchomić usługę.
using System.ServiceProcess;
public ServiceInstaller()
{
//... Installer code here
this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}
void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
Teraz po uruchomieniu InstallUtil na instalatora będzie zainstalować, a następnie uruchomić usługę.
Automatyczne uruchamianie oznacza, że usługa jest uruchamiana automatycznie podczas uruchamiania systemu Windows. Jak wspomnieli inni, aby uruchomić go z konsoli, powinieneś użyć ServiceController.
Nie chcę tego robić. Szukam zrobić to za jednym razem z poziomu wiersza poleceń lub z poziomu klas usługi Windows. – mickyjtwin
Przepraszam, moja zła, brakowało mi punktu, w którym wyraźnie wykluczyłeś możliwość uruchomienia go przez panel sterowania. –
Co powiesz na następujące polecenia?
net start "<service name>"
net stop "<service name>"
Można użyć następującego wiersza polecenia, aby uruchomić usługę:
net start *servicename*
Zastosowanie ServiceController aby rozpocząć swoją usługę od kodu.
Aktualizacja: I bardziej poprawny sposób, aby uruchomić usługę z poziomu wiersza poleceń jest użycie „sc” (Service Controller) zamiast polecenia „net”.
Można użyć klasy GetServices
klasy ServiceController , aby uzyskać tablicę wszystkich usług. Następnie znajdź swoją usługę, sprawdzając właściwość każdej usługi. Po znalezieniu usługi wywołaj metodę Start
, aby ją uruchomić.
Powinieneś również sprawdzić właściwość Status
, aby zobaczyć, w jakim stanie jest już przed wywołaniem startu (może być uruchomiony, wstrzymany, zatrzymany itp.).
programowe dla służb kontrolujących opcje:
- natywnego kodu może być używany, "Starting a Service". Maksymalna kontrola przy minimalnych zależnościach, ale najwięcej pracy.
- WMI: Win32_Service ma metodę
StartService
. Jest to dobre w przypadkach, gdy musisz mieć możliwość wykonania innego przetwarzania (np. Wyboru usługi). - PowerShell: wykonaj
Start-Service
przezRunspaceInvoke
lub przez utworzenie własnegoRunspace
i użyj metodyCreatePipeline
do wykonania. Jest to dobre w przypadkach, gdy musisz mieć możliwość wykonania innego przetwarzania (np. Wyboru usługi) przy znacznie łatwiejszym modelu kodowania niż WMI, ale zależy to od zainstalowanego PSH. - aplikacja .NET można używać
ServiceController
Po refactoring trochę, to jest przykładem kompletnego instalatora usługi Windows z automatycznym start:
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
private readonly ServiceProcessInstaller processInstaller;
private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;
public ServiceInstaller()
{
InitializeComponent();
processInstaller = new ServiceProcessInstaller();
serviceInstaller = new System.ServiceProcess.ServiceInstaller();
// Service will run under system account
processInstaller.Account = ServiceAccount.LocalSystem;
// Service will have Start Type of Manual
serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServiceName = "Windows Automatic Start Service";
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;
}
private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceController sc = new ServiceController("Windows Automatic Start Service");
sc.Start();
}
}
}
Ten kod spowodował wystąpienie następującego błędu/ów: Wystąpił wyjątek podczas fazy instalacji. System.InvalidOperationException: Wystąpił wyjątek w module obsługi zdarzenia OnAfterInstall System.ServiceProcess.ServiceInstaller. Wyjątek wewnętrzny wyjątek System.InvalidOperationException został zgłoszony z następującym komunikatem o błędzie: Nie można uruchomić usługi nazwa_usługi na komputerze "." .. Wyjątek wewnętrzny Wyjątek System.ComponentModel.Win32Exception został zgłoszony z następującym komunikatem o błędzie: Program wykonywalny tej usługi jest skonfigurowany do uruchamiania nie implementuje usługi. – goamn
Błędy zajęte, gdy skomentowałem linię "InitializeComponent()". Sądzę, że ta linia powtarza wszystkie pozostałe wiersze, ponieważ dzienniki zdają się pokazywać dwie identyczne rzeczy, które występują razem przed wystąpieniem błędu: Instalowanie usługi serviceName ... Usługa nazwa usługi została pomyślnie zainstalowana. Tworzenie usługi nazwa-źródła źródła zdarzeń w aplikacji rejestru ... Instalowanie usługi serviceName ... Tworzenie usługi nazwa-źródła źródła zdarzeń w aplikacji log ... Wystąpił wyjątek w module obsługi zdarzeń OnAfterInstall System.ServiceProcess.ServiceInstaller. – goamn
Naprawdę uratowałeś mój dzień :) Dziękuję za ten użyteczny komentarz. Po tym, jak skomentowałem wywołanie InitializeComponent(), moja usługa również zaczęła się doskonale – Konstantin
Ty uszkodzony projektanta.Wprowadź ponownie swój komponent instalatora. Powinien mieć serviceInstaller i serviceProcessInstaller. Narzędzie serviceInstaller z właściwością Metoda uruchamiania ustawiona na Automatycznie uruchomi się po zainstalowaniu i po każdym ponownym uruchomieniu.
Mimo dokładnego zaakceptowania odpowiedzi, nadal nie byłem w stanie uruchomić usługi - zamiast tego podczas instalacji podano komunikat o błędzie, że usługa, która została właśnie zainstalowana, nie może zostać uruchomiona, ponieważ nie istnieje mimo korzystania this.serviceInstaller.ServiceName
raczej niż dosłowna ...
I w końcu znaleźć alternatywne rozwiązanie sprawia, że korzystanie z linii poleceń:
private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
}
Tylko uwaga: można skonfigurowaniu usługi w różny sposób za pomocą tworzy interfejs do dodawania instalatora serwisów i instalatora projektu. W takim przypadku zastąp miejsce, w którym znajduje się nazwa serviceInstaller.ServiceName z "name from designer" .ServiceName.
W tym przypadku nie potrzebujesz również prywatnych członków.
Dzięki za pomoc.
- 1. Projekt instalacji usługi Windows - uruchamianie usługi jako administrator
- 2. Uruchamianie skryptu Pythona jako usługi systemu Windows
- 3. Uruchamianie aplikacji WPF jako usługi systemu Windows
- 4. Automatyczne uruchamianie usługi JBoss (MBean)
- 5. Foldery instalacji systemu Windows
- 6. Automatyczne uruchamianie systemu Azure webrole po wdrożeniu
- 7. Automatyczne uruchamianie usługi w kontenerze dokowania
- 8. Uruchamianie usługi Docker dla systemu Windows, błąd podczas wystawiania portów
- 9. Jak ustawić domyślną ścieżkę instalacji przy użyciu instalatora systemu Windows?
- 10. Usługi Open Services systemu Windows
- 11. Automatyczna aktualizacja usługi systemu Windows
- 12. Automatyczne uruchamianie testów przy użyciu capistrano
- 13. Instalowanie usługi systemu Windows przy użyciu pliku wsadowego?
- 14. Sterowanie sekwencją uruchamiania usługi systemu Windows
- 15. Uruchamianie R z wiersza polecenia systemu Windows
- 16. Uruchamianie poleceń systemu Windows plik wsadowy asynchronicznie
- 17. Usługa systemu Windows Wybierz konto użytkownika lub systemowe podczas instalacji
- 18. Wyłączanie usługi Windows przy uruchamianiu aplikacji
- 19. Projekt instalacji systemu Windows XNA bez mojego projektu zawartości
- 20. Uruchamianie uniwersalnych aplikacji systemu Windows 10 w systemie Windows 8.1
- 21. Usunięcie usługi systemu Windows bez EXE
- 22. Programistycznie zmieniaj użytkownika usługi systemu Windows
- 23. Uzyskiwanie pełnej ścieżki do usługi systemu Windows
- 24. Uruchamianie aplikacji GUI z usługi Windows - okno nie pojawia się
- 25. Jak zapobiec uruchamianiu systemu Windows przy uruchamianiu systemu Windows?
- 26. Skrypt wsadowy do instalacji lub deinstalacji usługi Windows .NET
- 27. Określ systemu Windows Nazwa usługi na zainstalować z instalacyjnego Projektu
- 28. Usługa systemu Windows nie jest uruchamiana po uaktualnieniu systemu Windows 10
- 29. usługi Windows Problem Instalacja
- 30. Usługa wdrażania systemu Windows
(komentarz z proponowanej edycji): Lepiej użyć serviceInstaller.ServiceName, jeśli nazwa usługi zostanie zmieniona, użyje poprawnej nazwy bez potrzeby zmiany jej w kodzie. –
Nie zaszkodzi również zawinąć 'ServiceController' w instrukcji using. – ChrisO
Potrzebowałem podać identyfikator instalatora usługi w OnBeforeInstall. Coś jak serviceInstaller = serviceInstaller1; gdzie serviceInstaller1 jest identyfikatorem od projektanta. Wykonanie tego w OnBeforeInstall sprawiło, że powyższe dzieło bezbłędnie dla mnie. Nie próbowałem, ale możesz to zrobić również w wywołaniu ServiceInstaller(). –