Problema di "utente?" all'avvio del programma

lunedì 08 agosto 2011 - 09.17
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows Server 2008 R2  |  Visual Studio 2008  |  SQL Server 2008

vimmo Profilo | Newbie

Buongiorno a tutti, ho questo problema:
Ho un programma che si avvia automaticamente all'avvio di windows, per test attualmente è installato su un windows server 2008r2 x64.
quando si avvia mi da un errore dicendo che un file (quello contenente il log) non è accessibile o non esiste.
Se chiudo e riapro il programma funziona tutto correttamente.
ho controllato che le cartelle contenenti i files abbiamo i permessi a everyone (full control) ma anche così niente da fare...
In più quando disconnetto l'utente dal server il programma si chiude... come potrei evitare tutto questo?
grazie in anticipo per l'aiuto!

u235 Profilo | Junior Member

credo che in questo caso dovresti creare un servizio di windows, ma bisognerebbe vedere perchè ti serve senza l'interazione dell'utente (visto che ti serve anche alla disconnessione di quest'ultimo) e che ruolo deve avere, a limite in wpf potresti fare l'interfaccia che modifica il config del servizio, oppure prevedere qualcosa nel codice che indirettamente permetta modifiche. poi per il file di log credo il problema risieda nel fatto che sta in una cartella utente.

vimmo Profilo | Newbie

il programma esegue a intervalli regolari query su database e invio/lettura di file da fonte ftp.
Ha bisogno di intervento dell'utente solo per compilare i parametri di funzionamento e eventualmente lanciare i procetti di lettura manualmente.
eventualmente il programma può essere convertito a servizio?
adesso è una applicazione winForms, non è possibile trovare una soluzione senza riscrivere tutto?

u235 Profilo | Junior Member

il servizio di windows ha la funzione di avviarsi e restare attivo anche senza l'acesso da parte dell'utente (lo avvia localSystem se non ricordo male), infatti per questo in genere viene creato un file di configurazione per leggere eventuali valori di avvio. Nel tuo caso, senza l'accesso da parte di un utente, non si avvia il programma, non sai a priori quali dati ftp devono essere immessi (almeno così mi sembra di capire), ma sopratutto quando disconnetti l'utente, i programmi avviati da lui si chiudono.
in teoria dovresti creare un servizio che avvia la comunicazione con ftp attraverso (per esempio) un timer che legge e controlla un determinato file che contiene le impostazioni, questo averrebe anche se il tuo utente non è connesso, quindi potresti lasciar avviare il servizio, questo controlla che i parametri nel file ci siano, se ci sono lavora, se no non fa nulla e continua a controllare (tramite timer), quando l'utente accede e imposta il file, il servizio incomincerà a leggere i dati del file, a questo punto in teoria, il servizio continua a lavorare (con gli ultimi parametri letti nel file) anche senza che l'utente sia connesso.

il fatto di convertirlo o riscriverlo è relativo, diciamo che gran parte la puoi recuperare, devi modificare il modo in cui trasmetti l'imput dell'utente (deve passare attraverso file che legge il servizio e a limite creare un interfaccia grafica per modificarlo) e fare in modo, che se non c'è il parametro (ad esempio l'indirizzo ftp) il servizio sia dormiente, ma appena scatta il timer e lo trova incomincia a lavorare...

P.S.
io prima ho menzionato wpf, ma non ha nulla a che vedere con il servizio. L'interfaccia grafica per modificare il file può essere fatta in qualsiasi modo si voglia... anche web eventualmente!

vimmo Profilo | Newbie

ok capisco, la mia domanda è questa:
io ho il mio programma completo che si avvia, controlla se ci sono i parametri scritti in un file xml di configurazione, e se li trova avvia i suoi cicli di controllo altrimenti sta li...
Per quello che ho capito dovrebbe funzionare anche come servizio quindi, e potrei sfruttare la form che ho già per modificare i parametri (come peraltro già uso...
a questo punto cosa mi manca per "far diventare" il mio programma un servizio?
grazie delle risposte!

u235 Profilo | Junior Member

la classe deve derivare da System.ServiceProcess.ServiceBase, non deve lanciare interfacce grafiche, dovrebbe fare l'override dei metodi OnStart e OnStop, e dovresti creare un setup che ti installa il servizio tra i servizi di windows.

se hai bisogno di una mano, sono qui

vimmo Profilo | Newbie

mi ci sto mettendo subito, vedo cosa riesco a fare intanto, ti chiedo se ho bisogno!
già è venuta fuori una cosa: mi dice che essendo un servizio non lo posso debuggare?! c'è un modo specifico per farlo?

u235 Profilo | Junior Member

ciao,
si è diverso, devi connetterti al processo.
menù :
debug->processi->mostra processi di sistema->seleziona nome del processo->connetti

qui trovi spiegazioni in italiano :

http://msdn.microsoft.com/it-it/library/7a50syb3(v=vs.80).aspx

vimmo Profilo | Newbie

la pagina l'avevo già vista, solo che non riesco... vedo il servizio che si chiama app.vshost.exe lo seleziono e mi dice impossibile collegarsi un debugger è già connesso... poi qualcosa parte, ho un punto di interruzione in OnStart() ma non ci passa mai...
forse c'è qualche passo intermedio che non ho fatto?

u235 Profilo | Junior Member

lo hai installato? il servizio va installato nel sistema, poi ti connetti al servizio lanciato dal sistema.

vimmo Profilo | Newbie

ho seguito questo
http://msdn.microsoft.com/it-it/library/zt39148a%28v=vs.80%29.aspx
qualcosa sicuramente avrò sbagliato perchè installo il servizio, vado in gestione servizi da strumenti di amministrazione e lo avvio,
sembra che vada tutto bene poi quando provo a collegarmici da vs mi da quell'errore che ti dicevo prima,
dove posso controllare per darti qualche info in più? è la prima volta che ho a che fare con i servizi, non so cosa fare ho guardato qua e la tra le proprietà ma è un mondo nuovo per me

u235 Profilo | Junior Member

se per errore intendi dire che non passa nell'OnStart(), dovresti considerare il fatto che in quel metodo è già passato prima che tu possa connetterti al servizio.
non preoccuparti, è normale entrando in un mondo nuovo...

mi spiego meglio :
1) installi il servizio
2) avvi il servizio (qui passa dentro OnStart, ma tu non hai ancora il debugger collegato)
3) ti connetti al processo

