Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.08.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
И. Павел ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.003 c
2-1305453738
обморок
2011-05-15 14:02
2011.08.28
самое длинное слово


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


3-1262553825
wipr
2010-01-04 00:23
2011.08.28
отмена удаления в таблицах DBF


2-1305489584
maxefficiently
2011-05-15 23:59
2011.08.28
Высчитать №Символы в Строке (не простая задача)


15-1304454597
Юрий
2011-05-04 00:29
2011.08.28
С днем рождения ! 4 мая 2011 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский