none
Script de logon/logoff gerando arquivo txt RRS feed

  • Pergunta

  • Pessoal,

    Gostaria de uma ajuda para gerar um script de logon/logoff dos meus usuários aqui na rede.

    Eu criei pesquisando o fórum o seguinte script :

    Option Explicit

    Dim objFSO, objLogFile, objNetwork, objShell, strText, intAns
    Dim intConstants, intTimeout, strTitle, intCount, blnLog
    Dim strUserName, strComputerName, strIP, strShare, strLogFile
    Dim fso, sf, StrNew
    Const ForAppending = 8

    Set fso = CreateObject("Scripting.FileSystemObject")

    strShare = "\\cronos\logs$"
    strLogFile = "logonoff.txt"
    intTimeout = 20

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objNetwork = CreateObject("Wscript.Network")
    Set objShell = CreateObject("Wscript.Shell")

    strUserName = objNetwork.UserName
    strComputerName = objNetwork.ComputerName



    If objFSO.FolderExists(strShare) Then
      On Error Resume Next
      Set objLogFile = objFSO.OpenTextFile(strShare & "\" & strLogFile, 8, True, 0)
      If Err.Number = 0 Then
        intCount = 1
        blnLog = False
        Do Until intCount = 3
          objLogFile.WriteLine "Logon    "  & Now & "    " & strComputerName & "    " & strUserName 
          If Err.Number = 0 Then
            intCount = 3
            blnLog = True
          Else
            Err.Clear
            intCount = intCount + 1
            If Wscript.Version > 5 Then
              Wscript.Sleep 200
            End If
          End If
        Loop
        On Error GoTo 0


    Dim fa, fb, f, s, OpSysSet

    Set objFSO = Nothing
    Set objNetwork = Nothing
    Set objShell = Nothing

    Wscript.Quit


    Que me gera a saída :

    Logon    25/1/2007 10:38:27    EROS    paulo

    Tenho outro pra logoff no mesmo formato que me gera :

    Logoff    25/1/2007 10:35:26    EROS    paulo

    *** Queria que, entre minha máquina e login do usuário, aparecesse o IP da máquina.
    Já tentei uma variável chamada :

    objAdapter.IPAddress

    Onde declaro da seguinte forma :

    strUserName = objNetwork.UserName
    strComputerName = objNetwork.ComputerName
    strIPAddress = objAdapter.IPAddress

    e incluo na impressão, assim como username e computername, mas não funciona, pois dá erro.

    O que estou fazendo de errado?

    quinta-feira, 25 de janeiro de 2007 16:23

Respostas

  • Caro Ricardo, muito obrigado pelo seu retorno, era justamente o que eu queria.

    Funcionou aqui, porém com um detalhe, faltou declarar a variável i (em destaque logo abaixo), conforme erro que gera na hora de rodar o script.

    Abraços a todos!

    Fiz o acerto e o script na íntegra ficou assim :

    Option Explicit

    Dim objFSO, objLogFile, objNetwork, objShell, strText, intAns, strComputer, objWMIService
    Dim intConstants, intTimeout, strTitle, intCount, blnLog, IPconfigSet, Ipconfig, IP
    Dim strUserName, strComputerName, strIP, strShare, strLogFile
    Dim fso, sf, StrNew
    Const ForAppending = 8

    Set fso = CreateObject("Scripting.FileSystemObject")

    strComputer = "."
    strShare = "
    \\cronos\logs$"
    strLogFile = "logonoff.txt"
    intTimeout = 20

    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objNetwork = CreateObject("Wscript.Network")
    Set objShell = CreateObject("Wscript.Shell")

    Set IPConfigSet = objWMIService.ExecQuery _
        ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
    strUserName = objNetwork.UserName
    strComputerName = objNetwork.ComputerName

    For Each IPConfig in IPConfigSet
        If Not IsNull(IPConfig.IPAddress) Then
            For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
                IP = IPConfig.IPAddress(i)
            Next
        End If
    Next

     

    If objFSO.FolderExists(strShare) Then
      On Error Resume Next
      Set objLogFile = objFSO.OpenTextFile(strShare & "\" & strLogFile, 8, True, 0)
      If Err.Number = 0 Then
        intCount = 1
        blnLog = False
        Do Until intCount = 3
          objLogFile.WriteLine "Logon    "  & Now & "    " & strComputerName & "    " & strUserName  & " com o ip " & IP
          If Err.Number = 0 Then
            intCount = 3
            blnLog = True
          Else
            Err.Clear
            intCount = intCount + 1
            If Wscript.Version > 5 Then
              Wscript.Sleep 200
            End If
          End If
        Loop
     '   On Error GoTo 0
    End If
    End If


    Dim fa, fb, f, s, OpSysSet, i

    Set objFSO = Nothing
    Set objNetwork = Nothing
    Set objShell = Nothing

    Wscript.Quit

    sexta-feira, 26 de janeiro de 2007 11:49

Todas as Respostas

  • O endereço IP não pode ser obtido diretamente pelo Windows Script Host. No entanto, existem várias formas de se fazer isso... abaixo tem uma delas, via WMI (e que não deve funcionar no 98SE padrão... a não ser que vc instale o WMICore)

    http://www.microsoft.com/technet/scriptcenter/scripts/network/client/list/nwlsvb01.mspx

    []s,


    Vinicius  

    quinta-feira, 25 de janeiro de 2007 17:32
    Moderador
  • Fala Vinicius, blz?

    Eu já tinha lido e até executei esse script aqui na empresa e funciona de boa, mas não queria imprimir em tela...

    Eu peguei o script abaixo, aqui mesmo no fórum e adaptei ele, só que tem muita coisa desnecessária, e o que eu queria mesmo era somente o básico, como eu disse acima.

    O problema é que não sei aonde estou errando para o script não funcionar, tipo, alguma variável declarada erradamente.

    O script abaixo funciona de boa, porém tem informações desnecessárias.

    Pode me ajudar ?

     

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\"& strComputer & "\root\cimv2")
    Set colAdapters = objWMIService.ExecQuery ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
    Set oNetwork = CreateObject("WScript.Network")
    Dim fso, sf, StrNew
    Const ForAppending = 8
    Set fso = CreateObject("Scripting.FileSystemObject")
    systime = Now()
    StrNew="
    \\cronos\Logs$\" & cstr(year(systime)) & "-" & cstr(month(systime)) & "-" & cstr(day(systime)) & ".txt"
    set sf=fso.OpenTextFile (StrNew, ForAppending, True)
    sf.writeline ""
    sf.writeline "=== Informações do Logon de Usuário ==="
    sf.writeline ""
    sf.writeline "Data: " & cstr(Date())
    sf.writeline "Hora: " & cstr(Time())
    sf.writeline ""
    sf.writeline "  Nome de Usuário          : " & oNetwork.UserName
    sf.writeline ""
    sf.writeline "=== Listando dispositivos de Rede ==="
    n = 1
     
    For Each objAdapter in colAdapters
    sf.writeline ""
       sf.writeline "  * Adaptador N.º " & n
    sf.writeline ""
       sf.writeline "  Descrição             : " & objAdapter.Description
     
       sf.writeline "  Endereço Físico (MAC) : " & objAdapter.MACAddress
       sf.writeline "  Nome de Host          : " & objAdapter.DNSHostName
     
       If Not IsNull(objAdapter.IPAddress) Then
          For i = 0 To UBound(objAdapter.IPAddress)
       sf.writeline "  Endereço IP           : " & objAdapter.IPAddress(i)
          Next
       End If
     
       If Not IsNull(objAdapter.IPSubnet) Then
          For i = 0 To UBound(objAdapter.IPSubnet)
       sf.writeline "  Mascara               : " & objAdapter.IPSubnet(i)
          Next
       End If
     
       If Not IsNull(objAdapter.DefaultIPGateway) Then
          For i = 0 To UBound(objAdapter.DefaultIPGateway)
       sf.writeline "  Gateway               : " & objAdapter.DefaultIPGateway(i)
          Next
       End If
     
       n = n + 1
    Next

    sf.writeline ""
    sf.writeline "=== FIM ==="
    sf.close

    Wscript.Quit

    quinta-feira, 25 de janeiro de 2007 18:43
  • Bem pelo o que eu li vc queria colocar o IP da maquina no log támbem.

     

    Então ta ae agora no log ele tambem coloca o IP

     

    --------------------------

    Option Explicit

    Dim objFSO, objLogFile, objNetwork, objShell, strText, intAns, strComputer, objWMIService
    Dim intConstants, intTimeout, strTitle, intCount, blnLog, IPconfigSet, Ipconfig, IP
    Dim strUserName, strComputerName, strIP, strShare, strLogFile
    Dim fso, sf, StrNew
    Const ForAppending = 8

    Set fso = CreateObject("Scripting.FileSystemObject")

    strComputer = "."
    strShare = "\\cronos\logs$"
    strLogFile = "logonoff.txt"
    intTimeout = 20

    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objNetwork = CreateObject("Wscript.Network")
    Set objShell = CreateObject("Wscript.Shell")

    Set IPConfigSet = objWMIService.ExecQuery _
        ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
    strUserName = objNetwork.UserName
    strComputerName = objNetwork.ComputerName

    For Each IPConfig in IPConfigSet
        If Not IsNull(IPConfig.IPAddress) Then
            For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
                IP = IPConfig.IPAddress(i)
            Next
        End If
    Next

     

    If objFSO.FolderExists(strShare) Then
      On Error Resume Next
      Set objLogFile = objFSO.OpenTextFile(strShare & "\" & strLogFile, 8, True, 0)
      If Err.Number = 0 Then
        intCount = 1
        blnLog = False
        Do Until intCount = 3
          objLogFile.WriteLine "Logon    "  & Now & "    " & strComputerName & "    " & strUserName  & " com o ip " & IP
          If Err.Number = 0 Then
            intCount = 3
            blnLog = True
          Else
            Err.Clear
            intCount = intCount + 1
            If Wscript.Version > 5 Then
              Wscript.Sleep 200
            End If
          End If
        Loop
     '   On Error GoTo 0
    End If
    End If


    Dim fa, fb, f, s, OpSysSet

    Set objFSO = Nothing
    Set objNetwork = Nothing
    Set objShell = Nothing

    Wscript.Quit

    quinta-feira, 25 de janeiro de 2007 20:03
  • Caro Ricardo, muito obrigado pelo seu retorno, era justamente o que eu queria.

    Funcionou aqui, porém com um detalhe, faltou declarar a variável i (em destaque logo abaixo), conforme erro que gera na hora de rodar o script.

    Abraços a todos!

    Fiz o acerto e o script na íntegra ficou assim :

    Option Explicit

    Dim objFSO, objLogFile, objNetwork, objShell, strText, intAns, strComputer, objWMIService
    Dim intConstants, intTimeout, strTitle, intCount, blnLog, IPconfigSet, Ipconfig, IP
    Dim strUserName, strComputerName, strIP, strShare, strLogFile
    Dim fso, sf, StrNew
    Const ForAppending = 8

    Set fso = CreateObject("Scripting.FileSystemObject")

    strComputer = "."
    strShare = "
    \\cronos\logs$"
    strLogFile = "logonoff.txt"
    intTimeout = 20

    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objNetwork = CreateObject("Wscript.Network")
    Set objShell = CreateObject("Wscript.Shell")

    Set IPConfigSet = objWMIService.ExecQuery _
        ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
    strUserName = objNetwork.UserName
    strComputerName = objNetwork.ComputerName

    For Each IPConfig in IPConfigSet
        If Not IsNull(IPConfig.IPAddress) Then
            For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
                IP = IPConfig.IPAddress(i)
            Next
        End If
    Next

     

    If objFSO.FolderExists(strShare) Then
      On Error Resume Next
      Set objLogFile = objFSO.OpenTextFile(strShare & "\" & strLogFile, 8, True, 0)
      If Err.Number = 0 Then
        intCount = 1
        blnLog = False
        Do Until intCount = 3
          objLogFile.WriteLine "Logon    "  & Now & "    " & strComputerName & "    " & strUserName  & " com o ip " & IP
          If Err.Number = 0 Then
            intCount = 3
            blnLog = True
          Else
            Err.Clear
            intCount = intCount + 1
            If Wscript.Version > 5 Then
              Wscript.Sleep 200
            End If
          End If
        Loop
     '   On Error GoTo 0
    End If
    End If


    Dim fa, fb, f, s, OpSysSet, i

    Set objFSO = Nothing
    Set objNetwork = Nothing
    Set objShell = Nothing

    Wscript.Quit

    sexta-feira, 26 de janeiro de 2007 11:49
  • Cara como eu odeio option explicit :)

    Que bom que funcionou e que seja bem uti.

     

    Falow brother abraço :)

    sexta-feira, 26 de janeiro de 2007 15:00
  • Valeu Ricardo!

    Ajudou bastante!

    Abração!

    segunda-feira, 29 de janeiro de 2007 11:27
  • Parece bobo, mas o Option Explicit tem algumas vantagens. Se vc acostuma com ele, depois fica muito fácil pra portar e aprender outras linguagens bem úteis para admins, como C e JScript.

    []s,


    Vinicius  
    sexta-feira, 2 de fevereiro de 2007 13:57
    Moderador
  • Bom dia, achei muito interessante o script e ele faz exatamente oque estou necessitando, se possível voce poderia me mandar o código de logoff tambem ? Agradeço muito a sua ajuda se possível pois estou iniciando em scripts.
    segunda-feira, 5 de fevereiro de 2007 18:27
  • Vinicius, não tem erro.

    É só trocar a palavra Logon por Logoff na impressão, e logicamente salvar como logoff.vbs e aplicar na GPO de logoff.

    Beleza?

    Abraços

    segunda-feira, 5 de fevereiro de 2007 19:17
  • Bom dia Paulo, agraqdeço sua atenção mas como comecei a pesquisar hoje sobre scripts do AD e ainda nao possuo tanta habilidade, pesso sua ajuda para me explicar como faco para por esse script para funcionar porque nao entendi muito bem.

    Abusando um pouco da sua boa vontade hehehe, seria possivel por para ele gerar esse log diário por exemplo o arquivo a ser gerado por exemplo ser nomeado 05022007 e amanha o script gerar um novo arquivo no final do dia com a data do dia e o relatorio de login e logoff ?

     

    Tenha um bom dia.

    segunda-feira, 5 de fevereiro de 2007 19:44
  • Cara,

    Eu tenho um aqui, inclusive achei no fórum, só que não lembro aonde achei e de quem é.

    Vc no caso teria que adaptá-lo ao que eu tb adaptei.

    Segue abaixo :

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\"& strComputer & "\root\cimv2")
    Set colAdapters = objWMIService.ExecQuery ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
    Set oNetwork = CreateObject("WScript.Network")
    Dim fso, sf, StrNew
    Const ForAppending = 8
    Set fso = CreateObject("Scripting.FileSystemObject")
    systime = Now()
    StrNew="
    \\servidor\Logs$\" & cstr(year(systime)) & "-" & cstr(month(systime)) & "-" & cstr(day(systime)) & ".txt"
    set sf=fso.OpenTextFile (StrNew, ForAppending, True)
    sf.writeline ""
    sf.writeline "=== Informações do Logon de Usuário ==="
    sf.writeline ""
    sf.writeline "Data: " & cstr(Date())
    sf.writeline "Hora: " & cstr(Time())
    sf.writeline ""
    sf.writeline "  Nome de Usuário          : " & oNetwork.UserName
    sf.writeline ""
    sf.writeline "=== Listando dispositivos de Rede ==="
    n = 1
     
    For Each objAdapter in colAdapters
    sf.writeline ""
       sf.writeline "  * Adaptador N.º " & n
    sf.writeline ""
       sf.writeline "  Descrição             : " & objAdapter.Description
     
       sf.writeline "  Endereço Físico (MAC) : " & objAdapter.MACAddress
       sf.writeline "  Nome de Host          : " & objAdapter.DNSHostName
     
       If Not IsNull(objAdapter.IPAddress) Then
          For i = 0 To UBound(objAdapter.IPAddress)
       sf.writeline "  Endereço IP           : " & objAdapter.IPAddress(i)
          Next
       End If
     
       If Not IsNull(objAdapter.IPSubnet) Then
          For i = 0 To UBound(objAdapter.IPSubnet)
       sf.writeline "  Mascara               : " & objAdapter.IPSubnet(i)
          Next
       End If
     
       If Not IsNull(objAdapter.DefaultIPGateway) Then
          For i = 0 To UBound(objAdapter.DefaultIPGateway)
       sf.writeline "  Gateway               : " & objAdapter.DefaultIPGateway(i)
          Next
       End If
     
       n = n + 1
    Next

    sf.writeline ""
    sf.writeline "=== FIM ==="
    sf.close

    Wscript.Quit

    ==========================================

    Existe uma série de informações desnecessárias, como mascara de rede, placa de rede, pelo menos pra mim.
    Aonde coloquei de azul é a informação que imprime da forma q vc quer, mas tem q ver as variáveis e objetos, pois são scripts diferentes!
    Já que vc também está aprendendo, faça as adaptações e poste o resultado, pois vai ser útil pra todo mundo!

    Abraços

    segunda-feira, 5 de fevereiro de 2007 20:31