purebasic.info

PureBasic forum
Текущее время: Сб окт 20, 2018 1:08 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Время простоя системы + служба
СообщениеДобавлено: Вс май 20, 2018 3:57 am 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Имеется служба, работающая естественно под учеткой System. Есть некоторое кол-во сотрудников с разными учетками на том же компе. Необходимо из запущенной службы отслеживать бездействие пользователей на компе. Если требуется отследить активность текущего пользователя из под его же учетки, тут без проблем используется апишная функция GetLastInputInfo. Но вот как следить за всеми возможными пользователями из службы - не могу пока решить.

Натыкался на вот такую текстовку:

Цитата:
Alternative to get system-wide user input

As stated above GetLastInputInfo does not retrieve input information across user sessions. Also if you try to call it for a service, it will succeed but will always result in returning the same tick count. That is because services are running in their own non-interactive desktop that will never receive user input.

The only way to use GetLastInputInfo from a local service is to start a user-mode process in each logon user session (check CreateProcessAsUser) and call it from there. After that user-mode process needs to use IPC (such as a named-pipe, or a named global event if all you need to signal is "activity happened") to send data back to the service.

There's one simpler way to retrieve system-wide activity on Windows Vista and later OS though. You'll get a "very clunky" output, but it will work system-wide. Call CallNtPowerInformation with SystemPowerInformation and examine the TimeRemaining member of the SYSTEM_POWER_INFORMATION struct. This value will be updated every "now-and-then" if there's no system-wide user activity. The question that I struggled with, is "how often is 'now-and-then'?" The answer doesn't seem to be as straightforward as it seems. It depends on the OS. For Vista it is done every 10 seconds or so, for Windows 7 - every 15 sec, and for Windows 8 - every 30 seconds. For Windows XP though, it is updated ONLY if the "Put computer to sleep" setting in the Power Options in Control Panel is set to something other than "Never". So I would not use it on XP.


но пока не въезжаю как реализовать первый вариант. Что касается второго - это какие-то костыли под куполом цирка в лунную ночь.

У кого-то есть идеи, наброски кода?

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Время простоя системы + служба
СообщениеДобавлено: Вс май 20, 2018 10:43 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Нужно вызвать LogonUser для получения токена безопасности, а затем запустить программу функцией CreateProcessAsUser. Или использовать функцию CreateProcessWithLogonW для запуска процессов в сеансе каждого пользователя.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Время простоя системы + служба
СообщениеДобавлено: Пт май 25, 2018 6:29 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 220
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Если неполучится таким образом, то можно узнавать имя пользователя и делать скриншеты, на скрине видно что делается, а простой и работа проги ничего недает. Например я за чемто работаю а его загрузка проца разная, но я же работаю. я не всегда пишу, но и читаю, но это незначит что я ничего неделаю, но в это время мышка и клава может нетрогаться и время простоя системы ростет. А значит неверная оценка работников гарантирована. А вот сриншет, время, дата и имя юзера может показть точно что делал тот или иной пользователь.
ниже несколько кусков кода может пригодится.

++++имя текущего пользователя кажется
Код:
1
2
3
4
S$=Space(2000)
A=2000
Debug  (GetUserName_(@s$,@A))
Debug S$



+++вот еще одно имя(группы наверное)
Код:
1
2
3
4
5
S$=Space(1000)
A=1000
Debug Hex(GetActiveWindow_())
GetComputerName_(@S$,@A)
Debug "NAME "+S$




+++++время простоя системы(счетчик сбрасывается если нажита клава или мыша бегает)
Код:
1
2
3
4
5
6
7
8
9
10
11
Structure LASTINPUTINFO
    cbSize.l
    dwTime.L
  EndStructure
 
x.LASTINPUTINFO\cbSize = SizeOf(LASTINPUTINFO)
Repeat
  Delay(10)
  GetLastInputInfo_(x)
  Debug GetTickCount_()-x\dwTime
ForEver





+++вот прога выдает все окна которые открыты, они отражаются в панеле задач внизу
(сюда невходят проги и процесы у которых нет окон).
кстати этот список прог рекомендуется тоже сохранять время от времени.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nw=0 ; Number of found windows.
Dim wh(999) ; Each window's handle.
Dim wt$(999) ; Each window's title.
; Prepare to show all found windows.
OpenConsole()
PrintN("[Handle] Title")
PrintN("")
; Now find them all!
r=GetWindow_(GetDesktopWindow_(),#GW_CHILD) ; Start at the Desktop level.
n=1
Repeat
  a$=Space(255) : GetWindowText_(r,a$,255) ; Prepare title buffer and get title.
  If a$<>"" And a$<>"Program Manager" ; Ignore "fake" windows and the Desktop.
    If IsWindowVisible_(r)=#True ; We found an open window!
      nw=nw+1 : wh(nw)=r : wt$(nw)=a$ ; Store its handle/title in variables.
      PrintN(Str(n)+" ["+Str(r)+"] "+a$) ; Show the handle/title in the console.
      n+1
    EndIf
  EndIf
  r=GetWindow_(r,#GW_HWNDNEXT) ; Find next window until no more are found.
Until r=0
Input()





++++имя окна, его клас(+ фокус, если открыть папку Program Files, будет всегда ее сворачивать)+любое выделеное окно будет показывать его клас и имя, так можно опрелелить с каким окном работаеш...
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#BufferSize=2000
 
For i=0 To 1000
 S$=Space(2000)
A=2000
handle=GetForegroundWindow_()
Debug  (GetWindowText_(handle,@s$,A))
Debug S$
  Class.s = Space(#BufferSize)
  GetClassName_(handle, @Class, Len(Class))
Debug Class
;ФОКУС ЭТИХ СТРОЧКАХ
If s$="Program Files" And Class="CabinetWClass"
    CloseWindow_(GetForegroundWindow_())
    Beep_(500,200)
EndIf
Delay(500)
Next


_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Время простоя системы + служба
СообщениеДобавлено: Пн июн 18, 2018 3:36 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 220
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Подскажите как узнать для каждого диска текущую папку, гдето пример у себы был, немогу найти. Когда например открываю папку C:\_TEST то в эту функцию достаточно снести "C:\", а на выходе получу полный путь т. е. C:\_TEST

_________________
искатель истины


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB