Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.04.2012, 23:35
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию Программа удаленного администрирования (проблема с получением списка процессов)

Есть программа, состаящая из клиента и сервера. Клиент отправляет сообщение через ServerSocket, сервер анализирует и в зависимости от полученного сообщения выполняет действия(или ничего не делает)

В чем именно проблема я не знаю, но сервер не присылает список программ...

Программу списываю с http://www.xakep.ru/post/12475/

Процедуру сбора сведений о полученных процессах взял тут: http://zetblog.ru/programming/200812/winapi-получить список-запущенных-процесс/

Поковырял немного и получилось вот так:

Код:
function GetProcessList(ServerSocket1: TServerSocket): TStrings;
var
  eP: TProcessEntry32;
  hP, snap: THandle; 
  hM: hmodule; 
  prcs: array[0..$FFF] of dword;

  cP, cM: cardinal; 
  i: integer;
  NameProc: array[0..max_path] of char;
  begin
  lP:=TStringList.Create;
  lP.Clear;

  if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
  begin //если это Win9x

    snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
    if integer(snap) = -1 then
    begin
      exit;
    end
    else
    begin
      eP.dwSize := sizeof(eP);

      if Process32First(snap, eP) then

        repeat
          lP.Add(string(eP.szExeFile));
        until not Process32Next(snap, eP);
    end;
  end
  else
  begin 
    if not EnumProcesses(@prcs, sizeof(prcs), cP) then
    begin
      exit;
    end;

    for i := 0 to cP div 4 - 1 do
    begin
      hP := OpenProcess(PROCESS_QUERY_INFORMATION or
                                    PROCESS_VM_READ,
                                     false, prcs[i]);
      if hP > 0 then
      begin
        EnumProcessModules(hP, @hM, 4, cM);
        GetModuleFileNameEx(hP, hM, NameProc, sizeof(NameProc));
        ServerSocket1.Socket.Connections[0].SendText(ExtractFileName(string(NameProc))); 

       lP.Add(string(NameProc));
                                     
        CloseHandle(hP);
      end;
    end;
  end;
 
end;

при этом вызов функции идет из:

Код:
begin
a:=Socket.ReceiveText;
if a ='hello' then Socket.SendText('Hello, i`m you server');
 RichEdit1.Lines.Add(a);
if a= 'StartFTP' then
  begin
   FTPServer1.Start;
   Socket.SendText('FTP Server started');
   end;
if a= 'StopFTP' then
begin
  FTPServer1.DisconnectAll;
  FTPServer1.Stop;
  Socket.SendText('FTP Server stoped');

if a='lp' then GetProcessList(ServerSocket1); //этой строки

if copy(a,1,2) = 'dp' then
  delproc(copy(a,4,Length(a)-3));
end;
end;

Возвращает ничего. Пожалуйста, помогите разобраться... я в делфи новичек и, возможно, допускаю какую-нибудь глупую ошибку в коде... Но спросить не у кого...

Последний раз редактировалось homeknight, 04.04.2012 в 00:43.
Ответить с цитированием
  #2  
Старый 03.04.2012, 23:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Уверен, что
Код:
  a := Socket.ReceiveText;
возвращает только то, что проверяется? Может использовать Pos для проверки.

Код:
  lP:=TStringList.Create;
  lP.Clear;
после создания, lP уже пуст и очищать нет нужды. Также нужно не забывать освобожать, когда он больше не требуется.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 03.04.2012, 23:49
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Уверен, что
Код:
  a := Socket.ReceiveText;
возвращает только то, что проверяется? Может использовать Pos для проверки.

Код:
  lP:=TStringList.Create;
  lP.Clear;
после создания, lP уже пуст и очищать нет нужды. Также нужно не забывать освобожать, когда он больше не требуется.

Я не уверен, что до конца понял что ты имел ввиду, но посыл текста StartFTP и Hello возвращает на клиента сообщения, соответственно, о том, что фтп запушено и Hello, i am your server. При этом на StartFTP функция запуска FTPServer выполняется без нареканий.
Ответить с цитированием
  #4  
Старый 03.04.2012, 23:53
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Код:
  lP:=TStringList.Create;
  lP.Clear;
после создания, lP уже пуст и очищать нет нужды. Также нужно не забывать освобожать, когда он больше не требуется.

на сколько я понял из ошибок SendText(lp) не сработает с сокетом...
TStrings and String не совпадут...
Ответить с цитированием
  #5  
Старый 03.04.2012, 23:57
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Мда, срочно учить матчасть.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
homeknight (03.04.2012)
  #6  
Старый 04.04.2012, 00:01
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Может направишь в нужное русло?) Я понимаю, что туплю где-то, но прогу мне надо дописать все же...

да и вобще, я просто не доковырял до ума код, скопированный из блога зет.

lp мне по сути не нужен...
Код:
ServerSocket1.Socket.Connections[0].SendText(ExtractFileName(string(NameProc)));
отправляет клиенту процессы

Последний раз редактировалось homeknight, 04.04.2012 в 00:04.
Ответить с цитированием
  #7  
