Нужно делать скриншот из службы
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.09.10 10:42
Оценка:
Здравствуйте!

Собственно, задача в том, что нужно делать периодически скриншоты экрана. Удобнее всего реализовать требуемую функциональность в службе — под XP должно работать, если разрешить сервису взаимодействие с рабочим столом. А как подобная задача решается для Vista/Win7? В принципе, можно сделать оконное приложение, загружать в автозагрузке и сворачивать в трей, но это не так удобно, и в 7ке вроде трей куда-то дели?
Маньяк Робокряк колесит по городу
Re: Нужно делать скриншот из службы
От: Mr.Delphist  
Дата: 30.09.10 18:06
Оценка:
Здравствуйте, Marty, Вы писали:

M> Здравствуйте!


M> Собственно, задача в том, что нужно делать периодически скриншоты экрана. Удобнее всего реализовать требуемую функциональность в службе — под XP должно работать, если разрешить сервису взаимодействие с рабочим столом. А как подобная задача решается для Vista/Win7? В принципе, можно сделать оконное приложение, загружать в автозагрузке и сворачивать в трей, но это не так удобно, и в 7ке вроде трей куда-то дели?


Представьте себе ситуацию: серверная версия ОС, одновременно залогинены несколько юзеров. Чей стол Вы будете грабить из сервиса?
А если админ-параноик выключит галочку "разрешить взаимодействие с рабочим столом"?
Приложение, работающее в контексте нужного юзера — самый безпроблемный вариант.

P.S. трей в с семерке никуда не делся, просто выглядит по-другому
Re[2]: Нужно делать скриншот из службы
От: filkov СССР  
Дата: 30.09.10 18:18
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Представьте себе ситуацию: серверная версия ОС, одновременно залогинены несколько юзеров. Чей стол Вы будете грабить из сервиса?

MD>А если админ-параноик выключит галочку "разрешить взаимодействие с рабочим столом"?
MD>Приложение, работающее в контексте нужного юзера — самый безпроблемный вариант.

В любом случае службе придётся:
1. Обнаруживать активных пользователей;
2. Выбирать нужного пользователя;
3. "Прикидываться" этим пользователем (impersonate), чтобы получить доступ к его ресурсам.
Санкционный Смотритель.
Re[2]: Нужно делать скриншот из службы
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.10.10 09:31
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Представьте себе ситуацию: серверная версия ОС, одновременно залогинены несколько юзеров. Чей стол Вы будете грабить из сервиса?

MD>А если админ-параноик выключит галочку "разрешить взаимодействие с рабочим столом"?
MD>Приложение, работающее в контексте нужного юзера — самый безпроблемный вариант.

MD>P.S. трей в с семерке никуда не делся, просто выглядит по-другому


Уточню задачу. Программа не общего назначения, а решает отдельную задачу. Надо делать снимок с экрана — текущего, активного, который отображается на мониторе в данный момент, вне зависимости от того сколько юзеров залогинилось, и отсылать его по сети (раздавать по http). Админ-параноик исключен. В случае трея на каждого юзера своя копия программы, как тогда выделять порты для http-сервера? И как узнавать, на какой порт коннетится?
Маньяк Робокряк колесит по городу
Re[3]: Нужно делать скриншот из службы
От: Muxa  
Дата: 01.10.10 10:14
Оценка:
M>Уточню задачу. Программа не общего назначения, а решает отдельную задачу. Надо делать снимок с экрана — текущего, активного, который отображается на мониторе в данный момент, вне зависимости от того сколько юзеров залогинилось, и отсылать его по сети (раздавать по http). Админ-параноик исключен. В случае трея на каждого юзера своя копия программы, как тогда выделять порты для http-сервера? И как узнавать, на какой порт коннетится?

как вариант можно совместить два подхода: служба при логине какого-либо пользователя, запускает десктопное приложение (от имени это пользователя), которое скриншотит его активность. далее сервис берет скриншоты и отсылет их "кому надо".
Re[3]: Нужно делать скриншот из службы
От: Mr.Delphist  
Дата: 04.10.10 13:40
Оценка:
Здравствуйте, filkov, Вы писали:

