Конференция "WinAPI" » Определение времени неактивности из службы
 
  • TempUser (29.01.11 03:54) [0]
    Здравствуйте.

    Есть задача определить время неактивности текущего пользователя консоли компьютера из службы. До Windows Vista прекрасно работала процедура GetLastInputInfo, однако, в "висте" и "семерке" GetLastInputInfo возвращает время неактивности учетной записи SYSTEM
    Пробовал использовать ImpersonateLoggedOnUser - без эффекта.


    WTSQueryUserToken(WTSGetActiveConsoleSessionId(), CurrentUserHandle);

    if ImpersonateLoggedOnUser(CurrentUserHandle) then
    try
     Success := GetLastInputInfo(LII);
    finally
     RevertToSelf;
    end;



    Вопрос - как все-таки получить время неактивности текущего пользователя консоли из службы, запущенной от имени SYSTEM ?
  • Leonid Troyanovsky © (29.01.11 12:32) [1]

    > TempUser   (29.01.11 03:54)  

    > Есть задача определить время неактивности текущего пользователя
    > консоли компьютера из службы

    Извещать службу об активности может клиент, стартующий,
    например, из автозапуска.

    --
    Regards, LVT.
  • Anatoly Podgoretsky © (29.01.11 13:33) [2]
    > TempUser  (29.01.2011 03:54:00)  [0]

    Если раньше работало, то по причине ошибки, сейчас работает правильно,
    текущий пользователь SYSTEM
  • TempUser (29.01.11 23:53) [3]

    > Leonid Troyanovsky ©   (29.01.11 12:32) [1]

    Спасибо. Я уже думал об этом варианте, но сателлит могут завершить или отключить автозапуск, а для клиента важно, чтобы программа сработала со 100% гарантией. А строить систему отслеживания выполнения сателлита из службы и его перезапуск в случае завершения - это уж слишком "навороченно" для столь тривиальной задачи, ИМХО, конечно. Неужели, нет способа проще...
    Сейчас написал драйвера фильтры на клавиатуру и мышь, но тут проблем тоже, увы, хватает.


    > Anatoly Podgoretsky ©   (29.01.11 13:33) [2]

    Полностью согласен. Мне до сих пор не понятна логика программистов Микрософта, обеспечивших такую реализацию данной функции вплоть до WinXP включительно.

    p.s. Попытался кроме имперсонации присвоить потоку службы активную рабочую станцию и десктоп. На висте сработало - на семерке - нет.

    Вопрос знатокам - что я еще забыл присвоить в семерке ? :)
  • Rouse_ © (30.01.11 01:58) [4]

    > Я уже думал об этом варианте, но сателлит могут завершить
    > или отключить автозапуск

    Запускай тогда его руками: http://rouse.drkb.ru/winapi.php#servicenotifyer
  • TempUser (01.02.11 21:21) [5]

    > Rouse_ ©   (30.01.11 01:58) [4]

    Вы не до конца процитировали - в отсутствующей части цитаты я сказал, что запущенный сателлит с отслеживанием его завершения - это перебор для этой задачи. А если Вы предлагаете запускать и завершать сателлит каждый раз, когда нужно узнать время неактивности - то, с учетом, что делать это нужно раз в 5-10 секунд, большая часть процессорного времени будет уходить на создание и завершение процесса-сателлита :)
 
Конференция "WinAPI" » Определение времени неактивности из службы
Есть новые Нет новых   [134431   +12][b:0][p:0.001]