Ho un servizio Windows che installo utilizzando InstallUtil.exe. Anche se ho impostato il metodo di avvio su Automatico, il servizio non si avvia quando installato, devo aprire manualmente i servizi e fare clic su Avvia. C'è un modo per avviarlo tramite la riga di comando o tramite il codice del servizio?Avvia automaticamente un servizio Windows all'installazione
risposta
Nella classe Installer, aggiungere un gestore per l'evento AfterInstall. È quindi possibile chiamare ServiceController nel gestore eventi per avviare il servizio.
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();
}
}
Ora quando si esegue InstallUtil sull'installer verrà installato e quindi avviato il servizio.
Avvio automatico significa che il servizio viene avviato automaticamente all'avvio di Windows. Come altri hanno già detto, per avviarlo dalla console è necessario utilizzare il ServiceController.
Non desidero farlo. Sto cercando di farlo in una volta dalla riga di comando, o all'interno delle classi di servizio di Windows. – mickyjtwin
Scusate, peccato, ho perso il punto in cui avete esplicitamente escluso la possibilità di avviarlo sul pannello di controllo. –
E i seguenti comandi?
net start "<service name>"
net stop "<service name>"
È possibile utilizzare la seguente riga di comando per avviare il servizio:
net start *servicename*
Usa ServiceController per avviare il servizio dal codice.
Aggiornamento: E il modo più corretto per avviare il servizio dalla riga di comando è utilizzare il comando "sc" (Service Controller) anziché "rete".
È possibile utilizzare il metodo GetServices
della classe ServiceController per ottenere un array di tutti i servizi. Quindi, trova il tuo servizio controllando la proprietà ServiceName
di ciascun servizio. Quando hai trovato il tuo servizio, chiama il metodo Start
per avviarlo.
È inoltre necessario verificare la proprietà Status
per vedere quale stato è già presente prima di chiamare l'avvio (potrebbe essere in esecuzione, in pausa, interrotto, ecc.).
opzioni programmatiche per i servizi di controllo:
- codice nativo può utilizzati, "Starting a Service". Controllo massimo con dipendenze minime ma la maggior parte del lavoro.
- WMI: Win32_Service ha un metodo
StartService
. Ciò è utile per i casi in cui è necessario essere in grado di eseguire altre elaborazioni (ad esempio per selezionare il servizio). - PowerShell: eseguire
Start-Service
tramiteRunspaceInvoke
o creando il proprioRunspace
e utilizzando il relativo metodoCreatePipeline
da eseguire. Ciò vale per i casi in cui è necessario essere in grado di eseguire altre elaborazioni (ad esempio per selezionare il servizio) con un modello di codifica molto più semplice rispetto a WMI, ma dipende dall'installazione di PSH. - Un'applicazione .NET può utilizzare
ServiceController
Dopo refactoring un po ', questo è un esempio di un programma di installazione completo servizio di Windows con avvio automatico:
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();
}
}
}
Questo codice mi ha fornito i seguenti errori/i: Si è verificata un'eccezione durante la fase di installazione. System.InvalidOperationException: si è verificata un'eccezione nel gestore eventi OnAfterInstall di System.ServiceProcess.ServiceInstaller. L'eccezione interna System.InvalidOperationException è stata generata con il seguente messaggio di errore: Impossibile avviare service serviceName sul computer "." .. L'eccezione interna System.ComponentModel.Win32Exception è stata generata con il seguente messaggio di errore: Il programma eseguibile che questo servizio è configurato per l'esecuzione non implementa il servizio. – goamn
Gli errori sono stati rilevati quando ho commentato la riga "InitializeComponent()". Credo che questa riga stia duplicando tutte le altre righe poiché i log sembrano mostrare due cose identiche che accadono insieme prima dell'errore: Installazione servizio nome servizio ... Servizio nome servizio è stato installato correttamente. Creazione del nome del servizio EventLog nel registro Applicazione ... Installazione del servizio nome servizio ... Creazione del nome del servizio EventLog nel registro Applicazione ... Si è verificata un'eccezione nel gestore eventi OnAfterInstall di System.ServiceProcess.ServiceInstaller. – goamn
Hai davvero salvato la mia giornata :) Grazie per questo utile commento. Dopo aver commentato la chiamata InitializeComponent(), anche il mio servizio è iniziato perfettamente – Konstantin
È corrotto il vostro progettista.ReAggiungi il tuo componente Installer. Dovrebbe avere un serviceInstaller e un serviceProcessInstaller. Il servizio Installer with property Startup Method impostato su Automatic avvierà l'avvio al momento dell'installazione e dopo ogni riavvio.
Nonostante la risposta accettata, non ero ancora in grado di avviare il servizio-- Mi è stato invece inviato un messaggio di errore durante l'installazione che indicava che il servizio appena installato non poteva essere avviato, poiché non esisteva , nonostante l'uso di this.serviceInstaller.ServiceName
piuttosto che un letterale ...
alla fine ho trovato una soluzione alternativa che fa uso della linea di comando:
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();
}
Solo una nota: potrebbe essere configurare il servizio in modo diverso con il interfaccia moduli per aggiungere un programma di installazione del servizio e un programma di installazione del progetto. In tal caso, sostituire dove dice serviceInstaller.ServiceName con "name from designer" .ServiceName.
In questo caso non sono necessari i membri privati.
Grazie per l'aiuto.
- 1. Avvia un servizio Windows disabilitato?
- 2. avvia il servizio Windows da java
- 3. Avvia un servizio dall'attività
- 4. Avvia automaticamente la richiesta web
- 5. Avvia automaticamente i servizi nel contenitore mobile
- 6. UWP applicazione si avvia automaticamente all'avvio
- 7. SqlBulkCopy avvia automaticamente una transazione?
- 8. Il servizio Windows non si avvierà automaticamente dopo il riavvio
- 9. Avvia automaticamente JavaDB (Derby) su GlassFish
- 10. Come installare un servizio Windows usando Qt?
- 11. Invia messaggio Windows a un servizio Windows
- 12. Aggiornamento silenzioso di un servizio di Windows
- 13. Come riavviare automaticamente un servizio ucciso?
- 14. Perché questo servizio semplice non si avvia?
- 15. Aggiornamento automatico di un servizio di Windows
- 16. Servizio WCF vs servizio Windows
- 17. Servizio WCF vs servizio Windows
- 18. blocco scia di AlarmManager quando si avvia un servizio
- 19. installazione JAR che rileva automaticamente se Java è lì e avvia automaticamente l'applicazione
- 20. MSMQ backed Il servizio WCF ospitato in un servizio Windows ha esito negativo all'avvio
- 21. Servizio Windows non automatico Avvio al riavvio
- 22. Servizio Windows non avviato con l'aggiornamento a Windows 10
- 23. install redis come servizio windows
- 24. Avvia con modifica in Windows Server 2012
- 25. Windows: elenca e avvia le applicazioni associate ad un interno
- 26. Avvia Tomcat all'avvio di Windows 7?
- 27. Servizio WCF come servizio Windows guai (Windows 7)
- 28. Registrazione degli eventi in un programma di servizio di Windows
- 29. Come si interrompe un'applicazione del servizio Windows da un thread?
- 30. Avvia il servizio systemd dall'applicazione C/C++ o chiama un servizio D-Bus
(commento da una modifica proposta): meglio utilizzare serviceInstaller.ServiceName, se il nome del servizio viene modificato utilizzerà il nome corretto senza doverlo modificare nel codice. –
Inoltre non sarebbe male racchiudere il 'ServiceController' in un'istruzione using. – ChrisO
Ho bisogno di specificare l'id del programma di installazione del servizio in OnBeforeInstall. Qualcosa come serviceInstaller = serviceInstaller1; dove serviceInstaller1 è l'id del designer. Fare questo in OnBeforeInstall ha reso il lavoro sopra perfetto per me. Non ho provato ma potresti essere in grado di farlo anche nella chiamata ServiceInstaller(). –