32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
1
VBS

Логирование в файл на сервере входа и выхода пользователей

18.04.2016, 08:13. Показов 8281. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Видел на просторах интернета такую идею скрипта: при входе пользователя запускается какой-то сценарий и в папочку на домене в лог-файл производится запись времявхода, имяюзера, ФИО, имя компа на который он вошёл... При выходе или выключении компа запускается аналогичный сценарий только с записью времени выхода. Так же в случае удалёного сеанса RDP либо RemoteAPP так же кто, во сколько и куда вошёл и вышел..

Как бы удобная штука, для анализа кто во сколько и куда заходил выходил - для сисадмина. Такой лог удобней анализировать в случае каких-то проишествий, нежели анализировать расшифровывать логи виндовс сервера.

Подскажите может у кого есть такой или наработки, а то я даже не знаю с чего начинать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2016, 08:13
Ответы с готовыми решениями:

Мониторинг входа/выхода пользователей
Нужно написать скрипт,который записывал бы время,дату и имя компьютера в txt файл,сразу же после...

История входа/выхода пользователей в WindowsServer
WinServer 2012 Ребятушки, помогите разобраться. Эта тема мне очень помогла (5), но теперь вопрос в...

Создать кнопку входа-регистрации-выхода для пользователей сайта
Каким образом в теле страницы (в заголовке, например или в меню) задать кнопку "Вход"...

Авторизация не доменных пользователей на файл-сервере
Итак, есть два сервера w2k8 r2, один из них контроллер домена, DHCP и DNS сервер; второй - файл...

33
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
16.02.2017, 08:48  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Dmitrii Посмотреть сообщение
А так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim objWMI, objCollection, objItem, arrSubKeys, intOSVersion, strType
Const HKCU = &H80000001
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT Version FROM Win32_OperatingSystem")
For Each objItem In objCollection
 intOSVersion = CInt(Replace(Left(objItem.Version, 3), ".", ""))
Next
Set objItem = Nothing: Set objCollection = Nothing
Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
If intOSVersion > 52 Then
 objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
 objWMI.GetStringValue HKCU, "Volatile Environment" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", strType
Else
 objWMI.GetStringValue HKCU, "Volatile Environment", "SESSIONNAME", strType
End If
Set objWMI = Nothing
WScript.Echo strType
Разобрался как работает скрипт и что ищет, но не могу в конце скрипта вывести WScript.Echo strType. ругается с ошибкой
Oшибкa: Hecooтвeтcтвиe типa
Кoд: 800A000D
Как проверить что суёт в эту переменную? тип данных какой?
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
16.02.2017, 09:49 22
Цитата Сообщение от xeon13 Посмотреть сообщение
... тип данных какой?
Используйте функцию TypeName():
Visual Basic
1
WScript.Echo TypeName(strType)
0
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
16.02.2017, 11:56  [ТС] 23
WScript.Echo TypeName(strType) - пишет Null
Что может быть не так?

Добавлено через 1 час 4 минуты
И ещё:
Visual Basic
1
strVer = LCase(GetObject("LDAP://" & objSysInfo.ComputerName).operatingSystemVersion)
При запуске скрипта на компе без контроллера домена выводит ошибку. есть способ получить "objSysInfo.ComputerName" без LDAP ?
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
16.02.2017, 14:10 24
Цитата Сообщение от xeon13 Посмотреть сообщение
... Что может быть не так?
Проверьте наличие параметра SESSIONNAME в ветке реестра HKEY_CURRENT_USER\Volatile Environment\x\, где x - число, являющееся именем подраздела, сопоставленного с сеансом текущего пользователя.
Если с этим всё в порядке, то попробуйте добавить в сценарий оператор приостановки на несколько секунд перед оператором подключения к WMI-классу StdRegProv:
Visual Basic
1
2
WScript.Sleep 3000
Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
Цитата Сообщение от xeon13 Посмотреть сообщение
... есть способ получить "objSysInfo.ComputerName" без LDAP ?
Нет.
0
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
16.02.2017, 15:32  [ТС] 25
наваял тут скрипт:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Set objNetwork = CreateObject("WScript.Network")
objComputerName = objNetwork.ComputerName
objUSerName = objNetwork.USerName
Set objSysInfo = CreateObject("ADSystemInfo")
Const HKCU = &H80000001
 
