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í
Ovšem vy si zatím program ozkoušejte například na "notepad".
Hodně úsměvu při příštích aktualizacích