Была поставлена такая задача: логировать входы и выходы доменных пользователей на ПК с сохранением информации в БД MS SQL. Реализована данная задача скриптами на VB scrit и powershell. Один из скриптов повесить групповой политикой на logoff (выход пользователя из системы).
Const adOpenStatic = 3
Const adLockOptimistic = 3
strComputer = “.”
Set objConnection = CreateObject(“ADODB.Connection”)
Set objRecordSet = CreateObject(“ADODB.Recordset”)
Set objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate}!\” & strComputer & ”
ootcimv2″)
Set colItems = objWMIService.ExecQuery(“Select * from Win32_LocalTime”)
Set colItems1 = objWMIService.ExecQuery(“Select * from Win32_NetworkLoginProfile where FullName is not null”,,48)
Set colOperatingSystems = objWMIService.ExecQuery (“Select * from Win32_OperatingSystem”)
Set objNetwork = WScript.CreateObject(“WScript.Network”)
objComp = objNetwork.ComputerName
For Each objItem in colItems1 \’Сохранить имя и фамилию юзера
user1 = objItem.FullName
Next
user =CreateObject(“WScript.Network”).UserName
For Each objItem in colItems \’сохранить время выхода юзера
time_out = objItem.Year & “-” & objItem.Month & “-” & objItem.Day & ” ” & objItem.Hour & “:” & objItem.Minute & “:” & objItem.Second
Next
Function WMIDateStringToDate(dtmStart)
WMIDateStringToDate = CDate(Mid(dtmStart, 5, 2) & “/” & _
Mid(dtmStart, 7, 2) & “/” & Left(dtmStart, 4) _
& ” ” & Mid (dtmStart, 9, 2) & “:” & _
Mid(dtmStart, 11, 2) & “:” & Mid(dtmStart, _
13, 2))
End Function
For Each objOS in colOperatingSystems
dtmBootup = objOS.LastBootUpTime
dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
time_in = dtmLastBootupTime \’сохранить время входа юзера
duration = DateDiff(“s”, dtmLastBootUpTime, Now) \’сохранить uptime машины в секундах
Next
objConnection.Open _
“Provider=SQLOLEDB;Data Source=Server_DB;” & _
“Trusted_Connection=Yes;Initial Catalog=Login_DB;” & _
“User ID=DB_User;Password=User_PASS;”
objConnection.Execute “INSERT INTO dbo.Logs(UserName, DateTimeOut, UpTimeSec, DateTimeIn, Computer) VALUES (\’”& user &”\’, \’”& time_out &”\’, \’”& duration &”\’, \’”& time_in &”\’, \’”& objComp &”\’)”
objConnection.Close
Такой же по функционалу, но уже на powershell
#Get Current Time
$time2 = Get-Date
#Get Logged-On User Details
$user = Get-WmiObject Win32_Computersystem -ComputerName “.”
#Get Time User Logged On
$time1 = Get-EventLog -LogName System -InstanceId 7001 -Newest 1
#Set Variables for SQL
$LogonDateTime = get-date -Format “MMM dd yyyy HH:mm:ss”
$WorkstationName = Get-Content env:ComputerName
$LoggedOnUser = $user.UserName
$TimeToLogon = $time2.TimeOfDay.TotalSeconds – $time1.TimeGenerated.TimeOfDay.TotalSeconds
$LogoutDateTime=$time1.TimeGenerated
## Write Values to SQL
$dbconn = New-Object System.Data.SqlClient.SqlConnection(“Data Source=Server_DB; Initial Catalog=Login_DB; Integrated Security=SSPI; User Id=User_DB; Password=User_PASS;Trusted_Connection=true;”)
$dbconn.Open()
$dbwrite = $dbconn.CreateCommand()
$dbwrite.CommandText = “INSERT INTO dbo.tbLogons (LogonDateTime, LogoutDateTime, LoggedOnUser, WorkstationName,DurationLogon) VALUES (\’$LogoutDateTime\’,\’$time2\’,\’$LoggedOnUser\’,\’$WorkstationName\’,\’$TimeToLogon\’)”
$dbwrite.ExecuteNonQuery()
$dbconn.Close()
Обратите внимание, что для того, чтобы скрипт выполнялся на серверах, необходимо дать разрешение на выполнение скриптов. Для разрешения выполнения любых powershell скриптов.
Set-ExecutionPolicy Unrestricted
Поэтому, чтобы не отключать данный режим можно использовать vbs.
Скрипты протестированы на Windows XP, 7, Windows Server 2008 R2, Windows Server 2012.
Результатом работы будет таблица в базе данных со строкой имя пользователя, дата входа и выхода, время работы пользователя.
Немного измененный скрипт, с более детальным сбором информации: [attachment=5:audit_logon_user_win7.txt]
Скрипту нужно изменить расширение на vbs.
Leave a Reply