'Определение типа подключения (интерактивное CONSOLE или RDP-терминал)
Set objShell = CreateObject("WScript.Shell")
SessName = UCase(objShell.ExpandEnvironmentStrings("%SESSIONNAME%"))
 
'Проверка можно раскоментировать
'WScript.Echo SessName
 
'Если Windows Больше версии Server 2003 >
'#############Для информации##############
'VER 5.0="Windows 2k"
'VER 5.1.="Windows XP"
'VER 5.2.="Windows 2003"
'VER 6.0.="Windows Vista"
'VER 6.1.="Windows 7"
'VER 6.2.="Windows 8"
'VER 6.3.="Windows 8.1"
'VER 10.0.="Windows 10"
'#########################################
 
If SessName = "%SESSIONNAME%" Then 
strVer = LCase(GetObject("LDAP://" & objSysInfo.ComputerName).operatingSystemVersion)
Set objSysInfo = Nothing
  If Len(strVer) > 0 Then
    strVer = CInt(Replace(Left(strVer, 3), ".", ""))
     If strVer > 52 Then
        Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
        objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
        objWMI.GetStringValue HKCU, "Volatile Environment" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", SessName
        Set objWMI = Nothing
     Else
        SessName = CreateObject("WScript.Shell").Environment("Volatile").Item("SESSIONNAME")
     End If
  End If
End If
 
'Проверка можно раскоментировать
'WScript.Echo "1 " & SessName
 
On Error ReSume Next
 
'(ForWriting 2 Открытие файла для записи. Если существует файл с таким же именем, его содержимое перезаписывается.)
ConSt ForWriting = 2
 
'(ForReading 1 Открытие файла только для чтения. Запись в этот файл невозможна.)
ConSt ForReading = 1
 
'(ForAppending 8 Открытие файла и запись в конец файла.)
ConSt ForAppending = 8
 
'(TristateFalse 0 Открывает файл в формате ASCII.)
ConSt TriStateFalSe = 0
 
Set fSo = CreateObject("Scripting.FileSyStemObject")
Set GObjArgS = WScript.ArgumentS
GStrCmd = GObjArgS(0)
Call crypt(GStrCmd)
 
Sub crypt(mSg)
n = Len(mSg)
c = 0
Do Until c = n
c = c + 1
t1 = Mid(mSg,c,1)
ch = Chr(aSc(t1)+n)
output = output & ch
Loop
 
Set logFile = fSo.OpenTextFile("\\TSServer\LogONOff$" & objComputerName & "_" & month(now()) & "." & year(now()) & ".txt",ForAppending,True)
logFile.WriteLine "#################################"
logFile.WriteLine Date & " " & Time
logFile.WriteLine "LOGON: " & "(" & SessName & ")" & vbNewLine & "Comp: " & (objComputerName) & vbNewLine & "User: " & (objUSerName)
'logFile.WriteLine "#################################"
GObjLocalF.CloSe
End Sub
 
WScript.Quit 0
Вобщем на контроллере домена прекрасно работает. разные ОС вроде-бы показывают правильно консольный или RDP вход.
Но на сервере который не в домене (всунул через gpedit.msc) пишет ошибку:
Cтpoкa: 35
Cимвoл: 1
Oшибкa: He yдaлocь пoлyчить дaнныe o кoнфигypaции oт
кoнтpoллepa дoмeнa. Либo oн oтключeн, либo к нeмy нeт
дocтyпa.
Кoд: 80070547
Иcтoчник: (null)

Добавлено через 1 минуту
35тая строка эта:
Visual Basic
1
strVer = LCase(GetObject("LDAP://" & objSysInfo.ComputerName).operatingSystemVersion)
почему так происходит не могу понять. подскажите?
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
16.02.2017, 19:20 26
Цитата Сообщение от xeon13 Посмотреть сообщение
... почему так происходит...
Потому что сервер не входит в состав домена.
Поскольку единственная цель использования LDAP-интерфейса ADSystemInfo в вашем сценарии - это определение версии текущей ОС, то от его использования можно отказаться.
Версию ОС можно определять, например, с помощью WMI:
Visual Basic
1
2
3
4
5
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT Version FROM Win32_OperatingSystem")
For Each objItem In objCollection
    strVer = CInt(Replace(Left(objItem.Version, 3), ".", ""))
