Jak zabíjet Windows Update

C# .NET Pro pokročilé Jak zabíjet Windows Update

Pokud jste vlastníky operačního systému Windows, určitě se vám již několikrát stalo, že se počítač restartoval s hláškou "Aktualizace byly úspěšně nainstalovány". V prvních chvílích panika a strašný agresivní řev. Poté přemýšlení co jsem měl otevřené, o co jsem přišel.

No, jelikož jsme počítačový znalci tak si vytvoříme program, který nám bude daný proces kontrolovat a zabíjet.

Vytvoříme si nový projekt a zvolíme konzolová aplikace.

Přidáme novou třídu (klepnutí na projekt pravým myšítkem -> add -> class) například ProcessManager.

Vytvoří se nám nový soubor, kde je název třídy. Přidáme privátní proměnnou _process typu String a konstruktor, kde proměnnou nastavíme.

class ProcessManager
{
    private String _process;

    public ProcessManager(String process)
    {
        _process = process;
    }
}

Nyní vytvoříme metodu, která najde všechny instance zadaného procesu a pozabíjí je.

private void killProcess()
{
     Process[] all = Process.GetProcessesByName(_process);

     foreach (Process p in all)
     {
         p.Kill();
     }
}

Určitě by to chtělo, aby se existence instancí procesu stále kontrolovala - vytvoříme si timer.
Modifikujeme konstruktor přidáním těchto řádků.

public ProcessManager(String process)
{
     _process = process;

     Timer timer = new Timer(10000);// vytvoření timeru s intervalem 10000 milisekund

     timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);// přidání eventu, který zavolá metodu timer_Elepsed při každém tzv. ticku (při každém dosažení zadaného intervalu)

     timer.Enabled = true;//spustíme timer

     this.killProcess();// a zavoláme metodu kill process aby při spuštění programu zkontrolovala běžící procesy ihned a nečekalo se na tick
}

Nyní je tedy třeba přidat onen event. Každý event obsahuje object sender (informace o objektu, který event vyvolal) a daný Event e.

private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
     this.killProcess();
}

Můžeme si také nechat vypisovat kolikrát již byl daný proces zabit.
Přidáme proměnnou _count.

private int _count = 0;

A pod příkaz p.Kill() přidáme řádek s výpisem a inkrementací.

Console.WriteLine(_process + " killed (" + ++_count + ")");

Pozn. ++i inkrementuje proměnnou před použitím; i++ umožní použít proměnnou a poté ji inkrementuje.

Raději přikládám celý zdrojový kód třídy:

class ProcessManager
{
        private String _process;
        private int _count = 0;

        public ProcessManager(String process)
        {
                _process = process;
                Timer timer = new Timer(10000);
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Enabled = true;

                this.killProcess();
        }

        private void killProcess()
        {
                Process[] all = Process.GetProcessesByName(_process);

                foreach (Process p in all)
                {
                        p.Kill();
                        Console.WriteLine(_process + " killed (" + ++_count + ")");
                }
        }

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
                this.killProcess();
        }
}

No a teď nezbývá než náš výtvor vyzkoušet.

Jednoduše do metody Main (v Program.cs) vytvoříme instanci této třídy s daným jménem procesu.

static void Main(string[] args)
{
     new ProcessManager("wuauclt");
     Console.Read();
}

"wuauclt" je název procesu aktualizací, toho který otravně vyskakuje s žádostí o restart a toho který mne přinutil napsat si program a tento článek zabývající se jeho likvidací :D

Ovšem vy si zatím program ozkoušejte například na "notepad".

Hodně úsměvu při příštích aktualizacích ;)


 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.54.54.54.54.5


 


Miniatura
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Špiónská aplikace v C# - 1. díl

 

 

Komentáře

Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Drahomír Hanák:

Moc pěkné, ale možná by byla jednodušší cesta přes Ovládací panely a tam zakázat Windows Update :)

 
Odpovědět  +1 7.4.2012 21:50
Avatar
Odpovídá na Drahomír Hanák
David Jančík [sczdavos]:

Jasně :)
Tohle je brané spíše formou zábavy. Aktualizace není moc dobré zakazovat. Ať se klidně stahují a instalují, ale restartovat počítač si chci sám. A jelikož MS umožňuje aktualizacím restart zamezit pouze v Profesionální verzi Windows je třeba si najít vlastní cestu.
Program se dá využít samozřejmě i pro jiné účely, ovšem vtipný nadpis a chytlavý návod jak zkazit aktualizacím restart z něj dělá pohodové počteníčko :)

Odpovědět  +3 7.4.2012 22:19
Čím více času dostaneš, tím méně ho máš.
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Jo, to je taková standardní metoda čekání a zabíjení z uživatelského režimu. Jen by mě zajímalo, zda onen proces má na starosti pouze to vysakovací okno, nebo i něco jiného, co se týká procesu aktualizací. Nepřijde mi úplně super, kdyby třeba samotné aktualizace prováděl a byl zabit právě "v nejlepším". Od Windows Vista sice máme podporu transakčního zpracování, ale nesázel bych na něj všechno.

Jinak mi přijde docela škoda, že není v uživatelském režimu možné registrovat nějaký callback, kterému by systém předal řízení, když se vytvoří nový proces. Takhle to buď chce čekat přes časovač, což je neelegantní, nebo si napsat ovladač jádra, což je pro většinu složité a pokud dbáme na bezpečnost, nefunguje to všude zadarmo.

Samozřejmě ideální řešení tohoto problému by bylo mít automatické aktualizace vypnuté, případně rozhodovat sám o tom, kdy budou nainstalovány. Nevím ale, jak lze v nižších verzích Windows toto nastavit.

Odpovědět 18.4.2012 18:19
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na David Jančík [sczdavos]
Petr Čech (czubehead):

Tak to dopadá, když člověk nemá rád WIN8... (Tam to jde) ]:>

Editováno 25.11.2013 19:55
Odpovědět 25.11.2013 19:55
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
David Jančík [sczdavos]:

Tak tohle můžeš nastavit na 7mách taky. Nicméně pokud to nemáš nastavený a aktualizace se ti stáhnou tak ti začne vyskakovat vyhrožovací okénko, kterého se pak už nezbavíš. Ve vyšší verzi lze nastavit, že to okénko vyskakovat nemá.

Odpovědět 25.11.2013 20:17
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na David Jančík [sczdavos]
Michal Žůrek (misaz):

na 8 tě budou akorát otravovat při přihlašování a pokud to budeš měsíc ignorovat, tak ti zobrazí dialog.

Odpovědět 25.11.2013 21:07
Nesnáším {}, proto se jim vyhýbám.
Avatar
Petr Čech (czubehead):

No... právě jsem zjistil, že je to celkem jedno. 3 dny mne to otravovalo při přihlašování, a stejně se na mě WIN vykašlaly a nainstalovaly. o_O

Odpovědět 26.11.2013 17:33
Why so serious? -Joker
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.