Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/.NET] Foreground process starten vanuit een wind service

Pagina: 1
Acties:

  • _VpS_
  • Registratie: September 2002
  • Laatst online: 14-04-2023
Ik heb een 3rd party reguliere Windows applicatie die vanuit een scheduler op bepaalde tijdstippen moet worden gestart. De scheduler is een windows service.

Is het uberhaupt mogelijk om een reguliere windows applicatie te starten als er geen user is ingelogd? Zo ja, hoe?
Zo nee, dan is het hele probleem hieronder niet aan de orde, aangezien het hele punt van de windows service is dat ie ook moet draaien zonder dat er een user is ingelogd.

Als ik de applicatie vanuit de service start, draait de applicatie ook als een background process, dus zonder window. Dat vindt het programma om 1 of andere reden niet leuk, en hangt. Als ik dezelfde code (uit de scheduler) daarentegen kopieeer naar een normale windows applicatie draait alles prima.

Is er een manier om het proces te forceren om als foreground applicatie te draaien? M.a.w. is er een manier om na het starten de window alsnog te tonen?

Search results op internet leveren algemene artikelen op, maar niks specifieks.

De code waarmee ik de applicatie start:
C#:
1
2
3
4
5
6
                            
Process myProcess = new Process();
myProcess.StartInfo.FileName = appPath;
myProcess.StartInfo.WorkingDirectory = appPath;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;  
myProcess.Start();

(bb) || !(bb)


  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 19-11 13:44

Spockz

Live and Let Live

Misschien denk ik verkeerd. Maar je kunt je aan events hangen. Dus als je luistert naar een login event, kun je op dat moment het scherm tonen. Dan kun je dus gewoon een service blijven draaien.

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


  • _VpS_
  • Registratie: September 2002
  • Laatst online: 14-04-2023
De service blijft normaal draaien, dat is het probleem niet. Maar de applicatie die door de service wordt gestart blijft hangen, omdat ie dan als een background proces draait.

(bb) || !(bb)


Verwijderd

Ja dit kan. Heb het net aan de praat gekregen in C# met een heleboel platform invokes.

Wil je dat dit onder Vista werkt, en dat moet je willen, dan moet je de Windows applicatie starten in een user session. Services draaien in een, je raadt het al, services session. Deze laatste is session 0. User sessions beginnen bij 1.

Je kunt, als je wilt, een programma starten als er geen gebruiker is ingelogd. Deze kan zelfs weergegeven worden op het scherm over het inlogvenster heen. Maar ik denk niet dat dit de bedoeling is.

Services draaien bovendien onder SYSTEM. Als een service een programma start krijgt deze dezelfde token mee en draait dus ook onder SYSTEM. Het wordt echter sterk afgeraden om gewone Windows applicaties onder gebruikersnaam SYSTEM te draaien omdat SYSTEM heer en meester is op het systeem en dit dus risico's met zich meebrengt.

Ik ga je geen code geven, wel een duw in de goede richting en als je dan specifieke vragen hebt dan horen we het wel.

Je moet in je service het SessionLogon event afvangen. Met WTSQueryUserToken (zie MSDN) kun je van die user session de token pakken. In deze token zit de gebruiker die in die sessie is ingelogd en de juiste sessie ID. Je kunt dan met CreateEnvironmentBlock en dan CreateProcessAsUser een proces starten in de goede sessie met de juiste rechten, precies op het moment dat er een gebruiker aanmeldt. Zie MSDN voor de functie beschrijvingen. Over platform invoke wordt ook voldoende uitgelegd op internet.

  • _VpS_
  • Registratie: September 2002
  • Laatst online: 14-04-2023
Thanks voor de aanwijzingen. Ik kijk er z.s.m. naar.

(bb) || !(bb)


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik twijfel toch. Het feit dat één applicatie werkt betekent absoluut niet dat een ander werkt. De opmerking over sessions is vrij correct, die van de useraccount minder (Services hoeven niet als SYSTEM te draaien; er zijn meerdere svchost.exe processen).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

MSalters schreef op dinsdag 23 oktober 2007 @ 22:17:
Ik twijfel toch. Het feit dat één applicatie werkt betekent absoluut niet dat een ander werkt.
Wat wil je daarmee zeggen?
MSalters schreef op dinsdag 23 oktober 2007 @ 22:17:
De opmerking over sessions is vrij correct, die van de useraccount minder (Services hoeven niet als SYSTEM te draaien; er zijn meerdere svchost.exe processen).
Klopt helemaal. Je hebt in dit geval alleen vrij weinig aan services die onder gebruikersaccounts draaien, omdat je voor CreateProcessAsUser privileges nodig hebt die SYSTEM standaard heeft. Zonder je local security policy aan te passen werkt het hele verhaal dan niet, vandaar SYSTEM. Bovendien is het aangeraden om in een user session programma's te starten met de user token, vandaar WTSQueryUserToken. En je raadt het al: WTSQueryUserToken kan je alleen aanroepen als SYSTEM.
Pagina: 1