Старый 04.04.2012, 00:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В этом коде ошибки не видно.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 04.04.2012, 00:18
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Вопрос, нормально ли что я
Код:
GetProcessList(ServerSocket1: TServerSocket): TStrings;
воткнул?
Извиняюсь за глупые вопросы, просто реально нет опыта и где искать его еще, кроме как в своих ошибках, не знаю, как и у кого спросить... так уж вышло, что преподы наши не могут просто физически успеть подсказать что-то... Поэтому спрашиваю тут, надеясь на таких вот добрых людей
Ответить с цитированием
  #9  
Старый 04.04.2012, 00:24
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Возвращается TStrings, но проверки на возвращаемое значение нигде нет. И в таком случае Вы несколько изменили оригинальный код. Там StringList является глобальной переменной и в функции он только очищается. У Вас же при каждом вызове идёт новое создание и ни одного деструктора.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 04.04.2012, 00:41
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Запилил оригинал с zetblog.ru, набросал форму с memo1 и button1, button2.

Вот тут:

Код:
 if not EnumProcesses(@prcs, sizeof(prcs), cP) then
....
 EnumProcessModules(hP, @hM, 4, cM);
.....

Выдает предупреждения

[Warning] Unit1.pas(63): Unsafe code '@ operator'
[Warning] Unit1.pas(76): Unsafe code '@ operator'

Запускается, но не работает(
Ответить с цитированием
  #11  
Старый 04.04.2012, 00:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот это оригинал:
Код:
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение списка процессов в Windows 9x/NT

Определяет список модулей, запущенных в настоящее время в системе, и заносит их
имена в список TStrings. На Win9x использует функции ToolHelp32,
на NT/2000/XP - библиотеку PSAPI.dll

Зависимости: Windows, Classes, PSAPI, TlHelp32
Автор:       Евгений Пелега, drpass@mail.ru, Донецк
Copyright:   Евгений Пелега
Дата:        26 апреля 2002 г.
***************************************************** }

procedure GetProcessList(var sl: TStrings);
var
  pe: TProcessEntry32;
  ph, snap: THandle; //дескрипторы процесса и снимка
  mh: hmodule; //дескриптор модуля
  procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов
  count, cm: cardinal; //количество процессов
  i: integer;
  ModName: array[0..max_path] of char; //имя модуля
begin
  sl.Clear;
  if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
  begin //если это Win9x
    snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
    if integer(snap) = -1 then
    begin
      exit;
    end
    else
    begin
      pe.dwSize := sizeof(pe);
      if Process32First(snap, pe) then
        repeat
          sl.Add(string(pe.szExeFile));
        until not Process32Next(snap, pe);
    end;
  end
  else
  begin //Если WinNT/2000/XP
    if not EnumProcesses(@procs, sizeof(procs), count) then
    begin
      exit;
    end;
    for i := 0 to count div 4 - 1 do
    begin
      ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, procs[i]);
      if ph > 0 then
      begin
        EnumProcessModules(ph, @mh, 4, cm);
        GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
        sl.Add(string(ModName));
        CloseHandle(ph);
      end;
    end;
  end;
end;

Пример использования:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  tmp: TStrings;
begin
  tmp := memo1.Lines;
  GetProcessList(tmp);
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 04.04.2012, 00:48
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Странно, но все равно не пашет... Ни на семерке, ни на xp
Ответить с цитированием
  #13  
Старый 04.04.2012, 00:52
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Проверь для начала без серверных примочек в "чистую", чтобы убедиться, что получаешь список процессов, а уж дальше думай.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 04.04.2012, 00:54
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Исправляюсь... неправильно запилил его... Спасибо за пример, буду разбираться.

Последний раз редактировалось homeknight, 04.04.2012 в 00:58.
Ответить с цитированием
  #15  
Старый 04.04.2012, 01:17
homeknight homeknight вне форума
Прохожий
 
Регистрация: 03.04.2012
Сообщения: 12
Репутация: 10
По умолчанию

Список получаю, пытаюсь сделать вывод на сокет.
Вот вопрос из серии базовые знания:

Код:
if a='lp' then
begin
GetProcessList(ServerSocket1);
end;

Такое обращение к созданному на форме серверсокету верно при вызове процедуры?

И в самой процедуре совсем глупый вопрос возникает


Код:
procedure GetProcessList(var ServerSocket1:TServerSocket); //тут верно ли указал и будет вобще процедура обращаться к компоненту ServerSocket1 на форме...
var
  pe: TProcessEntry32;
  ph, snap: THandle; 
  mh: hmodule; 
  procs: array[0..$FFF] of dword; 
  count, cm: cardinal; 
  i: integer;
  ModName: array[0..max_path] of char;
begin
    if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
  begin
    snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
    if integer(snap) = -1 then
    begin
      exit;
    end
    else
    begin
      pe.dwSize := sizeof(pe);
      if Process32First(snap, pe) then
        repeat
          Form1.ServerSocket1.Socket.Connections[0].SendText(string(pe.szExeFile));//в данной строке
        until not Process32Next(snap, pe);
    end;
  end
  else
  begin 
    if not EnumProcesses(@procs, sizeof(procs), count) then
    begin
      exit;
    end;
    for i := 0 to count div 4 - 1 do
    begin
      ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, procs[i]);
      if ph > 0 then
      begin
        EnumProcessModules(ph, @mh, 4, cm);
        GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
        Form1.ServerSocket1.Socket.Connections[0].SendText(string(ModName));
        CloseHandle(ph);
      end;
    end;
  end;
end;

Последний раз редактировалось homeknight, 04.04.2012 в 01:25.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025