Newsgroup: it.comp.programmare.win32
Titolo: Servizio di WatchDog

Ciao a tutti,
   ho scritto un programma che accede a cartelle in rete ed esegue 
operazioni di manutenzione file e cartelle, per evitare che venga chiuso 
e non piï¿œ riaperto (per dimenticanza) ho creato un servizio di windows 
che uso come WatchDog: quando il servizio non vede piï¿œ il programma in 
esecuzione lo rilancia con ShellExecuteEx().
Mi succede perï¿œ che quando il programma viene rilanciato dal servizio 
non accede piï¿œ alle cartelle di rete e nel task manager compare come 
nome utente SYSTEM.
Come posso creare un servizio che possa accedere alla rete o lanciare il 
programma senza farlo diventare SYSTEM?
Grazie.
Fabio.

 programma senza farlo diventare SYSTEM?
Non � banale, comunque parti da CreateProcessAsUser().
-- 
emboliaschizoide.splinder.com

 
Penso che basti che il servizio venga eseguito con un account che abbia 
accesso alla rete.
Quindi da 'servizi' -> 'connessione', anziché 'account di sistema 
locale' metti l'account giusto (nome_pc\nome_utente, oppure .\nome_utente).
Ciao

 locale' metti l'account giusto (nome_pc\nome_utente, oppure .\nome_utente).
Sempre che sia accettabile specificare a mano l'utente da pannello di
controllo; altrimenti si ripresenta la stessa problematica di ottenere il
token di un determinato utente (in questo caso per installare il servizio).
-- 
emboliaschizoide.splinder.com

dalai lamah ha scritto:

_ho provato a creare il servizio specificando negli appositi parametri 
LPCTSTR lpServiceStartName e LPCTSTR lpPassword sia "dominio\utente" che 
".\utente" ma quando tento di attivare il servizio la funzione di 
attivazione ritorna un errore tipo...le credenziali non esistono (ma 
utente e password sono corretti). Con "nomepc\utente" non ho ancora provato.
_CreateProcessAsAser() la sto stdiando, in effetti non � semplice perch� 
bisogna appunto ottenere il token dell'utente che ha acesso ai servizi 
di rete.
Per adesso grazie delle dritte, vi far� sapere.

 Per adesso grazie delle dritte, vi farò sapere.
Se devi farlo da programma, devi anche aggiungere, all'utente che 
utilizzerai, i privilegi di agire come servizio.
Pensavo ti bastasse farlo da pannello di controllo. Se fatto da lì viene 
automaticamente inserito e poi puoi anche disinstallare e reinstallare 
il servizio che funzionerà sempre.
Se ti interessa, posso mandarti del codice che ho trovato e che ho 
adattato allo scopo (e che utilizzo ormai da un bel po').
Ciao

 Ciao
Si mi interessa il codice e ti ringrazio.
Ciao.
Fabio.

 
Te l'ho inviato al tuo indirizzo, spero sia valido.
Ciao.

logicmind ha scritto:

Si, grazie mille! E' arrivato, Lo guardo e ti faccio sapere.
Ciao.
Fabio.

logicmind ha scritto:

Se ho capito bene:
_Installo il servizio utilizzando LPCTSTR lpServiceStartName, LPCTSTR 
lpPassword
_uso addPolicyService(lpServiceStartName, true)
_Start al servizio
corretto?

 corretto?
Si, e per vedere se l'utente è stato aggiunto:
'Criteri di protezione locali' -> 'Criteri locali' -> 'Assegnazione 
diritti utente' -> 'accedi come servizio' e dovresti trovarcelo

 diritti utente' -> 'accedi come servizio' e dovresti trovarcelo
Funziona, creo il servizio e con il tuo codice lo inserisco in "Criteri 
di protezione locali...accedi come servizio".
Se però lo creo utilizzando il flag SERVICE_INTERACTIVE_PROCESS 
restituisce un errore perchè ho letto che:"...the service must run in 
the LocalSystem account" ma se non uso il suddetto flag la GUI non si fa 
vedere ed il mio programma ha una GUI.
Quindi:
_se lo creo come localsystem: posso interagire con la GUI ma non 
accedere alla rete.
_se lo creo come account con i permessi posso accedere alla rete ma non 
posso vedere la GUI.
Quindi devo provare ad utilizzare CreateProcessAsUser() in modo che il 
servizio, che è localsystem, lancia il programma con 
CretateProcessAsUser() e dovrei sia accedere alla rete che vedere la GUI 
del programma eseguito, giusto????
Vorrei evitare di riscrivere l'intero programma come servizio qundi 
volevo trovare una soluzione che mi permettesse di monitorare l'istanza 
del programma e lo rilanciasse in automatico qualora si chiudesse per 
qualsiasi motivo ma se non funziona con CreateProcessAsUser(), con un 
servizio posso al massimo avvertire che il programma è stato chiuso 
oppure utilizzo il codice del servizio ma solo come programma senza GUI.
Che dici?
Ciao.
Fabio.

Fabio ha scritto:

Anche riscrivessi l'intero programma come servizio penso avresti gli 
stessi problemi.
L'approccio normale è che il servizio agisca silente ed un front-end gui 
gli permetta di interagire coll'utente.
Da quel che ho capito, a te non serve che il programma funzioni anche 
senza utente loggato, quindi non ti servirebbe nemmeno avere un servizio.
Usa il tuo WatchDog come un programma normale ed mettilo nel 'run' del 
registry o in 'esecuzione automatica', penso sia la soluzione più 
indolore :-)
Se invece ti va di fare qualche prova, vedi qui:
http://msdn.microsoft.com/en-us/library/ms684859%28VS.85%29.aspx
in particolare la riga dove dice di specificare il nome della Window 
Station nella STARTUPINFO. La Station di default interattiva è 'Winsta0'.
Non mi è ancora capitato di giocherellare con le WindowStation e 
Desktop, anche se ce l'avevo in programma da un po', quindi non so dirti 
né se funziona, né se ci sono 'effetti collaterali' :-)
Ciao

 Ciao
guardo...
Ciao.
Fabio.

 
Guarda che anche il servizio è possibile chiuderlo dal task manager 
(brutalmente) o dallo snap-in dei servizi.
Ho letto da qualche parte che è possibile nascondere le applicazioni in 
modo che non siano visibili, basterebbe googlare un po' ...
Comunque una soluzione potrebbe essere di mettere il WatchDog solo/anche 
nelle operazioni pianificate, lì è meno visibile :-)
Magari lo avvii normalmente allo start-up, pianifichi che venga avviato 
ogni tot; se è già in esecuzione (usi un mutex) esce altrimenti resta 
attivo e fa il suo lavoro.


 attivo e fa il suo lavoro.
Difatti utlizzo i Mutex per il controllo...Cercherò la soluzione più 
elegante.
Grazie per la discussione, per le dritte e per il codice, ho imparato 
parecchie cose nuove.
Ciao.
Fabio.