Usuário com melhor resposta
Filtrar conteúdo em um arquivo TXT do logon.bat do AD ?

Pergunta
-
Olá pessoal,
Estou com a seguinte necessidade:
Vou inserir uma linha no script de logon.bat dos meus usuários no AD para filtrar o conteúdo do arquivo hosts da seguinte forma:
type %systemroot%\system32\drivers\etc\hosts > %computername%.logEntão irá gerar um txt com o nome da máquina do usuário, só que ali dentro preciso filtar uma linha que tem um IP e nome à qual o usuário usa para se logar no sistema da empresa, mais ou menos assim:
192.168.10.x nomedoaplicativo
Sendo que o ip à qual os usuários usam para se conectar são 4 distribuídos pela empresa. O que tem em comum nessa linha é o 192.168.10. e o carácter nomedoaplicativo.
Dessa forma preciso pegar esse "nome de arquivo gerado" exemplo MICRODOUSUÁRIO.LOG à qual tem a linha dentro: 192.168.10.x nomedoaplicativo, filtrar isso e jogar em outro arquivo com o nome da máquina do usuário e seu ip da aplicação correspondente.
Exemplo:fulano 192.168.10.x
beltrano 192.168.10.y
ciclano 192.168.10.z
Alguém pode me dar uma ajuda para fazer isso ?
Sds.- Editado Robsoncb quinta-feira, 21 de outubro de 2010 12:39 Gramática
Respostas
-
Robson,
Adicionei a verificacao do "#" - se o primeiro caractere da linha for # entao ele nao le a linha.
strArquivoLog = "\\servidor\share\todos.txt" on error resume next Const ForReading = 1 Const ForAppending = 8 'Pega nome do micro e caminho do windows Set wshShell = WScript.CreateObject( "WScript.Shell" ) strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" ) strSystemroot = wshShell.ExpandEnvironmentStrings( "%systemroot%" ) 'Abrir arquivos Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile(strSystemroot & "\system32\drivers\etc\hosts", ForReading) Set objFileLog= objFSO.OpenTextFile(strArquivoLog, ForAppending,true) 'Le arquivo linha por linha Do until objFile.AtEndofStream strLinha = objFile.ReadLine 'se o (inicio da linha for diferente de #) E (tiver "nomedoaplicativo") ENTAO trabalha com a linha if left(strLinha,1)<>"#" AND instr(strLinha,"nomedoaplicativo") then 'Insere os valores da linha em variaveis strLinha = replace(strLinha,vbtab," ") intPosicao = instr(strLinha," ") strIP = trim(left(strLinha,intPosicao)) strNome = trim(mid (strLinha,intPosicao)) 'Escreve no arquivo de saida objFileLog.writeline strComputerName & ";" & strIP & ";" & strNome end if Loop objFile.close objFileLog.close
Fábio de Paula Junior- Marcado como Resposta Robsoncb sexta-feira, 29 de outubro de 2010 13:26
-
O C:\windows era apenas um exemplo, pode utilizar um local onde o usuário tem permissão.
Quanto a opcao 2 adicione a parte em negrito no seu código
'Abrir arquivos
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strSystemroot & "\system32\drivers\etc\hosts", ForReading)
Set objFileLog= objFSO.OpenTextFile(strArquivoLog, ForAppending,true)
set objFileLog2=objFSO.OpenTextFile(strArquivoLog, ForReading)If objFileLog2.AtEndOfStream Then
ReadAllTextFile = ""
Else
ReadAllTextFile = objFileLog2.ReadAll
End If
if instr(ReadAllTextFile,strComputerName)>0 then wscript.quit
Fábio de Paula Junior- Marcado como Resposta Robsoncb segunda-feira, 8 de novembro de 2010 14:32
Todas as Respostas
-
-
Você pode utilizar o find.
Ex.: find %systemroot%\system32\drivers\etc\hosts /i "nomedoaplicativo" > %computername%.log
Fábio de Paula Junior
Ok Fábio, funcionou, filtrou a linha e jogou no log com o nome da máquina do usuário.
---------- \\computador\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.12 nomedoaplicativo
Mas agora eu preciso organizar isso em um arquivo .TXT ou Excel como se fosse uma tabela, pois preciso saber como está a organização desses ip´s nas máquinas.A tabela ficaria assim:
nomedocomputador ipdoaplicativo
Será que tem como ?
-
Tendo todos os arquivos no mesmo diretorio, faça o seguinte comando para junta-los em um só arquivo:copy *.log todos.txt
os arquivo todos.txt conterá dados assim (exemplo com dois arquivos)
---------- \\computador\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.12 nomedoaplicativo
---------- \\computador\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.13 nomedoaplicativo
Agora faça este comandofind todos.txt /v "----" > lista.txt
O lista.txt ficará assim:
---------- TODOS.TXT
192.168.10.12 nomedoaplicativo
192.168.10.13 nomedoaplicativo
→Agora fica fácil importar no EXCEL.
Fábio de Paula Junior- Sugerido como Resposta Fábio JrModerator quinta-feira, 21 de outubro de 2010 15:41
-
Fábio, ficou bom.
Mas eu preciso pegar nas linhas:
---------- \\computador1\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.12 nomedoaplicativo
---------- \\computador2\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.13 nomedoaplicativo
O computador e o ip dele, como por exemplo nesse esquema:192.168.10.12 computador1
192.168.10.13 computador2
Será que tem como filtrar assim ? -
Na mensagem anterior já tinha isto:
find todos.txt /v "----" > lista.txt
Sendo todos.txt o arquivo que uniu todos os arquivos e lista.txt ficará do jeito que vc precisa.
Veja que neste find utilizo /v ele mostra as linha que não contém o procurado, no caso as linhas que tem "----"
Fábio de Paula Junior -
Na mensagem anterior já tinha isto:
find todos.txt /v "----" > lista.txt
Sendo todos.txt o arquivo que uniu todos os arquivos e lista.txt ficará do jeito que vc precisa.
Fábio de Paula Junior
Ok Fábio,
Mas vamos lá, eu precisaria pegar na linha:
---------- \\computador1\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.12 nomedoaplicativo
---------- \\computador2\C$\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS
192.168.10.13 nomedoaplicativo
O nome do computador e o ip da aplicação dele, mas dando a linha de comando find todos.txt /v "----" > lista.txt só vai o ip do aplicativo e o nomedoaplicativo intende.
Exemplo ali em vez da linha:
192.168.10.13 nomedoaplicativoTeria que ser:
192.168.10.13 computador2
Compreende ?
-
Entendi.
Acho melhor então tentar outra abordagem onde este nome da maquina já entra no primerio arquivo gerado: computer.txt.
No script que gera o computer.txt, tente fazer aquele find para dentro de uma variavel ao invés de jogar pra dentro do arquivo, e depois gere o computer.txt assim:
echo %computername% %var_hosts% > %computername%.log
Fábio de Paula Junior -
Entendi.
Acho melhor então tentar outra abordagem onde este nome da maquina já entra no primerio arquivo gerado: computer.txt.
No script que gera o computer.txt, tente fazer aquele find para dentro de uma variavel ao invés de jogar pra dentro do arquivo, e depois gere o computer.txt assim:
echo %computername% %var_hosts% > %computername%.log
Fábio de Paula Junior
Ok Fábio, vamos lá.
Não entendi muito bem esse passo, "tente fazer aquele find para dentro de uma variavel" ?E depois na linha:
echo %computername% %var_hosts% > %computername%.log
Em var_hosts eu uso o nomedoaplicativo ?
Abraço. -
Transformei em .vbs
Ele já grava tudo em um só arquivo o todos.txt
Experimenta ele.
Em negrito onde vc deve colocar o nome do sistema ou sistemas que vc quer procurar no arquivo host. No exemplo ele procura por dois sistemas, ai vc pode alterar.
----
strArquivoLog = "\\servidor\share\todos.txt"on error resume next
Const ForReading = 1
Const ForAppending = 8
'Pega nome do micro e caminho do windows
Set wshShell = WScript.CreateObject( "WScript.Shell" )
strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )
strSystemroot = wshShell.ExpandEnvironmentStrings( "%systemroot%" )
'Abrir arquivos
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strSystemroot & "\system32\drivers\etc\hosts", ForReading)
Set objFileLog= objFSO.OpenTextFile(strArquivoLog, ForAppending,true)
'Le arquivo linha por linha
Do until objFile.AtEndofStream
strLinha = objFile.ReadLine
'se tiver "nomedoaplicativo" trabalha com a linha
if instr(strLinha,"nomedoaplicativo") or instr(strLinha,"nome2") then
'Insere os valores da linha em variaveis
strLinha = replace(strLinha,vbtab," ")
intPosicao = instr(strLinha," ")
'if intPosicao= 0 then intPosicao = instr(strLinha,vbtab)
strIP = trim(left(strLinha,intPosicao))
strNome = trim(mid (strLinha,intPosicao))'Escreve no arquivo de saida
objFileLog.writeline strComputerName & ";" & strIP & ";" & strNome
end ifLoop
objFile.close
objFileLog.close
Fábio de Paula Junior -
Ok Fábio. testei aqui e funcionou, vlw mesmo.
Na linha à qual tem o nome do aplicativo, só quero um mesmo aí coloquei assim correto, está certo ?if instr(strLinha,"nomedoaplicativo ") then
Outra coisa algumas máquinas como a nossa do suporte temos no hosts várias linhas de conexão ao aplicativo comentadas correto, exemplo:
127.0.0.1 localhost
#192.168.10.1 nomedoaplicativo
#192.168.10.2 nomedoaplicativo
192.168.10.3 nomedoaplicativo
#192.168.10.4 nomedoaplicativo
Pois temos que testar a conexão em vários servidores.
Dessa forma, quando rodei o .vbs na minha máquina houve a captura assim:
computador;#192.168.10.1;nomedoaplicativo
computador;#192.168.10.2;nomedoaplicativo
computador;192.168.10.3;nomedoaplicativo
computador;#192.168.10.4;nomedoaplicativo
Será que teria como excluir no .vbs as linhas que são comentadas ?- Editado Robsoncb quinta-feira, 28 de outubro de 2010 14:02 Inserir dados
-
Robson,
Adicionei a verificacao do "#" - se o primeiro caractere da linha for # entao ele nao le a linha.
strArquivoLog = "\\servidor\share\todos.txt" on error resume next Const ForReading = 1 Const ForAppending = 8 'Pega nome do micro e caminho do windows Set wshShell = WScript.CreateObject( "WScript.Shell" ) strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" ) strSystemroot = wshShell.ExpandEnvironmentStrings( "%systemroot%" ) 'Abrir arquivos Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile(strSystemroot & "\system32\drivers\etc\hosts", ForReading) Set objFileLog= objFSO.OpenTextFile(strArquivoLog, ForAppending,true) 'Le arquivo linha por linha Do until objFile.AtEndofStream strLinha = objFile.ReadLine 'se o (inicio da linha for diferente de #) E (tiver "nomedoaplicativo") ENTAO trabalha com a linha if left(strLinha,1)<>"#" AND instr(strLinha,"nomedoaplicativo") then 'Insere os valores da linha em variaveis strLinha = replace(strLinha,vbtab," ") intPosicao = instr(strLinha," ") strIP = trim(left(strLinha,intPosicao)) strNome = trim(mid (strLinha,intPosicao)) 'Escreve no arquivo de saida objFileLog.writeline strComputerName & ";" & strIP & ";" & strNome end if Loop objFile.close objFileLog.close
Fábio de Paula Junior- Marcado como Resposta Robsoncb sexta-feira, 29 de outubro de 2010 13:26
-
Olá Fábio. pode me dar mas uma ajuda:
O .vbs funcionou, ao logar nas estações ele vai jogando no todos.txt as linhas certo. Só que ele só vai adicionando correto.
Teria como fazer um esquema para ele ir retirando o nome da máquina à qual ele ja gravou, exemplo:
Me loguei e foi criado as linhas:
computador1;192.168.10.3;nomedoaplicativo
computador1;192.168.10.3;nomedoaplicativo
computador2;192.168.10.18;nomedoaplicativo
computador2;192.168.10.18;nomedoaplicativo
computador1;192.168.10.3;nomedoaplicativo
Aí quando os micros computador1 e computador2 se logassem novamente o todos.txt ficaria como abaixo, sem as reptições, ele eliminaria as linhas repetidas.
computador1;192.168.10.3;nomedoaplicativo
computador2;192.168.10.18;nomedoaplicativo -
voce tem as seguintes alternativas:
1) Criar um arquivo de controle na estacao após rodar o script e quando rodar o script de novo verificar se o arquivo existe
No final do script vc manda criar um arquivo na estacao (Ex: c:\windows\controle1.txt), e no inicio do script vc coloca um comando para verificar se o arquivos controle1.txt existe, se existir siginifica que o script já foi rodado anteriormente e nao precisa ser executado novamente.
Pró: Rápido,
Contra: se o micro for formatado ele executará o script novamente
Fileexist: http://msdn.microsoft.com/en-us/library/x23stk5t(VS.85).aspx
2) No inicio do script ler o arquivo todos.txt tentando localizar o nome da maquina, se localizar não roda o script
Este tem duas formas, ler o arquivo linha a linha ou utilizar o Readall e utilizar o INSTR para verificar se existe a string com o nome do computador
Pró: Não executará novamente mesmo que o arquivo seja apagado
Contra: A leitura do arquivo Todos.txt pode ficar lenta com o tempo dependendo da quantidade de linhas.
ReadAll: http://msdn.microsoft.com/en-us/library/t58aa4dd(VS.85).aspx
Fábio de Paula Junior -
Olá, Fábio vamos lá.
A opção número 1 ficaria meio difícil, porque os usuários não tem permissão na pasta c:\windows para escrever o controles1.txt certo.
Acho melhor optar pela solução número 2 correto.
---------
Você falou que:
"Este tem duas formas, ler o arquivo linha a linha ou utilizar o Readall e utilizar o INSTR para verificar se existe a string com o nome do computador
Pró : Não executará novamente mesmo que o arquivo seja apagado
Contra : A leitura do arquivo Todos.txt pode ficar lenta com o tempo dependendo da quantidade de linhas."
----------Talvez a opção número 2 não demore muito tempo se eu zerar o arquivo de tempos em tempos certo, pois ele iria começar do zero em um arquivo limpo certo.
Bom, pelo visto a opção com o Readall e utilizar o INSTR para verificar se existe a string com o nome do computador parece ser a mais viável. Você pode me dar uma ajuda para montar esse esquema com eles ?
- Editado Robsoncb quinta-feira, 4 de novembro de 2010 12:12 Correção
-
O C:\windows era apenas um exemplo, pode utilizar um local onde o usuário tem permissão.
Quanto a opcao 2 adicione a parte em negrito no seu código
'Abrir arquivos
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strSystemroot & "\system32\drivers\etc\hosts", ForReading)
Set objFileLog= objFSO.OpenTextFile(strArquivoLog, ForAppending,true)
set objFileLog2=objFSO.OpenTextFile(strArquivoLog, ForReading)If objFileLog2.AtEndOfStream Then
ReadAllTextFile = ""
Else
ReadAllTextFile = objFileLog2.ReadAll
End If
if instr(ReadAllTextFile,strComputerName)>0 then wscript.quit
Fábio de Paula Junior- Marcado como Resposta Robsoncb segunda-feira, 8 de novembro de 2010 14:32
-