-
Здравствуйте. Есть задача определить время неактивности текущего пользователя консоли компьютера из службы. До Windows Vista прекрасно работала процедура GetLastInputInfo, однако, в "висте" и "семерке" GetLastInputInfo возвращает время неактивности учетной записи SYSTEM Пробовал использовать ImpersonateLoggedOnUser - без эффекта.
WTSQueryUserToken(WTSGetActiveConsoleSessionId(), CurrentUserHandle);
if ImpersonateLoggedOnUser(CurrentUserHandle) then
try
Success := GetLastInputInfo(LII);
finally
RevertToSelf;
end;
Вопрос - как все-таки получить время неактивности текущего пользователя консоли из службы, запущенной от имени SYSTEM ?
-
> TempUser (29.01.11 03:54) > Есть задача определить время неактивности текущего пользователя > консоли компьютера из службы
Извещать службу об активности может клиент, стартующий, например, из автозапуска.
-- Regards, LVT.
-
> TempUser (29.01.2011 03:54:00) [0]
Если раньше работало, то по причине ошибки, сейчас работает правильно, текущий пользователь SYSTEM
-
> 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]
Вы не до конца процитировали - в отсутствующей части цитаты я сказал, что запущенный сателлит с отслеживанием его завершения - это перебор для этой задачи. А если Вы предлагаете запускать и завершать сателлит каждый раз, когда нужно узнать время неактивности - то, с учетом, что делать это нужно раз в 5-10 секунд, большая часть процессорного времени будет уходить на создание и завершение процесса-сателлита :)
|