Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Завершение не своих процессов на C# (http://forum.oszone.net/showthread.php?t=132427)

ldcount 18-02-2009 21:49 1042644

Завершение не своих процессов на C#
 
Привет всем!
Стал заниматься программированием на C# и еще совсем не много знаю. На днях возник вопрос: «Как убивать (завершать) другие процессы из программы, написанной на С#?». К примеру при нажатии на кнопку, хочу, чтобы выключался explorer.exe.

Как это реализовать? Предполагаю, что здесь не обойтись без использования WIN32 API.
Быть может, у кого-то есть готовый кусок кода?

Delirium 19-02-2009 01:12 1042806

ldcount, вы хотите просто убивать процессы? По выбору? Можно просто использовать имеющиеся возможности консольной утилиты taskkill в самой программе
1. Пишем вот такую функцию:
читать дальше »
Код:

private void ExecuteCommand(string str)
        {         
ProcessStartInfo startinfo;
            Process process = null;
            OperatingSystem os;
            string command;

            // Команда которую будет выполнять
            command = str;

            try
            {
                // Работаем только если это WinNT
                os = Environment.OSVersion;
                if (os.Platform != PlatformID.Win32NT)
                {
                    throw new PlatformNotSupportedException("Supported on Windows NT or later only");
                }
                os = null;

                // Проверка
                if (command == null || command.Trim().Length == 0)
                {
                    throw new ArgumentNullException("command");
                }

                startinfo = new ProcessStartInfo();
             
                    // Запускаем через cmd
                    startinfo.FileName = "cmd.exe";
                    // Ключ /c - выполнение команды
                    startinfo.Arguments = "/C " + command;
               
                // Не используем shellexecute
                startinfo.UseShellExecute = false;
                // Перенаправить вывод на обычную консоль
                startinfo.RedirectStandardOutput = true;
                // Не надо окон
                startinfo.CreateNoWindow = true;
                // Стартуем
                process = Process.Start(startinfo);
            }
            catch
            {
                throw;
            }
            finally
            {
                if (process != null)
                {
                    // Закрываем
                    process.Close();
                }
                // Освобождаем
                process = null;
                startinfo = null;
                GC.Collect();
            }

        }


Функция с параметром типа string, в качестве параметра передается текст команды, например "taskkill /F /IM explorer.exe /T", и запускается в невидимом режиме cmd.exe, которая и выполняет эту команду.

Далее просто в коде программы, где необходимо, формируем следующий текст:
Код:

try
{
string str = @" taskkill /F /M explorer.exe /T"; //перед taskkill обязателен пробел.
ExecuteCommand(str);
}
catch(Exception msg_ex)
{
MessageBox.Show(msg_ex.Message);
}

Можно обойтись и без try...catch. Данный пример просто выдаст исключение при невозможности завершить процесс.

ldcount 19-02-2009 01:18 1042808

Delirium, спасибо за очень подробный ответ.
Я не заморачивался. Признаться, довольно быстро нашел пример, где выдернул нужный код.

Код:

  Process[] ps1 = System.Diagnostics.Process.GetProcessesByName("explorer");
            foreach (Process p1 in ps1)
            {
                Console.WriteLine("Closing process...{0}", p1.ProcessName);
                p1.Kill();
            }

Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав:).

Delirium 19-02-2009 01:24 1042810

Можно и вашим вариантом. Мой способ более общий и позволяет из программы выполнять любые действия с утилитами командной строки. Да в общем то с ее помощью можно запускать любую внешнюю программу из кода своей программы.
Цитата:

Цитата ldcount
Признаться, довольно быстро нашел пример, где выдернул нужный код »

Очень хорошо.
Цитата:

Цитата ldcount
Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав »

Если процесс запущен от имени пользователя, то будет работать. Если под админской/системной учеткой, то не будет, выдаст "отказано в доступе".
По поводу админских прав - Для этого надо немного больше знаний о самой системе, ей процессах и прочее. Один мой знакомый переписывал msgina.dll, и делал из нее keyloger, который работал только при вводе пароля в систему. Это как пример.

express-rus 29-07-2013 14:19 2192648

Delirium, почему-то ваш способ не работает. При выполнении кода ничего не происходит/процесс не завершается


Время: 07:53.

Время: 07:53.
© OSzone.net 2001-