2010-10-26 24 views
8

Ho creato un'applicazione in esecuzione come servizio Windows e viene installata tramite il mio codice.assicurandosi che un servizio Windows venga eseguito prima dell'accesso

Tutto va bene tranne che all'accesso.

Alla prima schermata di accesso al server Windows xp/2003, non sono sicuro che il servizio sia in esecuzione. In tal caso, funziona in quanto non è funzionale (il servizio STA UTILIZZANDO WINPCAP in modo che possa essere un problema).

Le impostazioni del servizio sono impostate su "Interagisci con desktop" ed eseguite come SYSTEM.

Come posso garantire che il servizio venga avviato prima di Windows Logon? Inoltre, come posso assicurarmi che sia in esecuzione anche dopo la disconnessione?

risposta

3

Ci sono un paio di problemi da considerare.

  1. In primo luogo, è possibile verificare se il servizio davvero è in esecuzione prima di login e dopo il logout accedendo eventi al registro eventi di Windows. Praticamente tutti i servizi lo fanno ogni volta che si avviano e si fermano e il tuo dovrebbe fare lo stesso.

  2. È possibile che WinPcap sia parte del problema. Ci sono un paio di regole d'oro per l'utilizzo di WinPcap in un servizio.

    1a) Il servizio non deve eseguire operazioni che potrebbero causare l'avvio del servizio WinPcap durante l'avvio del servizio, poiché ciò causerebbe un deadlock nella Gestione controllo servizi di Windows. Ciò significa che se il servizio WinPcap non è già SERVICE_RUNNING quando il servizio inizia l'avvio, non devi fare nulla che possa causare l'avvio fino a quando il servizio non è SERVICE_RUNNING.

    Ci sono due modi per garantire questo. O rendere il servizio dipendente da npf, il servizio Filtro pacchetti di rete. Oppure non chiamare nessuna funzione WinPcap fino a quando il servizio non sarà SERVICE_RUNNING. Non ho provato quest'ultimo metodo. Presumo quindi la funzione WinPcap verrà bloccata fino a quando npf è SERVICE_RUNNING.

    1b) Se il servizio dipende da npf, sarà necessario renderlo dipendente da nm (Network Monitor Driver) - se e solo se nm è installato sul sistema. nm fornisce WinPcap con supporto PPP/VPN e WinPcap tenta sempre di usarlo se installato. Ovviamente, se si rende nm una dipendenza del proprio servizio e nm non è installato, il servizio non verrà avviato.

  3. Non penso che ci sia un modo garantito per garantire che il servizio venga avviato prima che venga visualizzato il desktop. Ma potresti essere in grado di aiutare le cose creando un gruppo di controllo del servizio, aggiungendolo alla fine dell'elenco esistente di gruppi di controllo del servizio e inserendo il tuo servizio in questo gruppo. Non sono del tutto convinto che questo sia un modo "approvato" per far partire il servizio prima, perché se ci fosse un modo approvato allora tutti lo farebbero e non funzionerebbe più. Ma c'è un suggerimento che i servizi di un gruppo vengono avviati prima dei servizi non in un gruppo.

    Guardare HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Control \ GroupOrderList" e HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder" e fare un po 'di ricerca su Google.

Problemi correlati