Форум: "Прочее";
Текущий архив: 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