Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как завершить любой процесс, в том числе и системный

Delphi , Программа и Интерфейс , Процессы и Сервисы

Как завершить любой процесс, в том числе и системный

Женщина спрашивает совета у доктора: - Доктор,мой 17-летний сын так увлекся компьютером,что даже спит возле него.Как его отучить? - Очень просто! Вино, водка, сигареты, женщины ...


 // Включение, приминение и отключения привилегии.
 // Для примера возьмем привилегию отладки приложений 'SeDebugPrivilege'
 // необходимую для завершения ЛЮБЫХ процессов в системе (завершение процесов
 // созданных текущим пользователем привилегия не нужна.
 
function ProcessTerminate(dwPID:Cardinal):Boolean;
var
 hToken:THandle;
 SeDebugNameValue:Int64;
 tkp:TOKEN_PRIVILEGES;
 ReturnLength:Cardinal;
 hProcess:THandle;
begin
 Result:=false;
 // Добавляем привилегию SeDebugPrivilege 
 // Для начала получаем токен нашего процесса
 if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
  or TOKEN_QUERY, hToken ) then
    exit;

 // Получаем LUID привилегии
 if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue ) 
  then begin
   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;
  // Завершаем процесс
   if not 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, которая позволяет процессу терминировать любой процесс в системе.

Вот разбивка кода:

  1. Функция начинает с попытки открыть токен для текущего процесса с помощью OpenProcessToken.
  2. Затем она ищет LUID (Локальный уникальный идентификатор) привилегии SeDebugPrivilege с помощью LookupPrivilegeValue.
  3. Функция создает структуру TOKEN_PRIVILEGES и устанавливает первый привилегию в SeDebugPrivilege, включая ее.
  4. Функция вызывает AdjustTokenPrivileges, чтобы добавить привилегию SeDebugPrivilege к токену.
  5. Если успешно, функция открывает handle для процесса с указанным dwPID с помощью OpenProcess.
  6. Затем она вызывает TerminateProcess, чтобы терминировать процесс.
  7. Наконец, функция закрывает handles и возвращает булевое значение, указывающее на успех.

Важное примечание: привилегия SeDebugPrivilege необходима только для терминирования системных процессов (то есть процессов, работающих под учеткой System). Для терминирования процессов, созданных текущим пользователем, вам не нужно этой привилегии.

Теперь о шутке в начале кода: я думаю, что использование совета врача для "получения" человека, который играет с компьютером, может быть не самым эффективным подходом 😂.

Альтернативное решение: вместо использования привилегии SeDebugPrivilege вы можете использовать функцию NtTerminateProcess из Windows API, которая позволяет терминировать любой процесс, включая системные, без необходимости в элевации привилегий. Вот пример:

function NtTerminateProcess(dwPID: Cardinal): Boolean;
var
  hProcess: THandle;
begin
  Result := False;

  hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
  if hProcess <> 0 then
  begin
    if not NtTerminateProcess(hProcess, DWORD(-1)) then
      exit;
  end;

  CloseHandle(hProcess);

  Result := True;
end;

Обратите внимание, что это альтернативное решение все еще требует, чтобы процесс имел необходимые разрешения для терминирования других процессов.

Как завершить любой процесс, в том числе и системный, с помощью программного кода на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:05:25/0.0034980773925781/0