2019. dec. 12.

startRealHidden

Évekig rendszergazda voltam egy Internet Kávézóban, és egy napon úgy esett, hogy szükségem volt arra, hogy meglévő ablakos/konzolos alkalmazásokat teljesen rejtetten indítsak. Az is megeshetett, hogy ezek az alkalmazások futásuk során új ablakokat nyitottak még fel, és ezeknek se volt szabad megjelenniük.
Erre kész megoldást nem találtam.

Létezik egy Desktops nevű virtuális asztal kezelő Windowsra, ami működésében jelentősen eltér a többi virtuális asztal kezelőtől, márpedig abban, hogy nem úgy működik, hogy egyszerűen elrejti/megjeleníti az ablakokat, hanem ténylegesen külön Desktop-okon futnak az alkalmazások. Ez egy nem széles körben ismert fogalom, így nem mond sokat szerintem senkinek, de mindjárt kifejtem.
Ezek a Desktop-ok teljesen átjárhatatlan asztalok, és így a Desktops alkalmazásnak hátránya is van, mert nem lehet ablakokat mozgatni Desktop-ok közt, valamint például nem lehet 2 Desktop-on is egy-egy Firefox, mert a második nem indul el azzal a felkiáltással, hogy már már fut belőle egy, akivel nem tud kommunikálni.
(Igen, tudom, hogy különböző fx profilokat igen is el lehet indítani a 2 külön Desktop-on.)
Szokványos virtuális asztal kezelőknél egy új ablak mindig az aktuális asztalon jelenik meg, míg a Desktops esetén mindig ott jelenik meg, ahol az őt indító van.
Az UAC is egy ilyen Desktop-ot hoz létre mikor besötétíti a képernyőt, és megjeleníti azt az ablakot:
uac3
Ez miért jó az UAC-nak?
A gonosz programok általában szeretnének rendszergazdaként futni. Ehhez át kell magukat küzdeni egy ilyen megerősítőablakon. Ha ezt a megerősítőablakot meg tudnák kerülni, akkor megkerülnék. Egy futó programból nagyon egyszerű egy adott gomb fölé mozgatni az egeret, és kattintani egyet. Az UAC készítői természetesen gondoltak erre, és ha fel kell dobniuk egy ilyen ablakot, akkor csinálnak egy képernyőképet az asztalról, és aztán átváltanak egy másik Desktop-ra, ahol megjelenítik a korábban készült képet, és ezt az ablakot. A Desktop-ok átjárhatatlansága miatt a gonosz program nem tud az UAC által létrehozott Desktop-on egérmozgást programból előidézni. (Valamint azt hiszem, hogy másik user alatt is fut az UAC ablak.)

Térjünk is vissza az eredeti témánkra: Szóval szükségem volt valamire, ami rejtettem el tud indítani csúnya fekete ablakokat (vagy bármit).
Az általam készített megoldás a startRealHidden.
A startRealHidden a Desktops módszerét használja fel, és egy külön Desktopon indítja el a kívánt alkalmazást, amely így egyáltalán nem jelenik meg, és az általa indított dolgok se.
A lelke a dolognak (C#):
namespace startRealHidden
{
    class Program
    {
        static void Main(string[] args)
        {
            Desktop desktop = Desktop.CreateDesktop("myDesktop");
            Process p = desktop.CreateProcess(String.Join(" ", args));            
            p.WaitForExit();
        }
    }
}

A Desktop osztályt itt találhatjátok: http://www.codeproject.com/Articles/7666/Desktop-Switching

Használat: startRealHidden spawnBunchOfWindowsThatGoAwayOnTheirOwn.bat arg1 arg2 arg3

Egy jelentős limitáció van, és az az, hogy nem lehet egér/billentyűzet interakciót szimulálni nem aktív Desktop-on, tehát mondjuk egy interakciót szimuláló AutoIt szkript nem fog menni rejtetten.

Projekt letöltése