Anonymní profil Mirek – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Mirek – Programujte.comAnonymní profil Mirek – Programujte.com

 

Příspěvky odeslané z IP adresy 90.178.132.–

Mirek
.NET › C# windows service a spouště…
20. 6. 2010   #130469

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

Mirek
.NET › C# windows service a spouště…
20. 6. 2010   #130464

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

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý