Newsgroup: it.comp.programmare.win32
Titolo: problema con servizi windows

Cia a tutti.
Di recente ho trasformato un mio programmino in un servizio di windows,
mentre prima, al suo avvio, nascondeva la sua shell.
L'ho fatto in modo che il programma venga avviato senza dover fare il login
sulla macchina (WIN-NT 4 sp6 server).
Ho però alcuni grossi problemi.
Il programma tiene sotto controllo e riavvia in automatico alcuni processi,
ma, quando gira come servizio:
 - non rileva messaggi di errore come "Exception caught",
  e comunque non riesce a killare il processo di quella finestra
(uso TerminateProcess, che restituisce 0, come se avesse terminato
correttamente il processo).
- se lo avvio con l'account per i servizi,
  i processi avviati dal mio programma non possono essere killati da
administrator e viceversa.
- se avvio un processo che ha una shell, questa non compare...
Qualcuno sa aiutarmi?
Magari devo avviare il servizio con qualche accorgimento particolare...
Poi se vi servono altri dettagli...
Mille grazie.
bye ;-)

 - se avvio un processo che ha una shell, questa non compare...
come lo avvii detto processo?
-- 
ciao, hal

 > - se avvio un processo che ha una shell, questa non compare...
per forza, dovrebbe comparire sul desktop dell'utente SYSTEM, non su
quello dell'utente attualmente loggato.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 quello dell'utente attualmente loggato.
e io cosa ho detto?
-- 
ciao, hal

 e io cosa ho detto?
su quel punto nulla, avevi solo chiesto una cosa che non c'entrava niente
(rileggi bene; o sei cieco tu olo sono io, e in tal caso me ne scuso).


 (rileggi bene; o sei cieco tu olo sono io, e in tal caso me ne scuso).
Ricopiato:
| i processi avviati dal mio programma non possono essere
| killati da administrator e viceversa.
La domanda che mi e` venuta spontanea e` stata: come fa un utente
non amministratore a killare un processo che gira con altri diritti?
Quello che invece mi chiedo (perche` non so rispondere) e`:
Se l'utente e` amministratore perche` non puo` fermare
un processo qualsiasi?
-- 
ciao, hal

 un processo qualsiasi?
mancanza di permessi?


 mancanza di permessi?
-- 
ciao, hal

 > mancanza di permessi?
l'ho scritto a proposito di un altro punto; ti prego di rileggere, non
credo di sbagliarmi.


 una funzione come CreateProcessAsUser, dico bene?
Almeno cosi' scrive MSDN a proposito degli "Interactive
Services":
http://msdn.microsoft.com/library/en-us/dllproc/base/interactive_services.aspServices
In questo caso non ho esperienza diretta perche` finora
ho  scritto solo  servizi che  funzionano in background,
evitandomi, immagino, un po' di rogne con l'interazione
con l'utente.
Intanto ti ringrazio della chiacchierata, eventualmente
riprendiamo domani sera.
-- 
ciao, hal


esatto, e credo che succeda la stessa cosa anche per le dialog box,
anche se non mi spiego perchè, cmq, compaiono a schermo,
e posso cliccare sull'OK per chiuderle.
Ora ho intenzione di provare gli "Interactive Services": spero che
funzionino.
trovo qualcosa, vi faccio sapere.
Vi ringrazio già da ora per i vostri interventi.
bye ;-)


 trovo qualcosa, vi faccio sapere.
ho provato a rendere il servizio interattivo:
per farlo ho dovuto impostare l'account SYSTEM.
Il tutto però non è servito, in quanto il servizio continua a non killare il
processo
con la finestra di exception caught, che, fra l'altro, non posso far uscire
a piacimento per i miei test.
L'unico modo in cui tutto funziona, e ha sempre funzionato,
è quello di usare il programma _normalmente_ (nascondo la shell con
FreeConsole()).
posso avviare il programma allo startup, ma questo non avviene fin quando
l'utente non si logga.
Ecco perchè avrei strettamente bisogno di usare un servizio.
Se può servire, questa è la funzione che uso per far partire un processo,
in pratica è l'esempio di MSDN:
<CODE>
int start_process (char * res,char * cmd,char * path) {
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
       // Start the child process.
    if( !CreateProcess( NULL, // No module name (use command line).
        cmd, // Command line.
        NULL,             // Process handle not inheritable.
        NULL,             // Thread handle not inheritable.
        FALSE,            // Set handle inheritance to FALSE.
        0,                // No creation flags.
        NULL,             // Use parent's environment block.
        path,             // path  directory -> NULL padre
        &si,              // Pointer to STARTUPINFO structure.
        &pi )             // Pointer to PROCESS_INFORMATION structure.
    )
    {
        sprintf(res,"Errore %d nell'avvio del processo
'%s'\r\n",GetLastError(),cmd);
    }
    else {
    sprintf(res,"Processo %s avviato con PID %u. \r\n",cmd,pi.dwProcessId);
    }
    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    return 0;
}
</CODE>
Non so se possa essere utile cambiare environment block,
ma eventualmente cosa dovrei metterci?
non ho ben capito quello che dice MSDN.
grazie ancora per l'attenzione.
ciao

 ha scritto nel messaggio 
news:422c43bd$0$32352$5fc...@news.tiscali.it...

Se specifichi il motivo per cui devi killare un processo forse ci possono 
essere altre soluzioni.
Il processo è una tua applicazione o una qualsiasi?
Se è una tua applicazione potresti creare una window nel servizio (che rendi 
interattivo col deskop) e ci comunichi tramite semplici msg, oppure puoi 
usare una connessione tcp/ip o altro metodo.
Se non è una tua applicazione
1) perché devi terminarla?
2) non basta il task manager? 

 2) non basta il task manager?
no, perchè non sto davanti alla macchina:
il mio programma deve "capire" se un processo fra quelli che controlla è
bloccato,
ed eventualmente lo deve killare, e far ripartire.
tutto questo lo fa già benissimo se lo lancio allo startup o a "manina".
se invece parte come servizio, non riesce a "vedere" le finestre di
errore...

"svetj" <sve...@SPAMtiscali.it> ha scritto nel messaggio 
news:422d5d91$0$6310$5fc...@news.tiscali.it...

Se fai una ricerca sul msdn (ricerca solo nei titoli) trovi questo capitolo
'Interacting with the User in a Service'
dove è spiegato come entrare nel desktop interattivo. Non so se possa 
aiutarti.
Penso basterebbe rendere interattivo il servizio.
Nel resource kit dovrebbe esserci anche una utility a riga di comando 'kill' 
che dovrebbe acquisire tutti i diritti necessari a terminare qualunque 
processo.
Ricerca, sempre nei titoli,
'Cannot End Service Processes with Task Manager'
Però se l'applicazione non è un servizio cosa ti cambia avviare la tua non 
come servizio ma normalmente?
La metti in HKLM\Software\Microsoft\Windows\CurrentVersion\Run.
P.S. potresti creare l'applicazione/servizio come gui anziché consolle, poi, 
se non ti serve, non crei nessuna window. Non saresti obbligato a nascondere 
la consolle all'avvio.

prova con questo:
http://www.alexfedotov.com/articles/killproc.asp
 


era stato il rpomo tentativo, ma freeconsole è molto + semplice per le mie
conoscenze..
Ora cmq faccio qualche altra prova, e ti faccio sapere...


Mille grazie: ho provato il codice di questo articolo, e fa proprio al caso
mio.
In ogni caso, per ora ho rinuzniato ad usare il mio programma come servizio,
perchè non risco a "vedere" le finestre visualizzate a schermo...
bye ;-)