Lancio processi da Window Service ;-(

mercoledì 17 dicembre 2008 - 11.58

ysdemarc Profilo | Expert

Ciao a tutti..so che qui non è il posto idele per questo messagigo ma non ho visto la sezione adatta.

Ho creato un servizio windows che monitora i file .bat una directory..

appena viene creato un nuovo file o modificato questa applicazione dovrebbe lanciarlo.

ho fatto questa prova:

gli eventi created, renamed e modified dell'oggetto FileSystemWatcher

private void LanciaBatch(string filename)
{
if (File.Exists(filename))
{
Process.Start(filename);
}
}


nella directory che monitoro ho messo un semplice file .bat con all'interno la riga "notepad.exe"

ora succede che lui riesce a lanciare il .bat e nel taskk manager vedo il nuovo processo notepad.exe con 0 di cpu ma non vedo la finestra.

ho provato a fare anche una semplice applicazione che scrive "ciao" in un file di testo.

se ci faccio doppio clic, funziona e scrive il file..se inserisco la riga di comando nel file .bat nella direcory monitorata, non succede nulla ..

cosa sbaglio?

la stessa istruzione epr lanciare un processo mi funziona ad un'applicazione windows form.. perchè qui no, e come posso ovviare?

Vincenzo
Programmatore sbilenco

19018 Profilo | Expert

Non ti solleva nessuna eccezione??
forse è un problema di permessi...non mi viene altro in mente adesso che possa causarti questo problema.

ciao
Stefano Passatordi

http://blogs.dotnethell.it/stem/

ysdemarc Profilo | Expert

no..nessuna eccezione..

ho provato a cambaire la routine precedente in

private void LanciaBatch(string filename)
{
if (File.Exists(filename))
{
Process p = new Process();
p.StartInfo.FileName = filename;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.Start();
}
}

la cosa strana è che il processo nel task manager lo vedo solo nella scheda processi e non in applicazioni e tra l'altro se cerco di terminare il processo manualmente mi dice accesso negato, anche se interrompo il servizio e lo disistallo.. niente da fare...

e poi mi rimane anche in processi il comando cmd.exe sempre con l'impossibilità di eliminarlo..

nel pc dove lavoro ho i privilegi di amministrazione...

non so proprio dove sbattere la testa...
Vincenzo
Programmatore sbilenco

19018 Profilo | Expert

prova con
StartInfo.CreateNoWindow = false;

ciao
Stefano Passatordi

http://blogs.dotnethell.it/stem/

ysdemarc Profilo | Expert

niente da fare..non cambia nulla..

leggevo questo articolo però: http://bytes.com/groups/net-c/237206-process-start-windows-service

nel mio scarso inglese mi par di capire che la process lancia il programma secondo la sua visibilità in parole poco ortodosse..

ma non riesco a capire allora quale possa essere la soluzione


Vincenzo
Programmatore sbilenco

19018 Profilo | Expert

Ecco la soluzione che funziona :

"This because the Service runs in the context of a non interactive desktop,
if you start another process froms this parent process, the child will run
in the same non visible desktop.

What you could do (but I hate the idea because it opens a security hole as
big as the Ozon hole), is to set the service to interact with the desktop."

rendi il servizio capace di interagire con il desktop :

1. Start from the Computer Management console. (My Computer -- right click --> Manage)
2. Find your service under the "Services" node.
3. Right click and go to Properties.
4. At the Log On tab, check the box "Allow Service to Interact with Desktop" and Apply
5. Restart Service

ciao

Stefano Passatordi

http://blogs.dotnethell.it/stem/

ysdemarc Profilo | Expert

sinceramente non ci capisco nulla..tra l'altro non lo vedo nella lista dei servizi anche se viene avviato normalmente con windows e col net start...
e stoppato tranquillamente con net stop..

leggevo che le cose si possono cambaiore con il ServiceController inpostando la prorpieta ServiceType a InteractiveProcess..

ma dove la imposto? e come uso la Start? non trovo alcun esempio in merito.

cmq...in parte risolto il problema..quello di lanciare il bat che a sua volta lancia un eseguibile che scrive il file mi va bene ora, il problema era nello spazio di una directory..

però non capisco perchè anche se il programma termina nel task manager mi rimane il processo cmd.exe..
e come lo elimino? dal bat come faccio a capire che l'eseguibile è cambiato?
Vincenzo
Programmatore sbilenco

ysdemarc Profilo | Expert

ok..perfetto..molto bovinamente cercavo nel nome il nameservice..invece era la descizione..

per cui allego immagine di come settarlo:

736x538 82Kb


e udite udite..anche i processi lanciati terminano normalmente e non ne rimane nessuno appeso..

ma un'ulteriore domanda prima di accettare la risposta..

è possibile settare questa prorpietà perdefault del servizio in fase di avvio o istallazione?
Vincenzo
Programmatore sbilenco

19018 Profilo | Expert

Prova questo -> http://www.codeproject.com/KB/install/cswindowsservicedesktop.aspx

ciao
Stefano Passatordi

http://blogs.dotnethell.it/stem/

ysdemarc Profilo | Expert

che dire..non perfetto ma perfettissimo...

grazie mille..mi sei stati di enorme aiuto.. sono in debito..

ciao
Vincenzo
Programmatore sbilenco
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5