Zdravím všechny,
potřeboval bych pomoct s následující záludností:
mám v C# naprogramovanou službu (windows service), která má za úkol instalovat na počítač software třetích stran. Problém je v tom, že instalátory některých softwarů mají tendenci v některých výjimečných situacích zobrazit nějaké GUI, přestože jsou spuštěny s volbou "/VERYSILENT" apod. (tedy za normálních okolností se instalují bez GUI).
Ta "výjimečná situace" může vypadat třeba tak, že se instaluje doplněk do Firefoxu - pokud Firefox neběží, doplněk se správně nainstaluje a žádné GUI nezobrazí. Pokud ale Firefox běží, zobrazí okno, že FF má být nejprve ukončen.
Problém je v tom, že proces spuštěný z Windows service nemá právo žádné GUI zobrazit a když se o to pokusí, dojde k té nejhorší možné variantě reakce - proces se ani neukončí s chybovou hláškou, ani nezhavaruje, ale prostě zamrzne.
Asi pochopíte, že je nereálné vychytat všechny podmínky, za kterých by instalátor mohl chtít nějaké GUI zobrazit, a předejít jim. Potřeboval bych teda nějak docílit, aby se proces, který chce GUI zobrazit, zachoval jakýmkoli jiným způsobem, než aby zamrzl.
V programování pro Windows nejsem zběhlý, normálně se věnuju spíš unixům, takže za jakoukoli radu nebo postrčení správným směrem bych byl velmi vděčný...
(podotýkám, že povolit službě "interakci s desktopem" není řešení, protože instalace se může spustit i v době, kdy nikdo není přihlášený, nehledě na bezpečnostní riziko a obtěžování uživatelů hláškami, kterým nebudou rozumět)
Pokud neexistuje žádný regulerní způsob, jak toho dosáhnout, byl bych vděčný i za tipy na nějaké hacky, které by v dané situaci byly funkční... (ten nejhloupější, který mě napadá, je dát procesu "časový limit", za který se buď nainstaluje, nebo bude sestřelen... - ale doufám, že by mohl existovat i nějaký chytřejší způsob typu zahákování nějakého systémového volání nebo tak něco)
předem díky moc za jakékoliv rady, popostrčení, inspiraci
Mirek
Fórum › .NET
C# windows service a spouštění procesů s potlačením GUI
Ještě doplnění:
Co jsem tak vygooglil, tak Windows Vista a 7 mají pro interaktivní služby vyčleněný "samostatný desktop" (Session 0). Služba UI0Detect pak umí detekovat okna, která se tam objeví a upozornit na ně uživatele.
Jak to funguje na Windows XP, jsem se nějak nedozvěděl. (když služba nemá povoleno interagovat s desktopem a přesto se o to snaží, tak prostě zamrzne).
Šlo by teda udělat nějaký podobný hack jako má UI0Detect? - tj. přihákovat se na událost vytvoření okna a v případě, že se jedná o proces suštěný mojí službou, ho zabít...?? Nějak takhle:
this DLL provides just a standard run-of-the-mill systemwide hook routine, whose callback will be notified for each new window on the desktop
http://www.alex-ionescu.com/?p=60
Pokud by to šlo, můžete někdo prosím naznačit, jak na to? Jak jsem řekl - s programováním pro Windows bohužel nemám zkušenosti...
díky
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vypínání a spouštění procesů — založil jenoc
Flask - Spouštění procesů, stdout a OS buffery — založil Doomista
Win 7 - princip procesu spouštění systému — založil Sakalik
Windows service pack 2 — založil
Windows Service memory leak — založil hlucheucho
Moderátoři diskuze