|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту) |
|
|
VBS/WSH/JS - [решено] Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту)
|
Старожил Сообщения: 208 |
Доброго времени суток!
Прощу помощи при решении следующего вопроса! Необходим скрипт, который будет закинуть в GPO и при залогиневании пользователя будет записывать информацию в файл о том кто и откуда залогинелся. Предположительно содержимое файла будет выглядеть следующим образом: Цитата:
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set IPConfigSet = objWMIService.ExecQuery ("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each IPConfig in IPConfigSet If Not IsNull(IPConfig.IPAddress) Then ip = IPConfig.IPAddress(0) End If Next Dim objADSystemInfo, objComp, objUser Set objADSystemInfo = CreateObject("ADSystemInfo") Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName) strUserName = objUser.sn + " " + objUser.GivenName Dim objFSO, file Const ForWriting = 2 strSourceFile = ".\Ip2Name.txt" Set objFSO = CreateObject("Scripting.FileSystemObject") Set file = objFSO.OpenTextFile(strSourceFile, ForWriting, True) file.Write Date & " " & Time & vbTab & ip & vbTab & strUserName Иванов Иван в 09.00 залогинелся на компьютере с IP-адресом 192.168.0.10. В 14.00 тот же пользователь Иванов Иван, пересел за др. компьютер с IP-адресом 192.168.0.20 и начал работать за ним. Требуется, что бы при логине пользователя, производился поиск по Фамилии\Имени и сравнивался IP-адрес, если IP-адрес отличается от того, что был в файле, то заменить его на новый. Ещё не очень понимаю, как быть при варианте, что несколько людей залогинелись одновременно и файл будет открыт сразу несколькими пользователя. Заранее спасибо всем кто откликнется и поможет реализовать данную задачу хотя бы частично. |
||
Отправлено: 14:16, 28-11-2013 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать pogo, выбор текстового файла — не самая удачная идея. Лучше используйте базу данных. Во-первых, не будет коллизий при добавлении данных (что рано или поздно случится при попытке одновременного доступа к единому текстовому файлу), во-вторых, выборка в базе данных по логину+дате будет делаться банальнейшим запросом.
|
Отправлено: 14:53, 28-11-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 208
|
Профиль | Отправить PM | Цитировать База данных мне кажется не очень хороший вариант, т.к. всё это делается, что бы в дальнейшем скормить файл lightsquid-у.
А поднимать тот же mysql, для того чтобы туда писать 2 значения (IP и ФИО), мне кажется это очень излишне. К тому же потом, до из базы как то значения доставить, запихивать в файл и кормить lightsquid-у. Если ещё идея, что бы каждый пользователь создавал отдельный файл с IP в имени и с ФИО в содержании. Но тут возникает вопрос, как потом из этого всего дела собирать 1 файл который опять-таки будет отдаваться lightsquid? |
Последний раз редактировалось pogo, 28-11-2013 в 15:19. Отправлено: 15:07, 28-11-2013 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата pogo:
Цитата pogo:
Пример работы: Работа с базами данных при помощи ADO из vbscript: самостоятельная работа - AskIt.RU. Цитата pogo:
Цитата pogo:
P.S. Я не очень представляю себе, какой конечный формат текстового файла Вам нужен, равно как и зачем. Посему за него судить не берусь. |
||||
Отправлено: 15:46, 28-11-2013 | #4 |
Старожил Сообщения: 208
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Цитата Iska:
Не могли бы Вы помочь в реализации, а то в vbs я не силён, а уж с базами это вообще темнота... Вот пытаюсь сделать по той ссылке, что Вы дали. Создал файл .mdb. Создал там таблицу со столбцами DataTime | IP | UserName. Поправил код: Dim cn, rs, strComputer Set cn = CreateObject("ADODB.Connection") cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0" cn.Open "Data Source=D:\scripts\vbs\Ip2Name.mdb" Set rs = CreateObject("ADODB.Recordset") rs.Open "Ip2Name", cn strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set IPConfigSet = objWMIService.ExecQuery ("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each IPConfig in IPConfigSet If Not IsNull(IPConfig.IPAddress) Then ip = IPConfig.IPAddress(0) End If Next Dim objADSystemInfo, objComp, objUser Set objADSystemInfo = CreateObject("ADSystemInfo") Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName) strUserName = objUser.sn + " " + objUser.GivenName rs.Feilds("DataTime").Value = Date rs.Feilds("IP").Value = ip rs.Feilds("UserName").Value = strUserName Цитата:
|
||||
Последний раз редактировалось pogo, 28-11-2013 в 16:39. Отправлено: 16:09, 28-11-2013 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать pogo, кажется, я примерно понял Вашу мысль. Вы хотите как-то на основе логов доступа в интернет (вида локальный ip-адрес/удалённый адрес, время) и создаваемых логов входа/выхода пользователей на машины получить в итоге картинку вида кто куда ходил, так?
|
Отправлено: 18:33, 28-11-2013 | #6 |
Старожил Сообщения: 208
|
Профиль | Отправить PM | Цитировать Да, Вы меня правильно поняли.
Есть Squid в прозрачном режиме проксирования, на нём висит Lightsquid, который берёт логи Squid и делает из них отчёты о посещаемых сайтах пользователями, данный отчёты в данный момент выглядят как: Цитата:
Правда у меня пока даже не получается в базу записать... Dim cn, rs, strComputer Set cn = CreateObject("ADODB.Connection") cn.ConnectionString = "Microsoft.ACE.OLEDB.12.0;Data Source=D:\scripts\vbs\Ip2Name.mdb" cn.Open Set rs = CreateObject("ADODB.Recordset") rs.Open "Ip2Name", cn strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set IPConfigSet = objWMIService.ExecQuery ("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each IPConfig in IPConfigSet If Not IsNull(IPConfig.IPAddress) Then ip = IPConfig.IPAddress(0) End If Next Dim objADSystemInfo, objComp, objUser Set objADSystemInfo = CreateObject("ADSystemInfo") Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName) strUserName = objUser.sn + " " + objUser.GivenName rs.Feilds("DataTime").Value = Date rs.Feilds("IP").Value = ip rs.Feilds("userName").Value = strUserName Цитата:
|
||
Последний раз редактировалось pogo, 02-12-2013 в 09:35. Отправлено: 09:23, 02-12-2013 | #7 |
Старожил Сообщения: 208
|
Профиль | Отправить PM | Цитировать Т.к. проблему надо было решать "ещё вчера". Пришлось отказаться о товыряний с базой и пойти по протезному варианту, в итоге получилось так:
Получилось 2 скрипта: 1-ый, через GPO запускается при logon пользователя и создаёт файл. IP-адрес машины с которой залогинелись в имени файла. Имя пользователя, кто залогинелся, в теле файла. И потом созданный файл скидывается на сервер. ' Получение IP-адреса компьютера Dim objWMIService, IPConfigSet, strComputer, ip strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set IPConfigSet = objWMIService.ExecQuery ("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each IPConfig in IPConfigSet If Not IsNull(IPConfig.IPAddress) Then ip = IPConfig.IPAddress(0) End If Next ' Получение залогиненого имени пользователя в формате: Фамилия Имя Dim objADSystemInfo, objUser Set objADSystemInfo = CreateObject("ADSystemInfo") Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName) strUserName = objUser.sn + " " + objUser.GivenName ' Создание файла с IP-адресом в имени и именем пользователя в теле файла. Dim objFSO, file Set objFSO = CreateObject("Scripting.FileSystemObject") Set file = objFSO.CreateTextFile("\\server\vbs\" & ip & "", True) file.Write strUserName 'WScript.Echo "Script complite" Dim objFSO, objRootFolder, file_in, file_out, userName Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Set objFSO = CreateObject("Scripting.FileSystemObject") if objFSO.FileExists("C:\scripts\realname.cfg") then objFSO.DeleteFile("C:\scripts\realname.cfg") 'Создаём файл temp.cfg в корне папке откуда запускается скрипт. 'Это требуется, что бы затирать старый файл, т.к. ForAppending 'добавляет записи в конец файла, не удаляю и не заменяя имеющееся. Set file_out = objFSO.CreateTextFile("C:\scripts\temp.cfg", True) file_out.Close Set objRootFolder = objFSO.GetFolder("C:\scripts\vbs") Set filesInRootFolder = objRootFolder.Files For Each fileInFolder in filesInRootFolder 'проходимся по всем файла в папке fileName = fileInFolder.Name 'имя файла = IP-адрес 'Set objFSO = CreateObject("Scripting.FileSystemObject") Set file_in = objFSO.OpenTextFile("C:\scripts\vbs\" & fileName & "", ForReading) 'открываем файл на чтение userName = file_in.ReadLine 'Считываем содержимое файла = имя пользователя file_in.Close 'закрываем исходный файл resultStr = fileName & vbTab & userName 'создаём результирующую строку Set file_out = objFSO.OpentextFile("C:\scripts\temp.cfg", ForAppending, True) 'открываем файд на запись(добавление) file_out.WriteLine resultStr 'Записываем результирующую строку file_out.Close 'закрываем файл Next Set file_result = objFSO.OpenTextFile("C:\scripts\temp.cfg", ForReading) strForConvert = file_result.ReadAll Set objStream = CreateObject("ADODB.Stream") objStream.Type = 2 objStream.Open objStream.Charset = "UTF-8" objStream.WriteText strForConvert objStream.SaveToFile("C:\scripts\realname.cfg") objStream.Close if objFSO.FileExists("C:\scripts\temp.tmp") then objFSO.DeleteFile("C:\scripts\temp.tmp") Const OverwriteExisting = True Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFile "C:\scripts\realname.cfg" , "\\squid\lightsquid$\", OverwriteExisting 'WScript.Echo "Script complite" |
Последний раз редактировалось pogo, 03-12-2013 в 12:43. Отправлено: 11:43, 03-12-2013 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата pogo:
|
|
Отправлено: 05:40, 04-12-2013 | #9 |
Старожил Сообщения: 208
|
Профиль | Отправить PM | Цитировать Подскажите пожалуйста.
При логине на несколько серверов под Win2012, первый скрипт выпадает в ошибку: Цитата:
|
|
Отправлено: 13:48, 05-12-2013 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Как получить значение искомой подстроки в строке? | Loki3D | Скриптовые языки администрирования Windows | 11 | 24-02-2018 08:37 | |
Replacer - утилита для замены подстроки в файле | apozlevich | AutoIt | 4 | 16-10-2013 23:37 | |
VBS/WSH/JS - Поиск в одном текстовом файле с заменой в другом | cortes_ | Скриптовые языки администрирования Windows | 1 | 21-09-2013 13:58 | |
C/C++ - [решено] Поиск и замена в тексте (извлечение подстроки) | dima1981 | Программирование и базы данных | 10 | 21-03-2010 15:50 | |
Создание подстроки в Word'e | kop4enyi | Хочу все знать | 2 | 10-07-2008 12:55 |
|