F>Здравствуйте, Mr.Delphist, Вы писали:


MD>>Представьте себе ситуацию: серверная версия ОС, одновременно залогинены несколько юзеров. Чей стол Вы будете грабить из сервиса?

MD>>А если админ-параноик выключит галочку "разрешить взаимодействие с рабочим столом"?
MD>>Приложение, работающее в контексте нужного юзера — самый безпроблемный вариант.

F>В любом случае службе придётся:

F>1. Обнаруживать активных пользователей;
F>2. Выбирать нужного пользователя;
F>3. "Прикидываться" этим пользователем (impersonate), чтобы получить доступ к его ресурсам.

Вы никогда не видели при старте инсталера вопрос: ставить эту программу только Вам или всем юзерам? Далее, у каждого юзера в автозапуске (напрмер, ключик Software/Microsoft/Windows/CurrentVersion/Run) появляется старт Вашей треевской утилиты. Запускается она под учеткой юзера (а не системным сервисом каким), поэтому имперсонация просто не нужна.
Re[3]: Нужно делать скриншот из службы
От: Mr.Delphist  
Дата: 04.10.10 13:50
Оценка:
Здравствуйте, Marty, Вы писали:

M>Уточню задачу. ... В случае трея на каждого юзера своя копия программы, как тогда выделять порты для http-сервера? И как узнавать, на какой порт коннетится?


