Как завершить любой процесс, в том числе и системный
Женщина спрашивает совета у доктора:
- Доктор,мой 17-летний сын так увлекся компьютером,что даже спит возле него.Как его отучить?
- Очень просто! Вино, водка, сигареты, женщины ...
// Включение, приминение и отключения привилегии.// Для примера возьмем привилегию отладки приложений 'SeDebugPrivilege'// необходимую для завершения ЛЮБЫХ процессов в системе (завершение процесов// созданных текущим пользователем привилегия не нужна.function ProcessTerminate(dwPID:Cardinal):Boolean;
var
hToken:THandle;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
begin
Result:=false;
// Добавляем привилегию SeDebugPrivilege // Для начала получаем токен нашего процессаifnot OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken ) then
exit;
// Получаем LUID привилегииifnot LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue )
thenbegin
CloseHandle(hToken);
exit;
end;
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// Добавляем привилегию к нашему процессу
AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);
if GetLastError()< > ERROR_SUCCESS then exit;
// Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем// завершить и системный процесс// Получаем дескриптор процесса для его завершения
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess =0 then exit;
// Завершаем процессifnot TerminateProcess(hProcess, DWORD(-1))
then exit;
CloseHandle( hProcess );
// Удаляем привилегию
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() < > ERROR_SUCCESS
then exit;
Result:=true;
end;
// Название добавление/удаление привилгии немного неправильные. Привилегия или // есть в токене процесса или ее нет. Если привилегия есть, то она может быть в // двух состояниях - или включеная или отключеная. И в этом примере мы только // включаем или выключаем необходимую привилегию, а не добавляем ее.
Программисты, я предупрежу вас: терминирование процессов - это плохая идея и может привести к нестабильному поведению системы или даже к ее краху. Перед тем как приступить к выполнению, вам нужно понимать последствия таких действий.
Теперь давайте перейдем к коду, предоставленному вами. Функция ProcessTerminate предназначена для терминирования процесса с указанным dwPID. Для этого она использует привилегию SeDebugPrivilege, которая позволяет процессу терминировать любой процесс в системе.
Вот разбивка кода:
Функция начинает с попытки открыть токен для текущего процесса с помощью OpenProcessToken.
Затем она ищет LUID (Локальный уникальный идентификатор) привилегии SeDebugPrivilege с помощью LookupPrivilegeValue.
Функция создает структуру TOKEN_PRIVILEGES и устанавливает первый привилегию в SeDebugPrivilege, включая ее.
Функция вызывает AdjustTokenPrivileges, чтобы добавить привилегию SeDebugPrivilege к токену.
Если успешно, функция открывает handle для процесса с указанным dwPID с помощью OpenProcess.
Затем она вызывает TerminateProcess, чтобы терминировать процесс.
Наконец, функция закрывает handles и возвращает булевое значение, указывающее на успех.
Важное примечание: привилегия SeDebugPrivilege необходима только для терминирования системных процессов (то есть процессов, работающих под учеткой System). Для терминирования процессов, созданных текущим пользователем, вам не нужно этой привилегии.
Теперь о шутке в начале кода: я думаю, что использование совета врача для "получения" человека, который играет с компьютером, может быть не самым эффективным подходом 😂.
Альтернативное решение: вместо использования привилегии SeDebugPrivilege вы можете использовать функцию NtTerminateProcess из Windows API, которая позволяет терминировать любой процесс, включая системные, без необходимости в элевации привилегий.
Вот пример:
Обратите внимание, что это альтернативное решение все еще требует, чтобы процесс имел необходимые разрешения для терминирования других процессов.
Как завершить любой процесс, в том числе и системный, с помощью программного кода на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.