Next
или с помощью объекта WshShell:
Visual Basic
1
2
Set objWShell = CreateObject("WScript.Shell")
strVer = CInt(Replace(objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"), ".", ""))
Эти способы одинаково успешно будут работать и на тех компьютерах, которые входят в состав домена, и на тех,-
которые не входят.
1
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
17.02.2017, 09:17  [ТС] 27
Доделал.. Установил. Проверил. вроде работает. жду комментарии рекомендации и критику ошибок:
Скрипт рабочий! УРАА!!! получилось наконец-то именно то что я хотел и качесвтенно и 100% рабочее.
Dmitrii огромное тебе спасибо. без тебя бы скрипт не получился таким классным.
Кстати, выбрал WSH и был приятно удивлён насколько он быстро работает и не жрёт ресурсов при загрузке. компы и сессии грузятся быстрее чем грузились через LDAP.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
'#####################################################
'# Скрипт записи логов входа пользователя LOGON или LOGOFF "\\TSServer\LogONOff$"
'# в шаренную папку сервера. по умолчанию: LogONOff$
'# возникла необходимость контролировать входы и выходы.
'# в полученном логе различаются типы подключения интерактив или RDP
'# лог создаётся месяц.год.txt .
'# Автор E}|{uk@RUSnet (Димитровград) 2016г.
'# Большое спасибо за подсказки и помощь в написании скрипта tisha_ и Dmitrii (cyberforum.ru)
'#####################################################
 
 
Set objNetwork = CreateObject("WScript.Network")
objComputerName = objNetwork.ComputerName
objUSerName = objNetwork.USerName
Set objSysInfo = CreateObject("ADSystemInfo")
Const HKCU = &H80000001
 
'Определение типа подключения (интерактивное CONSOLE или RDP-терминал)
Set objShell = CreateObject("WScript.Shell")
SessName = UCase(objShell.ExpandEnvironmentStrings("%SESSIONNAME%"))
 
'Проверка можно раскоментировать
'WScript.Echo SessName
 
'Если Windows Больше версии Server 2003 >
'#############Для информации##############
'VER 5.0="Windows 2k"
'VER 5.1.="Windows XP"
'VER 5.2.="Windows 2003"
'VER 6.0.="Windows Vista"
'VER 6.1.="Windows 7"
'VER 6.2.="Windows 8"
'VER 6.3.="Windows 8.1"
'VER 10.0.="Windows 10"
'#########################################
 
If SessName = "%SESSIONNAME%" OR SessName <> " " Then 
Set objWShell = CreateObject("WScript.Shell")
strVer = CInt(Replace(objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"), ".", ""))
Set objSysInfo = Nothing
  If Len(strVer) > 0 Then
    strVer = CInt(Replace(Left(strVer, 3), ".", ""))
     If strVer > 52 Then
        Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
        objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
        objWMI.GetStringValue HKCU, "Volatile Environment" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", SessName
        Set objWMI = Nothing
     Else
        SessName = CreateObject("WScript.Shell").Environment("Volatile").Item("SESSIONNAME")
     End If
  End If
End If
 
'Проверка можно раскоментировать
'WScript.Echo "1 " & SessName
 
On Error ReSume Next
 
'(ForWriting 2 Открытие файла для записи. Если существует файл с таким же именем, его содержимое перезаписывается.)
ConSt ForWriting = 2
 
'(ForReading 1 Открытие файла только для чтения. Запись в этот файл невозможна.)
ConSt ForReading = 1
 
'(ForAppending 8 Открытие файла и запись в конец файла.)
ConSt ForAppending = 8
 
'(TristateFalse 0 Открывает файл в формате ASCII.)
ConSt TriStateFalSe = 0
 
Set fSo = CreateObject("Scripting.FileSyStemObject")
Set GObjArgS = WScript.ArgumentS
GStrCmd = GObjArgS(0)
Call crypt(GStrCmd)
 
Sub crypt(mSg)
n = Len(mSg)
c = 0
Do Until c = n
c = c + 1
t1 = Mid(mSg,c,1)
ch = Chr(aSc(t1)+n)
output = output & ch
Loop
 
'Если хотите формат создаваемого лога TSSERVER_17.02.2017.txt то раскомментируйте строку ниже.
'Set logFile = fSo.OpenTextFile("\\MATRIX3\LogONOff$" & objComputerName & "_" & Date & ".txt",ForAppending,True)
 
'Если хотите формат создаваемого лога TSSERVER_2.2017.txt то раскомментируйте строку ниже.
Set logFile = fSo.OpenTextFile("\\TSServer\LogONOff$" & objComputerName & "_" & month(now()) & "." & year(now()) & ".txt",ForAppending,True)
 
logFile.WriteLine "#################################"
logFile.WriteLine Date & " " & Time
logFile.WriteLine "LOGON: " & "(" & SessName & ")" & vbNewLine & "Comp: " & (objComputerName) & vbNewLine & "User: " & (objUSerName)
'logFile.WriteLine "#################################"
GObjLocalF.CloSe
End Sub
 
WScript.Quit 0
Результаты скрипта любая WinXp,2k3,7,2k8,8,10.. терминал или консоль:
#################################
Пт 17.02.17 9:33:12
LOGON: (Console)
Comp: SB2
User: user77

#################################
17.02.2017 9:32:19
LOGON: (RDP-Tcp#38)
Comp: TSSERVER
User: user19
#################################
17.02.2017 9:55:27
LOGOFF: (RDP-Tcp#16)
Comp: TSSERVER
User: user25
0
Любознательный
5649 / 1667 / 311
Регистрация: 10.03.2016
Сообщений: 3,782
17.02.2017, 10:06 28
Цитата Сообщение от xeon13 Посмотреть сообщение
получилось наконец-то именно то что я хотел
Поздравляю!
Не критично, возможно, но всё же напомню
1
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
17.02.2017, 10:24  [ТС] 29
Цитата Сообщение от YuS_2 Посмотреть сообщение
Не критично, возможно, но всё же напомню
Видимо я взял старую версию скрипта для тестирования и в ней остались эти неисправленные строки.

Готовый скрипт Доделал.. Установил. Проверил. вроде работает. жду комментарии рекомендации и критику ошибок:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
'#####################################################
'# Скрипт записи логов входа пользователя LOGON или LOGOFF "\\TSServer\LogONOff$"
'# в шаренную папку сервера. по умолчанию: LogONOff$
'# возникла необходимость контролировать входы и выходы.
'# в полученном логе различаются типы подключения интерактив или RDP
'# лог создаётся месяц.год.txt .
'# Автор E}|{uk@RUSnet (Димитровград) 2016г.
'# Большое спасибо за подсказки и помощь в написании скрипта tisha_ и Dmitrii (cyberforum.ru)
'#####################################################
 
 
Set objNetwork = CreateObject("WScript.Network")
objComputerName = objNetwork.ComputerName
objUSerName = objNetwork.USerName
Set objSysInfo = CreateObject("ADSystemInfo")
Const HKCU = &H80000001
 
'Определение типа подключения (интерактивное CONSOLE или RDP-терминал)
Set objShell = CreateObject("WScript.Shell")
SessName = UCase(objShell.ExpandEnvironmentStrings("%SESSIONNAME%"))
 
'Проверка можно раскоментировать
'WScript.Echo SessName
 
'Если Windows Больше версии Server 2003 >
'#############Для информации##############
'VER 5.0="Windows 2k"
'VER 5.1.="Windows XP"
'VER 5.2.="Windows 2003"
'VER 6.0.="Windows Vista"
'VER 6.1.="Windows 7"
'VER 6.2.="Windows 8"
'VER 6.3.="Windows 8.1"
'VER 10.0.="Windows 10"
'#########################################
 
If SessName = "%SESSIONNAME%" OR SessName <> " " Then 
Set objWShell = CreateObject("WScript.Shell")
strVer = CInt(Replace(objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"), ".", ""))
Set objSysInfo = Nothing
  If Len(strVer) > 0 Then
    strVer = CInt(Replace(Left(strVer, 3), ".", ""))
     If strVer > 52 Then
        Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
        objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
        objWMI.GetStringValue HKCU, "Volatile Environment" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", SessName
        Set objWMI = Nothing
     Else
        SessName = CreateObject("WScript.Shell").Environment("Volatile").Item("SESSIONNAME")
     End If
  End If
End If
 
'Проверка можно раскоментировать
'WScript.Echo "1 " & SessName
 
On Error ReSume Next
  
'(ForAppending 8 Открытие файла и запись в конец файла.)
ConSt ForAppending = 8
 
Set fSo = CreateObject("Scripting.FileSyStemObject")
Set GObjArgS = WScript.ArgumentS
GStrCmd = GObjArgS(0)
Call crypt(GStrCmd)
 
Sub crypt(mSg)
n = Len(mSg)
c = 0
Do Until c = n
c = c + 1
t1 = Mid(mSg,c,1)
ch = Chr(aSc(t1)+n)
output = output & ch
Loop
 
'Если хотите формат создаваемого лога TSSERVER_17.02.2017.txt то раскомментируйте строку ниже.
'Set logFile = fSo.OpenTextFile("\\MATRIX3\LogONOff$" & objComputerName & "_" & Date & ".txt",ForAppending,True)
 
'Если хотите формат создаваемого лога TSSERVER_2.2017.txt то раскомментируйте строку ниже.
Set logFile = fSo.OpenTextFile("\\TSServer\LogONOff$" & objComputerName & "_" & month(now()) & "." & year(now()) & ".txt",ForAppending,True)
 
logFile.WriteLine "#################################"
logFile.WriteLine Date & " " & Time
logFile.WriteLine "LOGON: " & "(" & SessName & ")" & vbNewLine & "Comp: " & (objComputerName) & vbNewLine & "User: " & (objUSerName)
'logFile.WriteLine "#################################"
logFile.CloSe
End Sub
 
WScript.Quit 0
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
17.02.2017, 11:03 30
Цитата Сообщение от xeon13 Посмотреть сообщение
... выбрал WSH и был приятно удивлён насколько он быстро работает...
Разумеется, обращение к локальному ресурсу выполняется быстрее, чем к удалённому, а чтение значения из реестра - менее ресурсоёмкая задача, чем выборка из базы данных службы каталогов.
Цитата Сообщение от xeon13 Посмотреть сообщение
... жду комментарии
Т.к. интерфейс ADSystemInfo более не используется, то за ненадобностью удалите из сценария операторы в строках 15 и 40:
Visual Basic
1
2
3
Set objSysInfo = CreateObject("ADSystemInfo")
'...
Set objSysInfo = Nothing
Удалите также оператор в строке 38:
Visual Basic
1
Set objWShell = CreateObject("WScript.Shell")
т.к. создание объекта WshShell уже выполняется оператором в строке 19. Однако не забудьте заменить в строке 39 переменную objWShell на переменную objShell. В итоге оператор для определения версии ОС должен выглядеть так:
Visual Basic
1
strVer = CInt(Replace(objShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"), ".", ""))
1
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
14.04.2017, 07:25  [ТС] 31
Наконец то появилось время исправить скрипт. Так же его протестил почти с месяц.
Ваши аргументированные замечания и комментарии все учтены.
Благодаря вам всем получился классный скрипт, который работает.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'#####################################################
'# Скрипт записи логов входа пользователя LOGON или LOGOFF "\\TSServer\LogONOff$"
'# в шаренную папку сервера. по умолчанию: LogONOff$
'# возникла необходимость контролировать входы и выходы.
'# в полученном логе различаются типы подключения интерактив или RDP
'# лог создаётся месяц.год.txt .
'# Автор E}|{uk@RUSnet (Димитровград) 2016г.
'# Большое спасибо за подсказки и помощь в написании скрипта tisha_ и Dmitrii (cyberforum.ru)
'#####################################################
 
 
Set objNetwork = CreateObject("WScript.Network")
objComputerName = objNetwork.ComputerName
objUSerName = objNetwork.USerName
 
Const HKCU = &H80000001
 
'Определение типа подключения (интерактивное CONSOLE или RDP-терминал)
Set objWShell = CreateObject("WScript.Shell")
SessName = UCase(objWShell.ExpandEnvironmentStrings("%SESSIONNAME%"))
 
'Проверка можно раскоментировать
'WScript.Echo SessName
 
'Если Windows Больше версии Server 2003 >
'#############Для информации##############
'VER 5.0="Windows 2k"
'VER 5.1.="Windows XP"
'VER 5.2.="Windows 2003"
'VER 6.0.="Windows Vista"
'VER 6.1.="Windows 7"
'VER 6.2.="Windows 8"
'VER 6.3.="Windows 8.1"
'VER 10.0.="Windows 10"
'#########################################
 
If SessName = "%SESSIONNAME%" OR SessName <> " " Then 
 
strVer = CInt(Replace(objWShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"), ".", ""))
 
  If Len(strVer) > 0 Then
    strVer = CInt(Replace(Left(strVer, 3), ".", ""))
     If strVer > 52 Then
        Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
        objWMI.EnumKey HKCU, "Volatile Environment", arrSubKeys
        objWMI.GetStringValue HKCU, "Volatile Environment" & arrSubKeys(UBound(arrSubKeys)), "SESSIONNAME", SessName
        Set objWMI = Nothing
     Else
        SessName = CreateObject("WScript.Shell").Environment("Volatile").Item("SESSIONNAME")
     End If
  End If
End If
 
'Проверка можно раскоментировать
'WScript.Echo "1 " & SessName
 
On Error ReSume Next
 
'(ForAppending 8 Открытие файла и запись в конец файла.)
ConSt ForAppending = 8
 
Set fSo = CreateObject("Scripting.FileSyStemObject")
Set GObjArgS = WScript.ArgumentS
GStrCmd = GObjArgS(0)
Call crypt(GStrCmd)
 
Sub crypt(mSg)
n = Len(mSg)
c = 0
Do Until c = n
c = c + 1
t1 = Mid(mSg,c,1)
ch = Chr(aSc(t1)+n)
output = output & ch
Loop
 
'Если хотите формат создаваемого лога TSSERVER_17.02.2017.txt то раскомментируйте строку ниже.
'не забудьте сменить путь папки с лог файлами на свой (\\MATRIX3\LogONOff$)
'Set logFile = fSo.OpenTextFile("\\MATRIX3\LogONOff$" & objComputerName & "_" & Date & ".txt",ForAppending,True)
'Если хотите формат создаваемого лога TSSERVER_02.2017.txt то раскомментируйте строку ниже.
Set logFile = fSo.OpenTextFile("\\TSServer\LogONOff$" & objComputerName & "_" & month(now()) & "." & year(now()) & ".txt",ForAppending,True)
logFile.WriteLine "#################################"
logFile.WriteLine Date & " " & Time
logFile.WriteLine "LOGON: " & "(" & SessName & ")" & vbNewLine & "Comp: " & (objComputerName) & vbNewLine & "User: " & (objUSerName)
'logFile.WriteLine "#################################"
logFile.CloSe
End Sub
 
WScript.Quit 0
Dmitrii, как Вы думаете создадутся ли лишние нагрузки на ЦП и диск, если я усложню скрипт тем, что будут писаться в лог фамилия имя отчество (возможно и должность/описание). Сейчас у меня 85 пользователей и бывают нередки моменты что почти одновременно осуществляют вход несколько юзеров...
Или лучше не баловаться в ущерб быстродействию? Я просто не знаю как именно работают процедуры в виндовс...
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
17.04.2017, 05:12 32
Запросы к базе данных AD выполняются не очень быстро, файловые операции - ещё медленнее. Поэтому для лучшего быстродействия имеет смысл ограничиться необходимым минимумом сведений о пользователе.
1
49 / 0 / 0
Регистрация: 17.10.2010
Сообщений: 57
06.07.2017, 13:58 33
Спасибо за скрипт, только почему-то у меня сессия всегда пустая, возможно это из-за того, что реестр недоступен без админских прав? Не пробовали ли реализовать скрипт для логирования блокировки/разблокировки ПК?
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 25
15.07.2020, 17:54 34
Может есть у кого готовый скрипт для записи событий в файл при логировании на контроллер домена?
Или может быть можно как-то эту информацию из журнала Windows вытащить?
0
15.07.2020, 17:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2020, 17:54
Помогаю со студенческими работами здесь

Логирование действий пользователей в БД
Имеется БД и приложение на access в приложение пользователи входят путём идентификации через...

Логирование с подстановкой имен пользователей в Squid3
Всем доброго времени суток, столкнулся со следующей проблемой: имеется ubuntu 14.04 LTS на ней...

Сеанс входа/выхода
Добрый день, я совсем новичок и прошу помощи. Пишу обработку по анализированию времени нахождения...

Список входа -> выхода
Добрый вечер. Вот такая задачка: Словарь в задании - список пар значений с одинаковым типом...

Delphi настройка входа\выхода
Доброго времени суток. У меня такой вот вопрос: вроде бы давно работаю в Delphi, но до сих пор не...

Время входа/выхода в систему
Подскажите пожалуйста, где виндовс ХР сохраняет время последнего входа и выхода из системы (т.е. во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru