Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту) (http://forum.oszone.net/showthread.php?t=272968)

pogo 28-11-2013 14:16 2263089

Поиск подстроки в файле с последующей заменой подстроки (многопользовательский досту)
 
Доброго времени суток!
Прощу помощи при решении следующего вопроса!
Необходим скрипт, который будет закинуть в 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-адрес отличается от того, что был в файле, то заменить его на новый.
Ещё не очень понимаю, как быть при варианте, что несколько людей залогинелись одновременно и файл будет открыт сразу несколькими пользователя.
Заранее спасибо всем кто откликнется и поможет реализовать данную задачу хотя бы частично.

Iska 28-11-2013 14:53 2263108

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

pogo 28-11-2013 15:07 2263115

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

Iska 28-11-2013 15:46 2263139

Цитата:

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

Причины, по которым текстовый файл не слишком подходит, я описал выше.

Цитата:

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

Разве я что-то говорил про MySQL?

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

Цитата:

Цитата pogo
мне кажется это очень излишне. »

А мне — нет: я пробовал и то, и другое.

Цитата:

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

Извлекать данные из реляционной базы данных на порядок проще, нежели из csv.

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

pogo 28-11-2013 16:09 2263161

Цитата:

Цитата 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

Iska 28-11-2013 18:33 2263245

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

pogo 02-12-2013 09:23 2265346

Да, Вы меня правильно поняли.
Есть 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 03-12-2013 11:43 2266021

Т.к. проблему надо было решать "ещё вчера". Пришлось отказаться о товыряний с базой и пойти по протезному варианту, в итоге получилось так:
Получилось 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"

В том, что вышел очень знатный протез, я и сам знаю. Но может кому приходиться или кто-то посоветует как улучшить\поправить\допилить сиё творение.

Iska 04-12-2013 05:40 2266602

Цитата:

Цитата pogo
Т.к. проблему надо было решать "ещё вчера". Пришлось отказаться о товыряний с базой … »

Ну, тогда и я пока отложу этот вопрос. Как у Вас появится достаточное время — «свистите» в личку.

pogo 05-12-2013 13:48 2267379

Подскажите пожалуйста.
При логине на несколько серверов под Win2012, первый скрипт выпадает в ошибку:
Цитата:

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

Iska 05-12-2013 16:45 2267496

pogo, какой из скриптов в этой теме вы именуете «первым», и какая строка в нём под номером 32?

pogo 05-12-2013 17:53 2267531

Ой, что-то не подумал что в теме уже куча скриптов.
Под "первым" я имел ввиду вот этот:
Код:

' Получение 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"

Строка 32:
Код:

file.Write strUserName
В общем проблема была решена следующим образом:
В Control Panel -> All Control Panel -> Region and Language.
Вкладка Formats, поле Format указал Russia
Вкладка Location, поле Current location указал Russia
Вкладка Administrative -> Change system locale... указал Russian (Russia) (После изменения этого поля система попросит перезагрузиться)
Ребутнулся и вроде ошибка пропала.

Iska 06-12-2013 17:59 2268162

pogo, достаточно странно. В указанной строке вроде бы нет никаких зависимостей от региональных настроек.


Время: 05:58.

Время: 05:58.
© OSzone.net 2001-