none
Filtrar conteúdo em um arquivo TXT do logon.bat do AD ? RRS feed

  • 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%.log

    Entã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
    quinta-feira, 21 de outubro de 2010 12:38

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
    quinta-feira, 28 de outubro de 2010 14:49
    Moderador
  • 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
    quinta-feira, 4 de novembro de 2010 13:18
    Moderador

Todas as Respostas

  •  

    Você pode utilizar o find.

    Ex.: find %systemroot%\system32\drivers\etc\hosts /i "nomedoaplicativo" > %computername%.log


    Fábio de Paula Junior
    quinta-feira, 21 de outubro de 2010 14:03
    Moderador
  •  

    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 ?


    quinta-feira, 21 de outubro de 2010 14:38

  • 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 comando

    find 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
    quinta-feira, 21 de outubro de 2010 15:41
    Moderador
  • 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 ?

     

    quinta-feira, 21 de outubro de 2010 17:05
  •  

    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
    quinta-feira, 21 de outubro de 2010 17:29
    Moderador
  •  

    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  nomedoaplicativo

    Teria que ser:
    192.168.10.13  computador2

    Compreende ?

    quinta-feira, 21 de outubro de 2010 18:00
  • 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
    quinta-feira, 21 de outubro de 2010 18:36
    Moderador
  • 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.


    quarta-feira, 27 de outubro de 2010 00:04
  • 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 if

    Loop

    objFile.close
    objFileLog.close

     


    Fábio de Paula Junior
    quarta-feira, 27 de outubro de 2010 16:50
    Moderador
  • 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
    quinta-feira, 28 de outubro de 2010 13:33
  • 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
    quinta-feira, 28 de outubro de 2010 14:49
    Moderador
  • 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

    sexta-feira, 29 de outubro de 2010 14:42
  • 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
    sábado, 30 de outubro de 2010 18:31
    Moderador
  • 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
    quinta-feira, 4 de novembro de 2010 12:11
  • 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
    quinta-feira, 4 de novembro de 2010 13:18
    Moderador
  • Fábio,

    Valeu mesmo funcionou, como tenho uns 100 micros na rede, a leitura do arquivo não deve ficar lenta, ainda mas que o número de lnhas não deve crescer, porque os pc´s não devem aumentar também.

    segunda-feira, 8 de novembro de 2010 14:34