Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 ;)


 

Všechny články v sekci
Programování služeb ve Windows
Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
4 hlasů
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity