Определение того, как долго пользователь находится в Windows
В нашем продукте возникла необходимость определить, как долго текущий пользователь находится в системе Windows (в частности, Vista). Похоже, для этого нет прямой функции API, и я не смог найти ничего подходящего для WMI (хотя я не эксперт в WMI, так что, возможно, я что-то пропустил).
Любые идеи?
Ответов (5)5
Для людей, не знакомых с WMI (например, я), вот несколько ссылок:
- Страница MSDN об использовании WMI на разных языках: http://msdn.microsoft.com/en-us/library/aa393964(VS.85).aspx
- ссылка на Win32_Session: http://msdn.microsoft.com/en-us/library/aa394422(VS.85).aspx , но объекты в Win32_session имеют тип Win32_LogonSession ( http://msdn.microsoft.com/en -us / library / aa394189 (VS.85) .aspx ), который имеет более интересные свойства.
- WMI Explorer - инструмент, который можно использовать для простого выполнения запросов, подобных тому, что опубликовал Михал.
А вот пример запроса 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
В Powershell и WMI следующая однострочная команда вернет список объектов, показывающий пользователя и время его входа в систему.
Get-WmiObject win32_networkloginprofile | ? {$_.lastlogon -ne $null} | % {[PSCustomObject]@{User=$_.caption; LastLogon=[Management.ManagementDateTimeConverter]::ToDateTime($_.lastlogon)}}
Объяснение:
- Получить список вошедших в систему пользователей из WMI
- Отфильтровать любых неинтерактивных пользователей (эффективно удаляет
NT AUTHORITY\SYSTEM
) - Изменяет время входа и пользователя для удобства чтения
Использованная литература:
- Используемый объект WMI: https://forum.sysinternals.com/topic3755.html
- Форматирование даты и времени: https://blogs.msdn.microsoft.com/powershell/2009/08/12/get-systemuptime-and-working-with-the-wmi-date-format/
Вы можете просто использовать 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
Другая информация, которую вы можете собрать, включает имя пользователя, последний выход из системы, а также различные данные, связанные с профилем.