Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Службы и GDI |
Автор: altom 29.11.2013, 15:00 | ||||||
Приветствую всех. Есть Windows служба:
Служба запускает другой процесс:
Этот процесс занимается снятием скриншотов:
Проблема заключается в том, что при работе под Windows XP приходится делать службу интерактивной (иначе на скриншоте получаем черный прямоугольник), а интерактивные службы могут быть запрещены на машине клиента. Но, коль скоро скриншоты делает не служба, а запущенный процесс, напрашивается вывод о том, что процесс наследует какие-то права службы, которые мешают ему получить доступ к консоли. При этом, даже в случае интерактивной службы, при отображении экрана приветствия получается черный прямоугольник. По некоторым причинам служба и дочерний процесс представлены одним exe файлом, но непосредственно функционал (запуск дочернего процесса и снятие скриншотов) расположен в dll (общей). Было сомнение по поводу того, что проблема может быть связана с загрузкой этой dll из сервиса и последующим использованием ее же в дочернем процессе, но разнесение функционала по разным dll не помогло. Возможно, я не стал бы биться над решением этой задачи, списал бы это на ограничения винды, если бы не TightVNC, которая производит аналогичные манипуляции, при этом не регистрируя сервис как интерактивный. Собственно, отсюда 2 вопроса: 1. Какие права нужно добавить/отобрать у процесса, чтобы его работа не зависела от настроек службы (если проблема в правах)? 2. Что может мешать получению скриншота с экрана приветствия? |
Автор: Dik0n 29.11.2013, 15:28 | ||
На ХР точно работает (процесс запускается от мени пользователя) на 7ке не проверял.
|
Автор: xvr 2.12.2013, 09:55 |
Начиная с Windows Vista все сервисы запускаются под своей собственной Window Station со своим собственным Desktop'ом, и изменить это вы не сможете. Более того, открыть любую пользовательскую сессию (Windows Station) от имени сервиса (LOCAL SYSTEM) вы тоже не сможете. Выход - запускать процесс от имени конкретного пользователя и на его Window Station. См функцию http://msdn.microsoft.com/en-us/library/windows/desktop/ms682431%28v=vs.85%29.aspx (и не забудьте заполнить lpStartupInfo->lpDesktop) |