Войти

Показать полную графическую версию : Завершение не своих процессов на C#


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

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

Delirium
19-02-2009, 01:12
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
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
Можно и вашим вариантом. Мой способ более общий и позволяет из программы выполнять любые действия с утилитами командной строки. Да в общем то с ее помощью можно запускать любую внешнюю программу из кода своей программы.
Признаться, довольно быстро нашел пример, где выдернул нужный код »
Очень хорошо.
Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав »
Если процесс запущен от имени пользователя, то будет работать. Если под админской/системной учеткой, то не будет, выдаст "отказано в доступе".
По поводу админских прав - Для этого надо немного больше знаний о самой системе, ей процессах и прочее. Один мой знакомый переписывал msgina.dll, и делал из нее keyloger, который работал только при вводе пароля в систему. Это как пример.

express-rus
29-07-2013, 14:19
Delirium, почему-то ваш способ не работает. При выполнении кода ничего не происходит/процесс не завершается




© OSzone.net 2001-2012