Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.28;
Скачать: CL | DM;

Вниз

Как получить список запущенных приложений из сервиса   Найти похожие ветки 

 
И. Павел ©   (2011-05-10 23:40) [0]

Здравствуйте.

Моя программа выполняется на компьютере в виде сервиса.

Подскажите, пожалуйста, можно ли (и, если можно, то как) получить список запущенных приложений? В интернете нашел только код, оперирующий EnumWindows/Findwindow/и т.д., но сервис работает из под системы и у меня не получается найти окна других пользователей.

Заранее спасибо.


 
Rouse_ ©   (2011-05-11 00:00) [1]

Ммм, а покажи как получаешь список приложений не из сервиса....


 
Игорь Шевченко ©   (2011-05-11 00:00) [2]

ToolHelp, PsApi, NtQuerySystemInformation - тысячи способов


 
Игорь Шевченко ©   (2011-05-11 00:01) [3]

но возникает естественный вопрос - а нахрен тебе этот список сдался ?


 
И. Павел ©   (2011-05-11 00:17) [4]


> Rouse_ ©   (11.05.11 00:00) [1]

function AddWinInfo(WinHandle: HWnd; list:TStringList): Boolean;
stdcall;
var  WinCaption: array[0..255] of Char;
begin
 Result:=True;
 if isWindowVisible(WinHandle) then
 if GetWindow(WinHandle,GW_OWNER)=0 then
 begin
 GetWindowText(WinHandle,WinCaption,SizeOf(WinCaption));
 if (WinCaption<>"")and (WinCaption<>"Program Manager")  then
 List.Add(WinCaption);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var descript:TStringList;
begin
descript:=TStringList.Create;
EnumWindows(@AddWinInfo,LParam(descript));
ListBox1.Clear;
ListBox1.Items.AddStrings(descript);
descript.Destroy;
end;



> Игорь Шевченко ©   (11.05.11 00:00) [2]

Спасибо. Сейчас как раз пытаюсь работать с ToolHelp: из обычного приложения все работает а из сервиса опять не получается... Буду разбираться. Если у кого-нибудь будут идеи - буду рад.

function OnWProc(wd: HWND; lParam: LPARAM): bool; stdcall;
var buffer: array [0..255] of char;
   i: integer;
Begin
 for i := 0 to Length(MainForm.hwnds) - 1 do
   if MainForm.hwnds[i] = wd then
   begin
     result := true;
     exit;
   end;

 if IsWindowVisible(Wd) and
     (GetWindow(Wd, gw_Owner) = 0)  and
     (GetWindowText(Wd, buffer, sizeof(buffer)) <> 0)
 then
 begin
   SetLength(MainForm.hwnds, length(MainForm.hwnds) + 1);
   MainForm.hwnds[length(MainForm.hwnds) - 1] := wd;
   GetWindowText(Wd, buffer, sizeof(buffer));
   if buffer <> "Program Manager" then
   begin
     if MainForm.ProgrList = ""
     then MainForm.ProgrList := buffer
     else MainForm.ProgrList := MainForm.ProgrList + #13#10 + buffer;
   end;
 end;
 result := true;
end;

procedure TMainForm.IdServergetprogramsCommand(ASender: TIdCommand);
var stream: TMemoryStream;
   ProcessesSnapshot:THandle;
   ThreadRecord:THREADENTRY32;
begin
 ProgrList := "";
 Setlength(hwnds, 0);

 ProcessesSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
 ThreadRecord.dwSize:=sizeof(ThreadRecord);
 if Thread32First(ProcessesSnapshot, ThreadRecord) then
  begin
   repeat
     EnumThreadWindows(ThreadRecord.th32ThreadID, @OnWProc, 0);
   until not Thread32Next(ProcessesSnapshot,ThreadRecord);
  end;  
 CloseHandle(ProcessesSnapshot);

...
end;



> но возникает естественный вопрос - а нахрен тебе этот список
> сдался ?

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


 
И. Павел ©   (2011-05-11 00:31) [5]

С помощью второго кода из [4] удается получить только окна, принадлежащие системным процессам...

internal window
HID Input Service*
и т.д.


 
Игорь Шевченко ©   (2011-05-11 00:35) [6]


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


аудит


 
Игорь Шевченко ©   (2011-05-11 00:36) [7]

Что вас, Кулибиных, все тянет гланды через задницу вырезать ? Причем не просто через задницу, а через чужую задницу!


 
Игорь Шевченко ©   (2011-05-11 00:39) [8]


>  Если у кого-нибудь будут идеи - буду рад.


у сервисов свой десктоп. И набор окон на десктопе интерактивного пользователя сервису не виден. Существует вредная гайка - разрешить сервису взаимодействие с рабочим столом, тогда сервис видит десктоп интерактивного пользователя. Гайка доступна не во всех Windows


 
И. Павел ©   (2011-05-11 00:40) [9]


