Была поставлена такая задача: логировать входы и выходы доменных пользователей на ПК с сохранением информации в БД MS SQL. Реализована данная задача скриптами на VB scrit и powershell. Один из скриптов повесить групповой политикой на logoff (выход пользователя из системы).

Скрипт на VBS — создаем текстовый файл с содержимым представленyым ниже, меняем расширение на vbs.

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.