![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Danger |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Привет всем,
Вобщем, есть терминальный сервер, удаленные пользователи через терминал запускают определенную программу (уникальный класс окна, создаваемый программой, знаю). Нужно "пробежаться" по всем сессиям, и проверить наличие в них окна с определенным классом. Вот здесь уже обсуждалось: http://www.delphimaster.ru/cgi-bin/forum.p...9955786&n=5 попробовал, как описано - нифига не работает. Непонятно, как получить Desktop терминальной сессии ( WTSEnumerateSessions() перечисляет лишь имена сессий, но не windows stations). Максимум, могу получить список процессов терминальной сессии - но по ним же я не могу получить список окон, созданных этими процессами? Кто знает, посоветуйте, пожалста.. |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
WTSEnumerateSessions возвращает массив WTS_SESSION_INFO, один из параметров которой - pWinStationName.
Пройдя по массиву, найдя нужную терминальную сессию и WinSta, проходим по EnumDesktops, находим нужный и EnumDesktopWindows. Добавлено через 8 минут и 36 секунд мда... поторопился немного. Для того, чтобы перечислить десктопы нужно открыть winSta, а в OpenWindowStation не учитывается сессия... |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
||||
|
||||
Danger |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Кстати, в процессе я так и не понял, что там с windows station в терминальных сессиях. То ли, используется текущая (консольная) window station ('WInSta0'), либо для всех терминальных сессий window station называется всегда одинаково (упомянутый 'WinSta0'). Вообще, существует ли способ перечислить не сессии, а window station терминальных сессий? Насчет
Неясно, как связать данные, получаемые через WTSEnumerateProcesses() и CreateToolhelp32Snapshot(). Точнее, непонятно зачем нужна CreateToolhelp32Snapshot(), если WTSEnumerateProcesses() и так вернет список терминальных процессов? Может, CreateToolhelp32Snapshot() не нужен, или я что-то не понимаю? Это сообщение отредактировал(а) Danger - 24.7.2009, 06:03 |
||||
|
|||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
afaik, каждой терминальной сессии соответствует одна (СВОЯ) winSta. А вот название ее может отличаться:
Наоборот ![]()
ну да, но окна-то вроде можно перечислить только для потока, а не для процесса (EnumThreadWindows), соответственно - просто список процессов ничего не даст... |
||||
|
|||||
Danger |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
так что же делать?
![]() |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
попробуй так:
CreateToolhelp32Snapshot>Thread32First|Next>EnumThreadWindows>GetClassName. Если нужно потом найти, в какой сессии это окно находится, то: в Thread32First|Next>THREADENTRY32 есть параметр th32OwnerProcessID. ProcessIDToSessionID, а зная SessionID можно получать о ней информацию из WTSQuerySessionInformation... |
|||
|
||||
Danger |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Такое ощущение, что в слепок попадают только потоки, принадлежащие текущей window station. Ни одного потока с процессов другого терминального пользователя..
GetProcessParams() - простейшая функция-"обёртка", возвращает некоторые параметры процесса.. |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Так погляжу, на "соседнем" форуме посоветовали то, о чем я думал, но не хотел говорить - может есть менее обходной путь, чем запуск дополнительного процесса в каждой терминальной сессии...
Но мнение Eraser -а в таких вопросах можно считать непререкаемым. Посему - уточняющие вопросы: версия ОС, в которой нужно найти нужное окно в терминальной сессии? |
|||
|
||||
Danger |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
А что, если отталкиваться от списка процессов, возвращаемых WTSEnumerateProcesses() ? Т.е. получить список процессов, потом для каждого из них потоки, и в них искать окно? (без создания снимков).
MS Windows 2003 VLK Russian (R2), 32bit. |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Не нашел функцию перечисления потоков по известному процессу. :( Покажете, как? Ага, значит предложенное Eraser-ом более чем возможно. Это сообщение отредактировал(а) kami - 26.7.2009, 03:34 |
|||
|
||||
Danger |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Я имею в виду, сделать снимок CreateToolhelp32Snapshot() по ProcessID терминального процесса, и перечислить потоки по Thread32First() / Thread32Next(). Хотя, боюсь, получится то же самое (но попробовать стоит).
|
|||
|
||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
|
||||
|
|||||
Danger |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Что характерно: запускаю Process Explorer от Sysinternals (в терминальной сессии), и он мне исправно перечисляет процессы других терминальных пользователей и потоки в них.
Да банально: диспетчер задач отображает все процессы, всех пользователей (с указанием имени пользователя и параметров процесса). Как-то же он это делает? Это сообщение отредактировал(а) Danger - 26.7.2009, 18:25 |
|||
|
||||
kami |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
afaik, он использует свой драйвер, устанавливаемый на время его работы (драйвер находится в его ресурсах). Иначе многие из его возможностей (к примеру - закрытие любого хендла) из user-mode выглядят нереально.
Да перечислить процессы и получить их параметры не так и сложно. А вот перечислить потоки процесса и окна потоков - с учетом
не вижу решения, кроме предложенного eraser-ом. P.S. А почему именно окно? Нельзя будет обойтись запущен/не запущен процесс? |
||||||
|
|||||||
Danger |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 20.9.2006 Репутация: нет Всего: нет |
Возможно. Кстати, я вышел даже на NtQuerySystemInformation() с недокументированным параметром для перечисления потоков, но результат ее использования аналогичен функциям из ToolHelp - в список исправно попадают все процессы/потоки, но только текущей сессии. Ни один процесс, принадлежащий другому пользователю, просто не попадает в список.
Довольно проблематично проверять "аутентичность процесса". По каким критериям лучше всего определять соответствие процесса нужному? На первый взгляд, все параметры, по которым можно проверить, что запущен именно нужный исполнимый файл (работает нужный процесс) - ИМХО легко подделать обычному пользователю. Например, подменить exe-файл. |
||||||||||
|
|||||||||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Хм... Обычный юзверь не должен иметь прав подменять рабочие экзешники (это если админ грамотный). Тем более он не должен иметь прав админа, чтобы дать себе такие права ![]() Но и без этого проверить оригинальность файла можно: действительное полное имя файла, всякие crc32, MD5 и иже с ними, доп. информация о версии файла... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |