문제
우리 제품에서는 현재 사용자가 Windows(특히 Vista)에 로그온한 기간을 확인해야 할 필요성이 생겼습니다.이에 대한 직접적인 API 기능은 없는 것 같고 WMI와 관련된 내용을 찾을 수 없습니다. (비록 저는 WMI 전문가가 아니므로 뭔가를 놓쳤을 수도 있습니다.)
어떤 아이디어가 있나요?
해결책
나처럼 WMI에 익숙하지 않은 사람들을 위한 링크는 다음과 같습니다.
- 다양한 언어의 WMI 사용에 대한 MSDN 페이지: 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 탐색기 - Michal이 게시한 것과 같은 쿼리를 쉽게 실행하는 데 사용할 수 있는 도구입니다.
다음은 VBS에서 Win32_Session을 쿼리하는 예입니다.
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에서는 다음을 수행합니다."SELECT * FROM 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
수집할 수 있는 기타 정보에는 사용자 이름, 마지막 로그오프 및 다양한 프로필 관련 정보가 포함됩니다.