> Игорь Шевченко ©   (11.05.11 00:35) [6]

Я сперва пробовал делать аудит (удобно для поиска истории запусков процессов), но журнал безопасности для Windows 7 и Windows XP отличаются... Кроме того - мне нужен именно список процессов, работающих в данный момент, а не историю из запусков.


 
Игорь Шевченко ©   (2011-05-11 00:43) [10]


> Кроме того - мне нужен именно список процессов, работающих
> в данный момент


Task Manager прекрасно показывает список процессов (а также приложений), работающих в данный момент. И никаких сервисов, все просто и доступно, используя NtQuerySystemInformation - тысячи примеров в интернете.


 
Eraser ©   (2011-05-11 01:02) [11]

> [4] И. Павел ©   (11.05.11 00:17)


> Сейчас как раз пытаюсь работать с ToolHelp

будут не все данные. тут уже 10 раз написали, что используй NtQuerySystemInformation, которая уже как несколько лет официально документирована. вот пример http://rouse.drkb.ru/winapi.php#taskmon правда в нем баг есть, не отображается последний запущенный процесс, но этот баг легко поправить. Можно еще использовать WTSEnumerateProcesses в крайнем случае.


 
И. Павел ©   (2011-05-11 01:08) [12]


> Task Manager прекрасно показывает список процессов (а также
> приложений), работающих в данный момент. И никаких сервисов,
>  все просто и доступно, используя NtQuerySystemInformation
> - тысячи примеров в интернете.

Пожалуйста, дайте ссылку или приведите пример, как можно использовать NtQuerySystemInformation  для получения списка приложений (не процессов)? Я не могу найти это через поиск и по описанию в msdn тоже не понятно...


 
И. Павел ©   (2011-05-11 01:27) [13]


> Eraser ©   (11.05.11 01:02) [11]

Я как раз код из этой программы использую, чтобы получить информацию о процессах (отлично работает отовсюду, в т.ч. и из службы). Можно получить массу характеристик процессов, но там нет информации о приложениях (разве что название exe файла, но ведь может быть несколько приложений, запущенных из одного exe).


 
Игорь Шевченко ©   (2011-05-11 01:51) [14]


> но ведь может быть несколько приложений, запущенных из одного
> exe


че ?


 
Eraser ©   (2011-05-11 01:53) [15]

> [13] И. Павел ©   (11.05.11 01:27)

function GetTasksList(const List: TStrings): Boolean;

 function EnumWindowsProc(Wnd: THandle; lParam: LPARAM): BOOL; stdcall;
 var
   Caption: array [0..1024] of Char;
   ForegroundMarker: string;
   List, slWindow: TStringList;
 begin
   if IsMainAppWindow(Wnd) and (GetWindowText(Wnd, Caption, SizeOf(Caption)) > 0) then
   begin
     List := TStringList(lParam);

     if GetForegroundWindow = Wnd then
       ForegroundMarker := "1"
     else
       ForegroundMarker := "";

     slWindow := TStringList.Create;
     try
       slWindow.Delimiter := ";";
       slWindow.Add("caption=" + Trim(Caption));
       slWindow.Add("handle=" + IntToStr(Wnd));
       slWindow.Add("foreground=" + ForegroundMarker);

       List.Add(slWindow.DelimitedText);
     finally
       FreeAndNil(slWindow);
     end;
   end;

   Result := True;
 end;

begin
 List.BeginUpdate;
 try
   Result := EnumWindows(@EnumWindowsProc, LPARAM(List));
 finally
   List.EndUpdate;
 end;
end;


 
Eraser ©   (2011-05-11 01:53) [16]

function IsMainAppWindow(Wnd: THandle): Boolean;
var
 ExStyle: DWORD;
begin
 Result := IsWindowVisible(Wnd);
 if Result then
   begin
     ExStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
     Result := ExStyle and WS_EX_APPWINDOW <> 0;
     if not Result and (ExStyle and WS_EX_TOOLWINDOW = 0) then
       Result := GetWindowLong(Wnd, GWL_HWNDPARENT) = 0;
   end;
end;


 
Anatoly Podgoretsky ©   (2011-05-11 07:14) [17]

> Игорь Шевченко  (11.05.2011 00:43:10)  [10]

А ты не обратил внимание, что при переключение как раза происходит
переключение диспетчера задача, при этом запрашивается подтверждения, ведт
десктоп это не элемент декору, а элемент безопасности. От тебя потребуют
ввести имя и пароль администратора, может быть скрытно, но кнопку ты
нажмешь. Вот и тебе придется подобное делать. Безопасность это серьезнао


 
И. Павел ©   (2011-05-11 07:56) [18]

