Определение того, как долго пользователь находится в Windows

В нашем продукте возникла необходимость определить, как долго текущий пользователь находится в системе Windows (в частности, Vista). Похоже, для этого нет прямой функции API, и я не смог найти ничего подходящего для WMI (хотя я не эксперт в WMI, так что, возможно, я что-то пропустил).

Любые идеи?

Ответов (5)

Решение

Для людей, не знакомых с WMI (например, я), вот несколько ссылок:

А вот пример запроса Win32_Session из VBS:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set sessions = objWMIService.ExecQuery _
   ("select * from Win32_Session")

For Each objSession in sessions
   Wscript.Echo objSession.StartTime
Next

Он предупреждает о 6 сеансах для моего персонального компьютера, возможно, вы можете отфильтровать по LogonType, чтобы отображались только реальные («интерактивные») пользователи. Я не видел, как можно выбрать сеанс «текущего пользователя».

[редактировать] и вот результат Google по вашей проблеме: http://forum.sysinternals.com/forum_posts.asp?TID=3755

В WMI выполните: «select * from Win32_Session», там у вас будет значение «StartTime».

Надеюсь, это поможет.

В Powershell и WMI следующая однострочная команда вернет список объектов, показывающий пользователя и время его входа в систему.

Get-WmiObject win32_networkloginprofile | ? {$_.lastlogon -ne $null} | % {[PSCustomObject]@{User=$_.caption; LastLogon=[Management.ManagementDateTimeConverter]::ToDateTime($_.lastlogon)}}

Объяснение:

  • Получить список вошедших в систему пользователей из WMI
  • Отфильтровать любых неинтерактивных пользователей (эффективно удаляет NT AUTHORITY\SYSTEM)
  • Изменяет время входа и пользователя для удобства чтения

Использованная литература:

Вы можете просто использовать CMD или PowerShell для запроса пользователей с помощью команды:

C:\> query user
USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
john                  rdp-tcp#56          9  Active          .  5/3/2020   10:19 AM
max                   rdp-tcp#5          30  Active    5+23:42  9/4/2020   7:31  PM
yee                                      35  Disc         6:41  10/14/2020 6:37  PM
mohammd               rdp-tcp#3          37  Active          .  10/15/2020 7:51  AM

Win32Session - отличное начало с использованием WMI. Также следует отметить, что если вы находитесь в сети, вы можете использовать Win32_NetworkLoginProfile для получения всевозможной информации.

Set logins = objWMIService.ExecQuery _
   ("select * from Win32_NetworkLoginProfile")
For Each objSession in logins
   Wscript.Echo objSession.LastLogon
Next

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