Определение того, как долго пользователь входит в систему Windows
-
08-06-2019 - |
Вопрос
В нашем продукте возникла необходимость определить, как долго текущий пользователь входил в систему под управлением Windows (в частности, Vista).Кажется, для этого нет прямой функции API, и я не смог найти ничего подходящего для WMI (хотя я не эксперт в WMI, поэтому, возможно, я что-то пропустил).
Есть какие-нибудь идеи?
Решение
Для людей, не знакомых с WMI (таких, как я), вот несколько ссылок:
- Страница MSDN по использованию WMI на разных языках: http://msdn.microsoft.com/en-us/library/aa393964 (ПРОТИВ 85).aspx
- ссылка на Win32_Session: http://msdn.microsoft.com/en-us/library/aa394422 (ПРОТИВ 85).aspx, но объекты в Win32_session имеют тип Win32_LogonSession (http://msdn.microsoft.com/en-us/library/aa394189 (ПРОТИВ 85).aspx), который обладает более интересными свойствами.
- Проводник 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 сеансах для моего персонального компьютера, возможно, вы можете отфильтровать по типу входа, чтобы перечислить только реальных ("интерактивных") пользователей.Я не смог понять, как вы можете выбрать сеанс "текущего пользователя".
[редактировать] и вот результат от 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/
В WMI делаем:"выберите * из Win32_Session" там у вас будет значение "startTime".
Надеюсь, это поможет.
Используя WMI, Win32Session - отличное начало.Кроме того, следует отметить, что если вы находитесь в сети, вы можете использовать Win32_NetworkLoginProfile для получения всевозможной информации.
Set logins = objWMIService.ExecQuery _
("select * from Win32_NetworkLoginProfile")
For Each objSession in logins
Wscript.Echo objSession.LastLogon
Next
Другие фрагменты информации, которые вы можете собрать, включают имя пользователя, последний выход из системы, а также различные данные, связанные с профилем.