Byte array[edit | edit source]
Byte arrays are to be contrasted with variant arrays of bytes. In VBScript, all declared arrays are variant arrays and it has no direct and simple method of creating a byte array. Still, a byte array can be created, even if in a more wordy manner and in dependence on ADODB.Stream.
Populating a byte array and then read-iterating it:
'Populate byte array SetStream=CreateObject("ADODB.Stream") Stream.Type=2'Text mode Stream.Charset="iso-8859-1" Stream.Open 'Write test bytes from 0 to 255 ForI=to255 Stream.WriteTextChrW(I) Next Stream.Position= SetStream2=CreateObject("ADODB.Stream") Stream2.Type=1'Binary mode Stream2.Open Stream.CopyToStream2 Stream2.Position= ByteArray=Stream2.Read()'VarType(ByteArray) = 8209 'Byte array, not variant array Stream2.Close Stream.Close 'Read-iterate byte array Fori=ToUBound(ByteArray) Byte_=AscB(MidB(ByteArray,i+1,1)) WScript.EchoByte_ Next
Above, populating a byte array uses writing Unicode code points in the range of 0-255 in iso-8859-1 encoding into a text stream, copying the text stream into a binary stream, and then reading the bytes from the binary stream. Read-iterating the byte array is brief and uses the trick of combined MidB and AscB rather than array index access.
Шифрование скриптов VBS (VBScript)
Шифрование скриптов VBS (VBScript)
Опубликовал admin
февраля 5, 2011
VBS-скрипты могут быть весьма полезны для автоматизации действий пользователя в системах семейства Windows. Иногда требуется скрыть текст VBS-скрипта и тогда на помощь приходит программа для шифрования скриптов, которая сохранят возможность выполнения скриптов VBS (сценариев VBScript) как и в незашифрованном виде.
Для шифрования скриптов VBS (VBScript) существует бесплатная программа Script Encoder от Microsoft. Она позволяет зашифровать Ваши скрипты, написанные на ASP, JScript, VBScript, а также файлы Windows Script Host. Установщик весит всего 127 КБ.
Microsoft Script Encoder работает из командной строки. Без проблем запускается в Windows 98/Me/NT4/2000/XP. Script Encoder позволяет использует специальные маркеры в исходном коде скрипта, чтобы определить, где должно начаться кодирование. Для скриптов написанных на VBScript маркер выглядит следующим образом:
Можно не задавать маркер и тогда Script Encoder выполнит шифрование всего файла. Пример вызова Script Encoder для шифрования скрипта написанного на языке Visual Basic Script (VBS)
В результате выполнения данной команды мы получим файл в формате VBE (Visual Basic encoded script). Описание опций для вызова Script Encoder приведены в хелпе для программы. И не забудьте заменить <Script language=”VBScript”> на <script language=”VBScript.Encode”> в HTML-коде.
Где взять Microsoft Script Encoder?
Filter Data¶
Option Explicit ' If you get error with connecting database (drive not found) ' Please install https://www.microsoft.com/en-us/download/details.aspx?id=13255 on your machine ' Dim dbConnection dbConnection = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & GetScriptDirectory() & "\Sample.accdb;Uid=;Pwd=;" ' To use the following codes, please download and install ' https://www.emailarchitect.net/webapp/download/easendmail.exe on your machine SendHtmlMailFromAccessToIT dbConnection Function GetScriptDirectory() GetScriptDirectory = Left(WScript.ScriptFullName, InStr(WScript.ScriptFullName, WScript.ScriptName) - 2) End Function Function BuildHtmlBody(rs) Dim html, name, address, age, department html = "<!DOCTYPE html><html><body>" html = html & "<div style=""font-family:'Segoe UI', Calibri, Arial, Helvetica; font-size: 14px; max-width: 768px;"">" html = html & "Dear {name}, <br /><br />This is a test email from MS Access using VBScript. <br />" html = html & "Here is your data:<br /><br />" html = html & "<table style='border-spacing: 0px; border-style: solid; border-color: #ccc; border-width: 0 0 1px 1px;'>" name = Trim(rs("Name")) address = Trim(rs("Email")) age = Trim(rs("Age")) department = Trim(rs("Department")) html = html & "<tr>" html = html & "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>" & name & "</td>" html = html & "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>" & address & "</td>" html = html & "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>" & age & "</td>" html = html & "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>" & department & "</td>" html = html & "</tr>" html = html & "</table></div></body></html>" BuildHtmlBody = html End Function Public Sub SendHtmlMailFromAccessToIT(dbConnection) WScript.Echo("Open " & dbConnection & " ...") Dim conn, rs, sql Set conn = CreateObject("ADODB.Connection") conn.Open dbConnection Set rs = CreateObject("ADODB.Recordset") ' Select the users in IT department sql = "select * from users WHERE Department='IT'" rs.Open sql, conn rs.MoveFirst Dim sender, name, address, subject, bodyTemplate, body, bodyFormat, attachment bodyFormat = 1 'HTML body format attachment = "" ' you can specify a file to be attached ' Please change sender address to yours sender = "[email protected]" subject = "Test email from MS Access and VBScript" ' Use a body template to build body text based on current workbook bodyTemplate = BuildHtmlBody(rs) Dim emailSent emailSent = Do While Not rs.EOF name = Trim(rs("Name")) address = Trim(rs("Email")) body = Replace(bodyTemplate, "{name}", name) If Not SendMailTo(sender, name, address, subject, body, bodyFormat, attachment) Then Exit Sub End If emailSent = emailSent + 1 rs.MoveNext Loop WScript.Echo("Total " & emailSent & " email(s) sent.") End Sub Function SendMailTo(sender, name, address, subject, body, bodyFormat, attachment) Dim oSmtp Set oSmtp = CreateObject("EASendMailObj.Mail") oSmtp.LicenseCode = "TryIt" ' Please change server address, user, password to yours oSmtp.ServerAddr = "mail.emailarchitect.net" oSmtp.UserName = "[email protected]" oSmtp.Password = "yourpassword" ' Set server port, if 25 port doesn't work, try to use 587 port oSmtp.ServerPort = 25 ' Using TryTLS, ' If smtp server supports TLS, then TLS connection is used; otherwise, normal TCP connection is used. ' https://www.emailarchitect.net/easendmail/sdk/?ct=connecttype oSmtp.ConnectType = 4 ' If your server is Exchange 2007 or later version, you can use EWS protocol. ' https://www.emailarchitect.net/easendmail/sdk/?ct=protocol ' Set Exchange Web Service Protocol - EWS - Exchange 2007/2010/2013/2016 ' oSmtp.Protocol = 1 oSmtp.FromAddr = sender oSmtp.AddRecipient name, address, oSmtp.subject = subject oSmtp.bodyFormat = bodyFormat oSmtp.BodyText = body ' Add attachment from local disk If attachment <> "" And oSmtp.AddAttachment(attachment) <> Then WScript.Echo("Failed to add attachment with error:" & oSmtp.GetLastErrDescription()) SendMailTo = False Exit Function End If WScript.Echo("Connecting " & oSmtp.ServerAddr & " ...") If oSmtp.SendMail() <> Then WScript.Echo("Failed to send email to " & address & "; " & oSmtp.GetLastErrDescription()) SendMailTo = False Else WScript.Echo("Message to " & address & " has been submitted to server.") SendMailTo = True End If Set oSmtp = Nothing End Function
Run the following command again
Чтение текстового файла на VBScript
Первый способ
Воспользоваться OpenTextFile. Например, прочитаем файл test.txt
Set FSO = CreateObject("Scripting.FileSystemObject") Set f = FSO.OpenTextFile("test.txt", 1) Do While Not f.AtEndOfStream str = f.ReadLine ' Что-нибудь делаем с прочитанной строкой, например, выводим сообщение MsgBox str Loop f.Close
Полный синтаксис:
OpenTextFile(filename ]])
filename — имя файла который необходимо прочитать
iomode — режим открытия файла (1 — только чтение, 2 — для записи (если уже существует, будет перезаписан), 8 — для добавления)
create — true — создать файл, если он не существует, false — не создавать
format — кодировка (-2 — кодировка ОС по умолчанию, -1 — Unicode, 0 — ASCII)
Непосредственно для чтения самих данных из текстового файла можно воспользоваться одним из следующих операторов:
- Read — чтение определенного количества символов независимо от конца строки (количество символов указывается в скобках после оператора)
- ReadLine — прочитать строку полностью до конца (до символов перевода строки), т.е. построчное чтение текстового файла
- ReadAll — прочитать весь файл целиком за раз, включая символы переноса строки.
Эти же приемы чтения файла можно использовать и в следующем способе.
Второй способ
Использовать GetFile и OpenAsTextStream. Принцип чтения такой же как и в первом способе, просто другой вариант открытия файла.
Set FSO = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFile("test.txt") Set ts = f.OpenAsTextStream(1) Do While Not ts.AtEndOfStream str = ts.ReadAll ' Выводим на экран сообщение с содержимым файла MsgBox str Loop ts.Close
В скобках оператору OpenAsTextStream передается режим открытия файла iomode, который описан выше. Так же можно передать второй параметр, который будет означать кодировку format.
Google, Twitter, Dropbox и торренты
Отвлечемся от десктопных дел и поговорим о сетевых сервисах. Начнем, разумеется, с Google. Вот так будет выглядеть скрипт для получения первых десяти результатов поиска:
Скрипт делает запрос к Google с помощью уже знакомого нам curl, заменяя пробелы в поисковой строке на плюсы. Далее выискивает в ответном HTML ссылки и выводит их на экран. Все просто, хоть и кажется сложным.
Ищем в Google из командной строки
Второй популярный сервис — YouTube:
Здесь все совсем просто. Скрипт всего лишь проигрывает видео с указанным в аргументе ID с помощью плеера mpv. Естественно, youtube-dl придется установить заранее.
Как насчет твиттера? Нет проблем, вот полноценный бот, который на входе принимает команду, выполняет ее с помощью командного интерпретатора и отправляет результат указанному юзеру.
Скрипт использует консольный клиент ttytter, читая в цикле последнее direct message, далее он проверяет, не была ли такая команда уже выполнена, и, если нет, выполняет ее и отправляет указанному в переменной USER пользователю, попутно обрезая до 140 символов.
Чтобы все заработало как надо, тебе придется установить ttytter, запустить его, ввести приведенную им ссылку в адресную строку браузера, скопировать показанный браузером ключ аутентификации и ввести его в ttytter. Естественно, перед тем как это сделать, следует завести для бота отдельного юзера и залогиниться под его учеткой.
Ttytter запрашивает ключ
Твиттер можно использовать не только для выполнения команд, но и для мониторинга машины. Следующий скрипт отправляет в ленту сообщение с информацией о состоянии машины (имя хоста, uptime, нагрузка, свободная память и нагрузка на CPU):
Мониторинг машины с помощью Twitter
Ну и под конец приведу скрипт, не связанный с сетевыми сервисами, но имеющий прямое отношение к сетям и к тому, зачем мы обычно их используем. Это скрипт для запуска и остановки торрент-клиента во время простоя машины:
Скрипт уходит в бесконечный цикл, каждую минуту проверяя, сколько миллисекунд прошло с момента, когда юзер что-либо делал (для этого используется команда xprintidle). Если прошло уже 600 000 мс (десять минут), скрипт выполняет команду, указанную в переменной STARTCMD. В противном случае он выполнит команду STOPCMD, но только тогда, когда до нее была выполнена команда STARTCMD. Если кратко: ничего не делаешь за компом десять минут — запускается STARTCMD, в данном случае это команда запуска всех закачек с помощью Transmission, если нет — приостановка всех закачек. Не любишь Transmission? Нет проблем, вот команды для Deluge:
Limitations[edit | edit source]
Limitations:
- Limitations described in apply. In particular, there is no way to create custom Collections and thus no support for trivially expandable lists known from many programming languages; workarounds include redimensioning dynamic arrays as required or storing indices are numerical keys in a dictionary.
- In general, compared e.g. to .NET-based PowerShell or to Python, very few facilities available as libraries; by contrast, the two mentioned scripting technologies sport very many libraries to support a variety of tasks.
- No interactive shell to execute VBS commands one at a time, unlike e.g. .NET-based PowerShell or Python.
- No reading from and writing to a console for scripts run via wscript, only for scripts run via cscript.
- Limited support for array operations, e.g. no sorting functions. Users resort to writing their own.
- No direct way of including other .vbs scripts as libraries; an indirect way is via WSF XML files.
- No bitwise shift left and shift right operators, but can be easily implemented.
- No general GUI programming from .vbs scripts; an alternative is to embed VBS in a HTML as HTML Application (HTA). Simple message boxes and input boxes are supported directly without HTA.
- No arbitrary precision integer arithmetic.
- No set type (mathematical set).
- And more.
Решение 4. Отключите Windows Script Host через реестр
Windows Script Host был представлен в Windows 98 – он позволяет запускать на компьютере больше языков программирования. К сожалению, если вредоносному ПО удастся проникнуть в устройство, оно может злоупотребить этим и получить доступ к большему количеству внутренних функций. Таким образом, полное отключение Windows Script Host, если он не используется, является хорошей практикой безопасности, которая также остановит появление связанной с ним ошибки.
- Введите regedit в поиске Windows и нажмите Enter.
- После захода в редактор реестра перейдите по следующему пути: HKEY_CURRENT_USER\Software\ Microsoft\Windows Script Host\Settings\.
- Если справа вы не видите ключ Enabled, создайте его.
- Для этого щелкните правой кнопкой мыши в пустое место в правом окне и выберите «Создать»> «Значение DWORD (32 бита)».
- После появления ключа дважды щелкните по нему ЛКМ и установите для него значение 0 Отключить хост Windows Script.
- Теперь перейдите по следующему пути и повторите шаги, описанные выше: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Script Host\Settings\.
Dictionary[edit | edit source]
VBScript supports dictionaries AKA associative arrays via Scripting.Dictionary object. The key can be of any type except for arrays; thus, strings, integers, floating points, dates, etc. are supported.
Examples:
SetDict=CreateObject("Scripting.Dictionary") Dict.Add"Key","Value" Value=Dict.Item("Key") IfDict.Exists("Key")Then WScript.Echo"Key exists" EndIf Dict.Remove"Key" Dict.Add"DE","Germany" Dict.Add"USA","United States" Dict.Item("USA")="The United States"'Member rewrite Keys=Dict.Keys'An array, not a collection ForIdx=ToDict.Count-1'For each key WScript.Echo"Key "&Keys(Idx) WScript.Echo"Value "&Dict.Item(Keys(Idx)) Next
Links:
Dictionary Object, docs.microsoft.com
Обработка ошибок VBScript:
Невозможно обработать все неожиданные ошибки VBScript с помощью кодирования. Итак, обработка ошибок VBScript — это первоочередная задача. В первую очередь, есть один подход к обработке ошибки VBScript в сценариях. Этот подход представляет собой комбинацию использования операторов «При ошибке возобновить следующий» и свойства объекта Err.
При ошибке Возобновить следующие операторы:
Он использовал операторы On-Error-Resume-Next; исключение можно обработать частично. При таком подходе блок тестового сценария должен запускаться с помощью операторов «On Error Resume Next». Это означает, что в случае какой-либо ошибки выполнение будет пропущено с текущего шага и перейдет к следующему шагу. После этого, проверив ошибку, мы сможем обрабатывать исключения. Важные ключевые слова —
· При ошибке возобновить следующий — В случае ошибки VBScript не выдаст сообщение об ошибке; вместо этого выполнение перейдет к следующему шагу.
· При ошибке Перейти к 0 — Он будет работать в обратном порядке по сравнению с указанным выше ключевым словом. Итак, после выполнения этого шага VBScript будет выдавать ошибки в случае каких-либо исключений.
· Ошибка. Описание — В нем хранится описание ошибки.
· Error.Number — Он содержит номер ошибки. Для успеха значение равно нулю.
· Error.Clear — Он сбрасывает объект ошибки.
При ошибке Возобновить Далее 'оператор Vbscript 1 'оператор Vbscript 1 . . . . . Если error.number <> 0, то 'Проверка на наличие ошибки'..Обработать ошибку Else 'Условие успеха ничего обрабатывать не нужно Error.Clear End If On Error Goto 0
Подход к выполнению VBScript:
Существуют различные способы выполнения сценариев VBScripts. Наиболее часто используемые подходы —
- Выполнить VBScript через файл .vbs
- Выполнять VBScript как часть веб-разработки HTML
Выполнить VBScript через файл .vbs: Шаги для выполнения vbscript через файл .vbs:
- Запишите коды VBScript в простой плоский файл. Для создания файла можно использовать любой редактор, например, блокнот, Note Pad ++, Edit Plus и т. Д.
- Сохраните файл с расширением .vbs.
- Запустите файл, дважды щелкнув по нему.
- Тот же файл можно запустить из командной строки, используя полный путь к файлу. Команда для выполнения файла vbs: WScript » ».
В этом руководстве по vbscript мы используем этот подход для запуска всех демонстрационных сценариев vbscript.
Выполните VBScript как часть веб-страницы: В этом подходе нам нужно написать коды VBScript с тегом in in the web page. The syntax will be looks like below –
Этот подход используется при разработке веб-страниц с использованием классического ASP. Также то же самое можно использовать в других технологиях, таких как PHP, JSP и т. Д.
Инструменты использует VBScript: Основные инструменты, поддерживающие сценарии vbscripts: UFT, Excel Macro, Visual Basic, Classic ASP (сценарии на стороне клиента).
Вывод:
В этой статье о VBScript мы узнали о процедурах VBScript и обработке ошибок VBScript с помощью этого руководства. Мы надеемся, что это руководство очень помогло вам освежить в памяти основы написания сценариев VB. Чтобы получить дополнительную информацию о VBScripting, нажмите .
Добавление данных в файл
Однажды создав текстовый файл, вы можете добавлять в него данные, для чего нужно выполнить три действия:
- Открыть текстовый файл
- Записать данные
- Закрыть файл
OpenTextFileFileSystemObjectOpenAsTextStreamFile
Для записи данных в текстовый файл используйте методы Write,
WriteLine или WriteBlankLines объекта TextStream,
в зависимости от задач, описанных в приведённой ниже таблице:
Задача | Метод |
Запись данных в текстовый файл без символа перехода на новую строку в конце | Write |
Запись данных в текстовый файл с символом перехода на новую строку в конце | WriteLine |
Запись одной или более пустых строк в открытый текстовый файл | WriteBlankLines |
Для закрытия текстового файла используйте метод Close объекта TextStream.
Закрыть файл можно также методом Close объекта FileSystemObject.
Пример использования данных методов см. в разделе «3.7. Пример работы с объектом FileSystemObject».
ПРИМЕЧАНИЕ
Символ новой строки содержит символ или символы (зависит от операционной системы)
для перевода курсора в начало новой строки (возврат каретки/перевод строки).
Следует учитывать, что некоторые строки уже могут иметь в конце эти непечатаемые символы.
В следующем примере показано, как выполняется запись данных в открытый файл всеми тремя методами,
затем файл закрывается:
Sub CreateFile() Dim fso, tf Set fso = CreateObject("Scripting.FileSystemObject") Set tf = fso.CreateTextFile("c:\testwritefile.txt", True) ' Записать строку с переводом на новую строку. tf.WriteLine("Тестирование 1, 2, 3.") ' Записать три пустых строки в файл. tf.WriteBlankLines(3) ' Записать строку tf.Write ("Это тест") tf.Close End Sub
VBS скрипт диагностики сети
status = vbInformationStrKar = CHR (13) + CHR (10) ‘ Перенос кареткиmyStr = “Диагностика сети v1.0:” + StrKar
‘————————‘ Пример Ping()‘————————
myStr = myStr + StrKar + “Серверы:” + StrKarIf ping(“10.0.0.111”) thenmyStr = myStr + “Сервер – шлюз – ” + StrKarElsemyStr = myStr + “Сервер шлюз – ” + StrKarstatus = vbCriticalend if
myStr = myStr + StrKar + “Сервисы:” + StrKarIf ping(“ya.ru”) thenmyStr = myStr + “Интернет (ya.ru) – ” + StrKarElsemyStr = myStr + “Интернет (ya.ru) – ” + StrKarstatus = vbCriticalend if
myStr = myStr + StrKar + “Сервисы:” + StrKarIf ping(“10.0.0.211”) thenmyStr = myStr + “DNS, domain (10.0.0.211) – ” + StrKarElsemyStr = myStr + “DNS, domain (10.0.0.211) – ” + StrKarstatus = vbCriticalend if
myStr = myStr + StrKar + “Сервисы:” + StrKarIf ping(“10.0.0.31″) thenmyStr = myStr + ” (10.0.0.31) – ” + StrKarElsemyStr = myStr + “Интернет (10.0.0.31) – ” + StrKarstatus = vbCriticalend if
myStr = myStr + StrKar + “Сервисы:” + StrKarIf ping(“10.0.0.41″) thenmyStr = myStr + ” (10.0.0.41) – ” + StrKarElsemyStr = myStr + “Интернет (10.0.0.41) – ” + StrKarstatus = vbCriticalend if
myStr = myStr + StrKar + “Сервисы:” + StrKarIf ping(“10.0.0.50″) thenmyStr = myStr + ” (10.0.0.50) – ” + StrKarElsemyStr = myStr + “Интернет (10.0.0.5) – ” + StrKarstatus = vbCriticalend if
‘—————————-‘ Пример nslookup()‘—————————-
If Nslookup(“meta.ua”) thenmyStr = myStr + “DNS Server (nslup meta.ua) – ” + StrKarElsemyStr = myStr + “DNS Server (nslkup meta.ua) – ” + StrKarstatus = vbCriticalend if
‘—————————-‘ Пример IsAPIPA()‘—————————-
if IsAPIPA thenmyStr = myStr + StrKar + “Дополнительно:” + StrKar + “IP адрес – ” + StrKarmyStr = myStr + “Внимание. Обнаружен некорректный ip адрес!!!” + StrKarmyStr = myStr + “Перезагрузите компьютер
Если проблема повторится, проверьте доступность DHCP сервера либо назначьте ip адрес вручную” + StrKarmyStr = myStr + “Примечание: Если при этом у вас прекрасно работает сеть, считайте данное сообщение ошибочным” + StrKarelsemyStr = myStr + StrKar + “Дополнительно:” + StrKar + “IP адрес – (Не APIPA)” + StrKarend if
‘—————————-‘ Вывод результатов‘—————————-
msgbox myStr, status, “Результаты:”
‘——————‘ Функции‘——————
Function Ping(strAddr)‘ Проверяем доступность компьютера с помощью команды PINGSet objShell = CreateObject(“WScript.Shell”)Set objScriptExec = objShell.Exec(“%comspec% /c ping.exe -n 1 ” & strAddr)strPingResults = LCase(objScriptExec.StdOut.ReadAll)
‘ Возвращаем результат:Ping = InStr(strPingResults, “ttl=”)End Function
Function Nslookup(strAddr)‘ Проверяем работу DNS сервера через nslookupSet objShell = CreateObject(“WScript.Shell”)Set objScriptExec = objShell.Exec(“%comspec% /c nslookup.exe -q=mx ” & strAddr)strNslookupResults = LCase(objScriptExec.StdOut.ReadAll)
‘ Возвращаем результат:Nslookup = InStr(strNslookupResults, “mail”)End Function
Function IsAPIPA()‘ Проверяет, нет ли сетевых карт, получивших APIPA адресSet objShell = CreateObject(“WScript.Shell”)Set objScriptExec = objShell.Exec(“%comspec% /c ipconfig /all”)strIsAPIPAResults = LCase(objScriptExec.StdOut.ReadAll)
‘ Возвращаем результат:IsAPIPA = InStr(strIsAPIPAResults, “169.254.”)End Function
Сохранение в файл информации в входах на компьютер
Мне понадобилось хранить информацию о том, какой пользователь и когда логинился или завершал работу на конкретном компьютере в домене. Вариантов решения этой задачи с помощью GPO много: как с помощью стандартного аудита, так и с помощью различных скриптов. Мне необходимо было сохранять полученные данные о логинах в текстовый файл в удобочитаемом виде.
Введение
Готового решения, которое бы меня полностью удовлетворило я не нашел. Есть много вариантов скриптов, которые делают что-то похожее, но мне они показались не очень удобными. Можно воспользоваться стандартным аудитом windows и собирать данные журналов с компьютеров, но у меня нет хранилища для этих журналов, да и разбирать события не очень удобно и наглядно.
Я решил пойти по самому простому и очевидному пути. Сделать сетевую папку с разрешением на запись пользователям, создать 2 скрипта для событий logon и logoff. С помощью групповой политики запускать эти скрипты. Они во время работы записывают в текстовый файл следующие данные:
- Тип события: logon или logoff.
- Имя компьютера.
- Имя пользователя.
- Время события
Для каждого компьютера создается отдельная папка с именем компьютера в названии. В этой папке каждый день создается новый файл с датой в названии. С такой структурой можно очень легко и быстро посмотреть в какой день, в какое время и кто заходил на компьютер. Скрипт написан на VBS.
VBS скрипт для аудита входов/выходов в компьютер
Сразу предупреждаю, что писать vbs скрипты я не умею, и практически не знаком с этим языком. Я собирал из разных кусочков то, что мне нужно, читая документацию и правя на ходу чужие куски кода. Может я предвзято отношусь к vbs, но когда я вижу его код, сразу хочу закрыть редактор. Мне он кажется каким-то нелепым и трудночитаемым. Было бы здорово, если кто-нибудь подсказал бы как сделать мой скрипт более правильным и логичным.
Как я уже писал выше, скрипт во время запуска создает в сетевом каталоге папку с именем компьютера, в ней создает текстовый файл с текущей датой в имени. В сам файл записывает информацию о том, кто залогинился или вышел из компьютера. Каждый новый запуск скрипта в один и тот же день дописывает информацию в существующий файл. На следующий день создается новый файл с другой датой в имени.
Во втором файле выделенная строка должна быть LOGOFF. Первый файл ставим на событие входа в систему, второй — на выход. В одном текстовом файле мы увидим, когда человек зашел на компьютер, а когда вышел.
Добавление скрипта в групповую политику
Теперь нам нужно распространить выполнение скриптов на компьютеры. Я воспользовался стандартным функционалом GPO. Не буду приводить картинки, как это сделать, в интернете есть масса статей с различными версиями windows. Расскажу словами, как это делаю я.
Для начала я создаю отдельную политику. Я всегда для разных настроек создают отдельные политики. Мне так удобнее управлять ими. Можно оперативно отключить что-то или добавить настройку отдельной группе пользователей. Если добавлять все в одну политику, гибкости в управлении не будет.
Таким образом, создаем отдельную политику. Отключаем в ней конфигурацию компьютера, она не нужна. Скрипты будут добавляться в настройки пользователя. Переименовываем скрипты, к примеру, в logon.vbs и logoff.vbs. Назначаем каждому событию свой скрипт. После этого линкуете в нужное место политику и проверяете.
Проверка работы vbs скрипта
В результате работы скрипта у вас должны быть созданы папки с именами компьютеров. Примерно вот так:
В каждой папке будут накапливаться текстовые файлы с информацией о логинах пользователей конкретного компьютера:
В файлах будет примерно такая информация:
Дальше используете эти файлы на ваше усмотрение.
Во время отладки можно указать локальный путь к файлу и запускать его вручную тут же на компьютере. Все должно корректно отрабатывать. После отладки можно поместить в GPO.
Если у вас нет домена и групповых политик, вы можете вручную или каким-то другим способом добавить указанный файл в автозапуск и регистрировать все входы на компьютер в текстовый файл локально или на сетевую шару.
Заключение
Мне мало приходится работать с windows серверами. Чувствую себя не очень уверенно в этом окружении. Писать скрипты на bash и sh мне несравненно проще, чем на vbs или powershell. Тут вопрос привычки и опыта, но даже с самого начала своей работы с серверами в линуксе мне работать было интереснее и приятнее. Но от винды никуда не деться, приходится быть в тонусе и решать поставленные задачи.