![]() |
Модераторы: 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. А почему именно окно? Нельзя будет обойтись запущен/не запущен процесс? |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "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. |