ora se è necessario fare "debug" in OnStart, metti un gestore di errore che scrive nel log, in modo che se c'è qualche problema li, lo vedi nel log, diversamente la vedo dura!

è un modo un po diverso (e anche un po noioso) di operare, ma purtroppo credo che non ci sia altro modo.

vimmo Profilo | Newbie

ti ringrazio veramente per la pazienza!
ripartendo da principio io avevo la mia applicazione winform "convertendola" ho iniziato a sistemare le cose che facevo nella on load della form in on start()

mi spieghi meglio questa parte: metti un gestore di errore che scrive nel log, visto che nella on start c'è l'inizializzazione dei parametri vorrei sapere se è tutto apposto...

per il resto dell'applicazione i punti di interruzione dovrebbero andare vero?

Poi perchè quando collego il servizio mi dice che c'è già un gestore collegato?

E' normale che il nome del mio servizio (tra quelli da collegare) sia miaapp.vshost.exe?

u235 Profilo | Junior Member

per la pazienza, è il minimo, credo che se una persona si prenda "l'impergno" di aiutare qualcuno, debba per forza avere pazienza... salvo quando lo si fa solo per farsi notare... e poi tu mi sembri uno che capisce e cerca di capire! (scusa il gioco di parole)

se guardi l'esempio che stavi seguendo nel link di prima, metti il tuo codice in blocchi try/catch

try
{
...tuo codice
}
catch (Exception e)
{
eventLog1.WriteEntry(e.Message);
}

in questo modo dovresti vedere la descrizione di un eventuale errore nel visualizzatore eventi di gestione computer.

il resto dei punti di interruzione dovrebbero andare, a condizione chè :
1) arresti il servizio precedentemente avviato
2)lo disinstalli dal sistema
3) installi il nuovo
4) lo avvi
5) ti colleghi a quel processo*

*il processo NON é "miaapp.vshost.exe" ma dovrebbe essere "miaapp.exe", ma questo non lo ricordo bene, se aspetti un pò ho quasi finito di installare visual studio. Perdonami ma devo anche io rinfrescarmi la memoria, è da un po che non ci lavoro sopra :)

vimmo Profilo | Newbie

Ti ringrazio ancora tantissimo!
Allora, mentre aspettavo la tua risposta mi è venuto in mente l'eventviewer visto che mi aveva dato qualche errore in precedenza allora sono andato a vedere che diceva:
uno degli errori era che non riusciva ad accedere a un mio file cercandolo però nella cartella c:\system\win32 allora cono andato a cambiare i percorsi nel codice che con winForm usavo Environment.CurrentDirectory e ho messo quello giusto.

disinstallato, reinstallato e il servizio non si avviava più torno nell'event viewer vedo che l'errore adesso e sui permessi d'accesso ma della cartella giusta :) assegno i permessi e riavvio il servizio.

Alla luce di questo messaggio di errore mi viene in mente che ho messo che si installasse con Account Local service (non sarà un po poco? meglio network?) quindi mi ricordo nella maschera per il collegamento al processo il flag mostra processi per tutti gli utenti lo flaggo e mi compare li mi collego, zero errori, e dopo un po si ferma nel mio punto di interruzione :)

userò il tuo consiglio sull'event log per capirci meglio mettendolo un po ovunque e essendo certo che tutto continui a funzionare.
Sono speranzoso in quanto il programma prima funzionava alla perfezione, allo stadio finale pronto se non fosse per il problema che rimaneva legato all'utente.

Ora praticamente non ho cambiato "nulla" del codice scritto in precedenza quindi.... potrebbe andare senza troppi problemi?

Non so come ringraziarti non sapevo dove sbattere la testa e non avevo mai fatto un servizio windows fino a stamattina. Il mio capo mi avrebbe sparato :)


u235 Profilo | Junior Member

li devi vedere un po tu, quello che fa il codice, il discorso dei permessi ecc.. comunque si tratta solo di adattarlo, ci lavori un pò su fai prove... stai tranquillo che riesci. se poi ci sono dei problemi vedi (magari con i log) che tipo di problemi sono, se hai bisogno sono qui (dove posso arrivare, senza presunzione!)

mi hai già ringraziato, e poi serve anche a me come allenamento!
ora hai un piccolo bagaglio di esperienza in più... PER PARARE LE PALLOTTOLE sparate dai capi (un po ti invidio... attualmente sono disoccupato... sai agosto... brutto mese per il lavoro...)!

ciao. :)

vimmo Profilo | Newbie

mi dispiace davvero tanto, vorrei contattarti in privato ma non riesco dal pannellino, forse posso esserti d'aiuto anche io :)
appena riesco a mandarti un messaggio privato ti lascio la mail o se riesci a mandarmi la tua vorrei proporti una cosa :)

u235 Profilo | Junior Member

adesso sono io che devo ringraziare te!
ho modificato il mio nome, guarda nel mio profilo.

vimmo Profilo | Newbie

ti ho scritto :)

u235 Profilo | Junior Member

arrivata e risposto, grazie ancora :)

spero di poterti essere utile ancora.
ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5