Привет всем!
Стал заниматься программированием на C# и еще совсем не много знаю. На днях возник вопрос: «Как убивать (завершать) другие процессы из программы, написанной на С#?». К примеру при нажатии на кнопку, хочу, чтобы выключался explorer.exe.
Как это реализовать? Предполагаю, что здесь не обойтись без использования WIN32 API.
Быть может, у кого-то есть готовый кусок кода?
.NET - Завершение не своих процессов на C#
-
Delirium
Re: .NET - Завершение не своих процессов на C#
ldcount, вы хотите просто убивать процессы? По выбору? Можно просто использовать имеющиеся возможности консольной утилиты taskkill в самой программе
1. Пишем вот такую функцию:
Код:
Функция с параметром типа string, в качестве параметра передается текст команды, например "taskkill /F /IM explorer.exe /T", и запускается в невидимом режиме cmd.exe, которая и выполняет эту команду.
Далее просто в коде программы, где необходимо, формируем следующий текст:
Код:
Можно обойтись и без try...catch. Данный пример просто выдаст исключение при невозможности завершить процесс.
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
Re: .NET - Завершение не своих процессов на C#
Delirium, спасибо за очень подробный ответ.
Я не заморачивался. Признаться, довольно быстро нашел пример, где выдернул нужный код.
Код:
Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав
.
Я не заморачивался. Признаться, довольно быстро нашел пример, где выдернул нужный код.
Код:
Код: Выделить всё
Process[] ps1 = System.Diagnostics.Process.GetProcessesByName("explorer");
foreach (Process p1 in ps1)
{
Console.WriteLine("Closing process...{0}", p1.ProcessName);
p1.Kill();
}Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав
.-
Delirium
Re: .NET - Завершение не своих процессов на C#
Можно и вашим вариантом. Мой способ более общий и позволяет из программы выполнять любые действия с утилитами командной строки. Да в общем то с ее помощью можно запускать любую внешнюю программу из кода своей программы.
Цитата ldcount:
Признаться, довольно быстро нашел пример, где выдернул нужный код
Очень хорошо.
Цитата ldcount:
Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав
Если процесс запущен от имени пользователя, то будет работать. Если под админской/системной учеткой, то не будет, выдаст "отказано в доступе".
По поводу админских прав - Для этого надо немного больше знаний о самой системе, ей процессах и прочее. Один мой знакомый переписывал msgina.dll, и делал из нее keyloger, который работал только при вводе пароля в систему. Это как пример.
Цитата ldcount:
Признаться, довольно быстро нашел пример, где выдернул нужный код
.NET - Завершение не своих процессов на C#
Очень хорошо.
Цитата ldcount:
Под администратором работает. Под другими не пробовал, но пишут, что работать не будет.
Интересует теперь вопрос получения админских прав
.NET - Завершение не своих процессов на C#
Если процесс запущен от имени пользователя, то будет работать. Если под админской/системной учеткой, то не будет, выдаст "отказано в доступе".
По поводу админских прав - Для этого надо немного больше знаний о самой системе, ей процессах и прочее. Один мой знакомый переписывал msgina.dll, и делал из нее keyloger, который работал только при вводе пароля в систему. Это как пример.
-
express-rus
Re: .NET - Завершение не своих процессов на C#
Delirium, почему-то ваш способ не работает. При выполнении кода ничего не происходит/процесс не завершается