Artykuły na każdy temat
[PHP] Pobranie listy procesów i ubicie wybranych celów
<?php
// Lista procesów do ubicia
$slaughter_list['pid'] = array();
$slaughter_list['process_name'] = array('notepad.exe');
// Działania pożądane
$processes_list = trim(shell_exec('tasklist /NH'));
$processes_list = explode("\n", $processes_list);
if(empty($slaughter_list['pid']) && empty($slaughter_list['process_name']))
{
echo 'Nie podałeś celów do ubicia';
exit;
}
// Dla czystości sumienia
if(!empty($processes_list))
{
// Przetwarzanie wyników i ubijanie celów, które w cale nie musi być w tym kawałku kodu
foreach($processes_list as $key => $value)
{
// Niedoskonałe, dlatego trzeba nieco poprawić!
preg_match("#([\s\w\.\-]+?)(\d+)#", $value, $sub_information);
$processes_list[$key] = array('process_name' => trim($sub_information[1]), 'pid' => (int)$sub_information[2]);
// Sprawdzamy czy ten PID jest do ubicia
if(in_array($processes_list[$key]['pid'], $slaughter_list['pid']))
{
// Można także użyć parametru /t odpowiedzialnego za zamkniecię procesów potomków
exec('taskkill /pid '.$processes_list[$key]['pid'], $return, $return_code);
// $return_code > 0 = fail? $return_code = 128 oznacza nieudaną próbę ubicia procesu (nie znaleziono PID) - o ile dobrze pamiętam
echo $processes_list[$key]['process_name'].' ('.$processes_list[$key]['pid'].') '.($return_code === 0 ? '' : 'nie ').'został ubity<br>';
}
// Dla czystości sumienia
unset($return, $return_code);
// Sprawdzamy czy ta nazwa procesu jest do ubicia (uroki in_array() - wielkość liter nazwy procesu ma znaczenie! Rozwiązanie: array_map() + strtolower())
if(in_array($processes_list[$key]['process_name'], $slaughter_list['process_name']))
{
// Można też użyć "taskkill /IM [nazwa procesu]"
exec('taskkill /pid '.$processes_list[$key]['pid'], $return, $return_code);
// To samo co powyżej
echo $processes_list[$key]['process_name'].' ('.$processes_list[$key]['pid'].') '.($return_code === 0 ? '' : 'nie ').'został ubity<br>';
}
// Dla czystości sumienia
unset($return, $return_code);
}
}
else
{
echo 'Lista procesów jest pusta';
}
?>
Przetwarzanie wyników i ubijanie celów niekoniecznie musi być w miejscu, które odpowiedzialne jest za listowanie procesów. Przykładowym wynikiem wykonania powyższego skryptu jest:
Cytat:
notepad.exe (1972) został ubityZapytacie pewnie, po co to wszystko? W skrajnych przypadkach jest potrzeba zgaszenia aplikacji z poziomu strony WWW szczególnie jak się nie ma dostępu przez RDP (zdalny pulpit) albo inne badziewia.
notepad.exe (2860) został ubity
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
int main()
{
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe = {0};
pe.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(h, &pe))
{
do
{
cout << pe.szExeFile << " " << pe.th32ProcessID << endl;
}
while(Process32Next(h, &pe));
}
CloseHandle(h);
system("PAUSE");
return EXIT_SUCCESS;
}
Komentarze
Dodaj komentarz