Вы в самом деле думаете, что у Гугла хватает портов на каждого пришедшего юзера?
Коннект между клиентом и сервером идентифицируется двумя парами:
  • server IP
  • server port
  • client IP
  • client port

    Сервер спокойно может принять на один свой IP-порт более одного запроса — он просто слушает его. А на клиентской стороне одинаковые исходящие порты не выдаст уже сама ось — вряд ли у Вас столько юзеров на машине, что исчерпается пул доступным портов.
    Описываемая проблема не существует.
  • Re[4]: Нужно делать скриншот из службы
    От: filkov СССР  
    Дата: 04.10.10 16:03
    Оценка:
    Здравствуйте, Mr.Delphist, Вы писали:

    MD>Вы никогда не видели при старте инсталера вопрос: ставить эту программу только Вам или всем юзерам?


    Видел.
    Я говорил про сервис.
    Чтобы сервис получил доступ к ресурсам юзера, нужна имперсонация.
    Санкционный Смотритель.
    Re[5]: Нужно делать скриншот из службы
    От: Jolly Roger  
    Дата: 04.10.10 17:22
    Оценка: 1 (1)
    Здравствуйте, filkov, Вы писали:

    F>Я говорил про сервис.

    F>Чтобы сервис получил доступ к ресурсам юзера, нужна имперсонация.

    Не нужна. Возможности сервера, работающего под LocalSystem, на данной машине не имеют границ в пределах разумного. И даже за пределами
    "Нормальные герои всегда идут в обход!"
    Re[4]: Нужно делать скриншот из службы
    От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
    Дата: 04.10.10 18:57
    Оценка:
    Здравствуйте, Mr.Delphist, Вы писали:

    MD>Сервер спокойно может принять на один свой IP-порт более одного запроса — он просто слушает его. А на клиентской стороне одинаковые исходящие порты не выдаст уже сама ось — вряд ли у Вас столько юзеров на машине, что исчерпается пул доступным портов.

    MD>Описываемая проблема не существует.
    Подразумевалось, что для каждого юзера запускается отдельная копия программы, которая представляет собой http-сервер. На одном порту прослушивать сокет на предмет входящих соединений вряд ли можно сделать для нескольких программ.
    Маньяк Робокряк колесит по городу
    Re[4]: Нужно делать скриншот из службы
    От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
    Дата: 04.10.10 19:02
    Оценка:
    Здравствуйте, Muxa, Вы писали:

    M>как вариант можно совместить два подхода: служба при логине какого-либо пользователя, запускает десктопное приложение (от имени это пользователя), которое скриншотит его активность. далее сервис берет скриншоты и отсылет их "кому надо".


    Так как задача была вполне конкретная — реализовать под XP, то я сделал сервис и не парился особо, GetDC(0) возвращает именно то, что нужно, скриншотик делается с рабочего стола залогиненого пользователя, завтра отдам в заказавший прогу отдел, попрошу, чтобы поэкспериментировали, что происходит при нескольких залогиненый юзерах, когда еще никто не залогинился, или когда залогинились через удаленный рабочий стол.
    Маньяк Робокряк колесит по городу
    Re[5]: Нужно делать скриншот из службы
    От: Mr.Delphist  
    Дата: 05.10.10 11:57
    Оценка: 6 (1)
    Здравствуйте, Marty, Вы писали:

    M>Здравствуйте, Mr.Delphist, Вы писали:


    M>Подразумевалось, что для каждого юзера запускается отдельная копия программы, которая представляет собой http-сервер. На одном порту прослушивать сокет на предмет входящих соединений вряд ли можно сделать для нескольких программ.


    При таком раскладе — опять же, проблем нет:
    1) Стартуете сервис (именно сервис) с http-сервером. Он испольняет роль прокси: с одной стороны, он слушает логины юзеров, а с другой — запросы извне и либо соощает "нет активных юзеров", либо отдает что надо (единственно, если память не изменяет, учётка LocalSystem для этого не пойдет ввиду security restrictions).
    2) При логине юзера, под его учеткой стартует трей-утилита, которая цепляется к http-серверу и регистрируется каким-либо образом (в простейшем случае — просто сообщает имя учетки)
    3) Теперь можно снаружи ходить на нашу проксю и просить скриншоты нужного юзера, равно как и узнавать список текущих юзеров etc. Т.е. это уже определяется протоколом взаимодействия.
    Re[6]: Нужно делать скриншот из службы
    От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
    Дата: 05.10.10 14:41
    Оценка:
    Здравствуйте, Mr.Delphist, Вы писали:

    MD>...

    MD>При таком раскладе — опять же, проблем нет:
    MD>...

    Это-то все да, просто надо два экзешника делать. Под XP решилось одним только сервисом, без дополнительных экзешников. Пока для Vista/Win7 вопрос не стоит, но под них видимо придется так и делать.
    Маньяк Робокряк колесит по городу
    Re[7]: Нужно делать скриншот из службы
    От: Baskak Россия  
    Дата: 05.10.10 15:30
    Оценка:
    Здравствуйте, Marty, Вы писали:

    ...

    M>Это-то все да, просто надо два экзешника делать. Под XP решилось одним только сервисом, без дополнительных экзешников. Пока для Vista/Win7 вопрос не стоит, но под них видимо придется так и делать.


    Да тут никто и не говорил про два экзешника
    Пусть экзешник сервиса при передаче ему определенного параметра командной строки запускается в клиентской сессии как десктопное приложение. Кто ему мешает?
    Re[8]: Нужно делать скриншот из службы
    От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
    Дата: 05.10.10 16:17
    Оценка: :)
    Здравствуйте, Baskak, Вы писали:

    B>Да тут никто и не говорил про два экзешника

    B>Пусть экзешник сервиса при передаче ему определенного параметра командной строки запускается в клиентской сессии как десктопное приложение. Кто ему мешает?

    Ну это все равно навороты, пока не нужные
    И, кстати, exe сервиса это консольное приложение, а клиентское надо бы делать оконным. Можно конечно прихлопнуть свою консоль, но она все равно ведь будет мелькать на экране
    Маньяк Робокряк колесит по городу
    Re[3]: Нужно делать скриншот из службы
    От: CreatorCray  
    Дата: 06.10.10 07:00
    Оценка: 1 (1)
    Здравствуйте, filkov, Вы писали:

    MD>>Представьте себе ситуацию: серверная версия ОС, одновременно залогинены несколько юзеров. Чей стол Вы будете грабить из сервиса?

    MD>>А если админ-параноик выключит галочку "разрешить взаимодействие с рабочим столом"?
    MD>>Приложение, работающее в контексте нужного юзера — самый безпроблемный вариант.

    F>В любом случае службе придётся:

    F>1. Обнаруживать активных пользователей;
    WTSEnumerateSessionsW

    F>2. Выбирать нужного пользователя;

    for (int i=0;i<dwCount;i++)
      if ((pInfoPtr[i].State == WTSActive) && (тот шо нам нужен))


    F>3. "Прикидываться" этим пользователем (impersonate), чтобы получить доступ к его ресурсам.

    HANDLE hUserToken;
    WTSQueryUserToken(index, &hUserToken);
    CreateProcessAsUserW (hUserToken, ...


    Запускаем из сервиса в контексте нужного юзера свою прогу, которая скриншотит его экран и передаёт в сервис.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Re[5]: Нужно делать скриншот из службы
    От: Muxa  
    Дата: 06.10.10 07:32
    Оценка:
    M>завтра отдам в заказавший прогу отдел, попрошу, чтобы поэкспериментировали, что происходит при нескольких залогиненый юзерах, когда еще никто не залогинился, или когда залогинились через удаленный рабочий стол.
    Сообщите результаты тестов. Интересно.
    Re[7]: Нужно делать скриншот из службы
    От: Mr.Delphist  
    Дата: 06.10.10 08:25
    Оценка:
    Здравствуйте, Marty, Вы писали:

    M>Это-то все да, просто надо два экзешника делать.


    Если у Вас Visual Studio — то там делаете два проекта в одном solution, об обстальном позаботится компилер/линкер.
    Об усложнении инсталера можно не жаловаться — он у Вас и так нетривиальный, ежели с сервисами завязались.
    Re[3]: Нужно делать скриншот из службы
    От: Pavel Dvorkin Россия  
    Дата: 06.10.10 10:33
    Оценка:
    Здравствуйте, Marty, Вы писали:

    M>Уточню задачу. Программа не общего назначения, а решает отдельную задачу. Надо делать снимок с экрана — текущего, активного, который отображается на мониторе в данный момент, вне зависимости от того сколько юзеров залогинилось, и отсылать его по сети (раздавать по http). Админ-параноик исключен. В случае трея на каждого юзера своя копия программы, как тогда выделять порты для http-сервера? И как узнавать, на какой порт коннетится?


    Я сейчас сижу за домашней машиной и имею выход на рабочую по RDP. Там я вижу свой рабочий экран. Если же я сяду за рабочую, то увижу только экран winlogon. Но если войду там — увижу свой рабочий экран там.
    With best regards
    Pavel Dvorkin
    Re[4]: Нужно делать скриншот из службы
    От: Alexey Frolov Беларусь  
    Дата: 06.10.10 11:05
    Оценка:
    Здравствуйте, Pavel Dvorkin, Вы писали:

    PD>Здравствуйте, Marty, Вы писали:


    M>>Уточню задачу. Программа не общего назначения, а решает отдельную задачу. Надо делать снимок с экрана — текущего, активного, который отображается на мониторе в данный момент, вне зависимости от того сколько юзеров залогинилось, и отсылать его по сети (раздавать по http). Админ-параноик исключен. В случае трея на каждого юзера своя копия программы, как тогда выделять порты для http-сервера? И как узнавать, на какой порт коннетится?


    PD>Я сейчас сижу за домашней машиной и имею выход на рабочую по RDP. Там я вижу свой рабочий экран. Если же я сяду за рабочую, то увижу только экран winlogon.


    Ну это как бы логично, активный пользователь сейчас под RDP, соответственно его снимок и нужен, а винлогон обычно никому не интересен.

    PD> Но если войду там — увижу свой рабочий экран там.


    Скорее всего в вашем случае, при входе через реальный терминал (клавиатура, монитор) — отсохнет RDP соединение. В случае терминального сервера могут присутствовать несколько терминальных сессий даже одного и того же пользователя, с разным набором приложений и соответственно картинок
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.