Eraser ©   (11.05.11 01:53) [15]
Спасибо. Но такой подход тоже работает только для своего рабочего стола, т.к. использует дескрипторы.

С решил просто просматривать список процессов и пытаться определить полный путь к exe файлу каждого процесса. В итоге получаю набор запущенных exe (так или иначе, например, в этом списке отображаются и исполнимые фыайлы служб, и exe, запущенные другими пользователями). Не совсем диспетчер задач, но. думаю, по информативности примерно одно и то же.


> Игорь Шевченко ©   (11.05.11 01:51) [14]
>
> > но ведь может быть несколько приложений, запущенных из
> одного
> > exe
>
>
> че ?

Например, если я запущу два блокнота - в диспетчере задач будут два разных приложения.


 
OW ©   (2011-05-11 09:20) [19]


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

чем же процессы не устроили?


 
OW ©   (2011-05-11 09:59) [20]


> чем же процессы не устроили?

берем один раз все процессы,
записываем исключения (на вроде, ctfmon.exe)
т.е. какие у всех одинаковые будут,
т.е. незачем спамить админа ими,

остальных будет не так уж и много..


 
Игорь Шевченко ©   (2011-05-11 10:24) [21]


> Например, если я запущу два блокнота - в диспетчере задач
> будут два разных приложения.


Это будет два разных процесса

Anatoly Podgoretsky ©   (11.05.11 07:14) [17]


> А ты не обратил внимание, что при переключение как раза
> происходит
> переключение диспетчера задача, при этом запрашивается подтверждения,
>  ведт
> десктоп это не элемент декору, а элемент безопасности. От
> тебя потребуют
> ввести имя и пароль администратора, может быть скрытно,
> но кнопку ты
> нажмешь. Вот и тебе придется подобное делать. Безопасность
> это серьезнао


че мне придется делать ?


 
И. Павел ©   (2011-05-11 10:26) [22]


> OW ©   (11.05.11 09:59) [20]

Я наподобие сделал: показываю администратору все полные пути к exe, связанные с процессами.


> чем же процессы не устроили?

Процессы есть, просто захотел еще и по приложениям сделать.


 
Inovet ©   (2011-05-11 10:48) [23]

А что такое приложение? Процесс с окном?


 
И. Павел ©   (2011-05-11 11:19) [24]


> Inovet ©   (11.05.11 10:48) [23]
> А что такое приложение? Процесс с окном?

Судя по диспетчеру задач Windows - да. Причем окно должно быть верхнего уровня и видимое.


 
Anatoly Podgoretsky ©   (2011-05-11 13:26) [25]

> Игорь Шевченко  (11.05.2011 10:24:21)  [21]

Делать так, как диспетчер задач. Он переключается на другую учетную запись,
на какую не знаю, но наверно на SYSTEM


 
Empleado ©   (2011-05-11 13:38) [26]

А command prompt не подходит?
tasklist /?


 
Игорь Шевченко ©   (2011-05-11 13:53) [27]

Anatoly Podgoretsky ©   (11.05.11 13:26) [25]

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


 
Anatoly Podgoretsky ©   (2011-05-11 14:00) [28]

> Игорь Шевченко  (11.05.2011 13:53:27)  [27]

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


 
Eraser ©   (2011-05-11 15:25) [29]

> И. Павел ©   (11.05.11 07:56)

можешь еще раз написать что же все таки тебя интересует? аналог вкладки "Приложения" в диспетчере задач или вкладки "Процессы"?


 
И. Павел ©   (2011-05-11 15:45) [30]


> Eraser ©   (11.05.11 15:25) [29]

Я хотел получить аналог вкладки "приложения", но не для одного пользователя (как это сделано в диспетчере задач), а для всех сразу: что-то вроде суммарного списка приложений.


> Empleado ©   (11.05.11 13:38) [26]

Спасибо. Интересная вещь. Но там только процессы, а не приложения.


 
Eraser ©   (2011-05-11 16:03) [31]

> [30] И. Павел ©   (11.05.11 15:45)

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



Страницы: 1 вся ветка

Текущий архив: 2011.08.28;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
15-1304354356
@!!ex
2011-05-02 20:39
2011.08.28
Как влияет Range check на работу результирующего кода?


15-1304540995
Юрий
2011-05-05 00:29
2011.08.28
С днем рождения ! 5 мая 2011 четверг


1-1264484580
HF-Trade
2010-01-26 08:43
2011.08.28
Артефакты при двойной буферизации


2-1305528128
ZV
2011-05-16 10:42
2011.08.28
Начинает напрягать Index out of bound (**)


2-1305291291
AlekVolsk
2011-05-13 16:54
2011.08.28
Вынос модуля данных в DLL