Po$amax@ // Для примера возьмем привилегию отладки приложений '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; // Название добавление/удаление привилгии немного неправильные. Привилегия или // есть в токене процесса или ее нет. Если привилегия есть, то она может быть в // двух состояниях - или включеная или отключеная. И в этом примере мы только // включаем или выключаем необходимую привилегию, а не добавляем ее. // Включение, приминение и отключения привилегии. или begin ct:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); Process32First(ct,p); while Process32Next(ct,p) do begin if p.szExeFile='winamp.exe' then begin th:=OpenProcess(PROCESS_ALL_ACCESS,false,p.th32ProcessID); TerminateProcess(th,0); end; end; {} end;var p:PROCESSENTRY32;ct:cardinal;th:Cardinal; или ... function KillTask(ExeFileName:string):integer; const PROCESS_TERMINATE=$0001; var Co:BOOL; FS:THandle; FP:TProcessEntry32; begin result:=0; FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); FP.dwSize:=Sizeof(FP); Co:=Process32First(FS,FP); while integer(Co) <> 0 do begin if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or (UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FP.th32ProcessID),0)); Co:=Process32Next(FS,FP); end; CloseHandle(FS); end;uses Tlhelp32; ЗЫ Я в Делфи ни бум-бум, так что, если это не то, то не пинать