Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту)

Ответить
Настройки темы
VBS/WSH/JS - [решено] Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту)

Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Доброго времени суток!
Прощу помощи при решении следующего вопроса!
Необходим скрипт, который будет закинуть в GPO и при залогиневании пользователя будет записывать информацию в файл о том кто и откуда залогинелся.
Предположительно содержимое файла будет выглядеть следующим образом:
Цитата:
28.11.2013 12.00.01 192.168.0.10 Иванов Иван
28.11.2013 12.00.55 192.168.0.16 Петров Пётр
Собственно с этим больших проблем нет:

Код: Выделить весь код
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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


pogo, выбор текстового файла — не самая удачная идея. Лучше используйте базу данных. Во-первых, не будет коллизий при добавлении данных (что рано или поздно случится при попытке одновременного доступа к единому текстовому файлу), во-вторых, выборка в базе данных по логину+дате будет делаться банальнейшим запросом.

Отправлено: 14:53, 28-11-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


База данных мне кажется не очень хороший вариант, т.к. всё это делается, что бы в дальнейшем скормить файл lightsquid-у.
А поднимать тот же mysql, для того чтобы туда писать 2 значения (IP и ФИО), мне кажется это очень излишне. К тому же потом, до из базы как то значения доставить, запихивать в файл и кормить lightsquid-у.
Если ещё идея, что бы каждый пользователь создавал отдельный файл с IP в имени и с ФИО в содержании.
Но тут возникает вопрос, как потом из этого всего дела собирать 1 файл который опять-таки будет отдаваться lightsquid?

Последний раз редактировалось pogo, 28-11-2013 в 15:19.


Отправлено: 15:07, 28-11-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата pogo:
База данных мне кажется не очень хороший вариант, т.к. всё это делается, что бы в дальнейшем скормить файл lightsquid-у. »
Причины, по которым текстовый файл не слишком подходит, я описал выше.

Цитата pogo:
А поднимать тот же mysql, для того чтобы туда писать 2 значения (IP и ФИО) »
Разве я что-то говорил про MySQL?

Пример работы: Работа с базами данных при помощи ADO из vbscript: самостоятельная работа - AskIt.RU.

Цитата pogo:
мне кажется это очень излишне. »
А мне — нет: я пробовал и то, и другое.

Цитата pogo:
К тому же потом, до из базы как то значения доставить, запихивать в файл и кормить lightsquid-у. »
Извлекать данные из реляционной базы данных на порядок проще, нежели из csv.

P.S. Я не очень представляю себе, какой конечный формат текстового файла Вам нужен, равно как и зачем. Посему за него судить не берусь.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:46, 28-11-2013 | #4


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Цитата Iska:
Пример работы: Работа с базами данных при помощи ADO из vbscript: самостоятельная работа - AskIt.RU. »
Честно говоря, что то про базы MS Access я даже не подумал.
Цитата Iska:
P.S. Я не очень представляю себе, какой конечный формат текстового файла Вам нужен, равно как и зачем. Посему за него судить не берусь. »
Конечный формат исходного файла, я приводил в самом первом посте. Нужно это, для для удобства просмотра логов lightsquid.
Не могли бы Вы помочь в реализации, а то в 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
но при запуске получаю ошибку:
Цитата:
Строка: 6
Символ: 1
Ошибка: Не удаётся найти указанны йпоставщик. Вероятно, он установлен неправильно.
Код: 800A0E7A
Источник: ADODB.Connection

Последний раз редактировалось pogo, 28-11-2013 в 16:39.


Отправлено: 16:09, 28-11-2013 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


pogo, кажется, я примерно понял Вашу мысль. Вы хотите как-то на основе логов доступа в интернет (вида локальный ip-адрес/удалённый адрес, время) и создаваемых логов входа/выхода пользователей на машины получить в итоге картинку вида кто куда ходил, так?

Отправлено: 18:33, 28-11-2013 | #6


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Да, Вы меня правильно поняли.
Есть Squid в прозрачном режиме проксирования, на нём висит Lightsquid, который берёт логи Squid и делает из них отчёты о посещаемых сайтах пользователями, данный отчёты в данный момент выглядят как:
Цитата:
№ | IP | ФИО | Соединений | Байт
Поле "ФИО" берётся из отдельного файла, назовём его файл Х. Вот мне и надо сделать скрипт, чтобы пользователь при логине на какой-либо машине, писал в файл информацию - кто и с какого ip залогинелся. В дальнейшем я бы подставлял нужные мне поля в файл Х и получал бы удобочитаемые отчёты.

Правда у меня пока даже не получается в базу записать...
Код: Выделить весь код
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
Выполняю, и получаю ошибку:
Цитата:
Строка: 4
Символ: 1
Ошибка: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию
Код: 80004005
Источник: Microsoft OLE DB Provider for ODBC Drivers
И у меня такой вопрос, все ли смогут писать в данную базу? Не нужны ли всем будут MS Acceess, Access Engine или подобное?

Последний раз редактировалось pogo, 02-12-2013 в 09:35.


Отправлено: 09:23, 02-12-2013 | #7


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить 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"
На сервере работает 2-ой скрипт, который смотрит в папку куда скидываются файлы пользователя, разбирает их и создаёт временный файл в формате IP \t UserName. Данный файл нужен для дальнейшего преобразования кодировок его соджержимого и уже потом создания выходного файла. Который в дальнейшем будет сброжен на Squid

Код: Выделить весь код
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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата pogo:
Т.к. проблему надо было решать "ещё вчера". Пришлось отказаться о товыряний с базой … »
Ну, тогда и я пока отложу этот вопрос. Как у Вас появится достаточное время — «свистите» в личку.

Отправлено: 05:40, 04-12-2013 | #9


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Подскажите пожалуйста.
При логине на несколько серверов под Win2012, первый скрипт выпадает в ошибку:
Цитата:
Script: ....\logon.vbs
Line: 32
Char: 1
Error: Invalid procedure call or argument
Code: 800A0005
Source: Microsoft VBScript runtime error
Подскажите пожалуйста куда копать, на др серверах и рабочих станциях всё нормально.

Отправлено: 13:48, 05-12-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход