none
Como controlar período de logon permitido com horários quebrados de expediente em uma empresa com GPO e Script. RRS feed

  • Pergunta

  • No meu cenário limitamos o acesso aos computadores, podendo ser usados apenas dentro do horário do expediente. Por serem horários quebrados uso script para validar no logon e no final do expediente um agendamento para desligar o equipamento.

    Segue o script:

    refentrada="07:10:00"
    refsaida="17:30:00"
    agora=time

    If agora < cdate(refsaida) Then 

      diferenca=DateDiff("n",agora,refentrada)
      Set WShShell=WScript.CreateObject("WScript.Shell")  
      If diferenca >= 10 Then
       WshShell.run "shutdown -l -f"
      End If

    Else

      diferenca=DateDiff("n",refsaida,agora)
      Set WShShell=WScript.CreateObject("WScript.Shell")  
      If diferenca >= 10 Then
       WshShell.run "shutdown -s -f"
      End If

    End If

    Set WShShell=Nothing

    Porém existem funcionários que tem horários diferentes do padronizado, e nem todos tem esses horários iguais.

    Preciso de ajuda para ter uma melhor gestão sobre estes horários sem precisar criar um IF no script para cada horário diferente que surgir.

    Pensei na possibilidade de um script que usasse o nome da Unidade Organizacional como parâmetro para definir os horários de logon dos usuários dentro dessa Unidade Organizacional.

    Ex.:

    (Dominio)
     |_(unidade_organizacional) #unidade organizacional genérica.
    [[gpo_expediente_com_script]] #gpo vinculada.
              |_(07h00_17h30) #unidade organizacional com expediente padrão.
              |     (usuarios + computadores)
              |_(07h00_18h30) #... com expediente exceção conforme o nome
              |     (usuarios exceção + computadores)
              |_(09h00_19h30) #... com expediente exceção conforme o nome
                    (usuarios exceção + computadores)

    Usando os nomes das UO como parâmetro para definir os respectivos horários.

    Peço ajuda e estou aberto a outras idéias.

    segunda-feira, 30 de outubro de 2017 19:23

Respostas

  • Acabei fazendo o seguinte, criei arquivos TXT onde coloco os nomes de computadores, um por linha.

    E fiz o script abaixo para ler os arquivos e comparar, assim executando a regra de logon que desejo apenas trabalhando no arquivo texto.

    Espero assim ajudar outras pessoas.

    ForReading = 1 
    refentrada="07:10:00" 'Não loga antes das 07h00
    refsaida1730="17:30:00" 'Não loga a partir das 17h40
    refsaida1830="18:30:00" 'Não loga a partir das 18h40
    refsaida1900="19:00:00" 'Não loga a partir das 19h10
    agora=time

    'Objeto FSO Tipo Arquivo
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Objeto Shell
    Set objShell=CreateObject("WScript.Shell")

    'Objeto para pegar o nome do computador
    strCompName = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%")

    'Objeto para ler o arquivo
    Set objFileRead1740 = objFSO.OpenTextFile("caminho_do_arquivo\07h00_17h40.txt", ForReading)
    Set objFileRead1840 = objFSO.OpenTextFile("caminho_do_arquivo\07h00_18h40.txt", ForReading)
    Set objFileRead1900 = objFSO.OpenTextFile("caminho_do_arquivo\07h00_19h00.txt", ForReading)

    i=0
    Do Until objFileRead1740.AtEndOfStream
    'Numero da Linha
    i = i + 1

    'Le linha
    strLinha = objFileRead1740.ReadLine

       If strCompName = strLinha Then
          WScript.Echo "Nome do Computador: " & strCompName & " - Nome no arquivo: " & strLinha & " - Horário: 07h00 as 17h40"
          If agora < cdate(refsaida1730) Then 

             diferenca=DateDiff("n",agora,refentrada)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -l -f"
             End If

          Else
      
             diferenca=DateDiff("n",refsaida1730,agora)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -s -f"
             End If

          End If
       End If

    Loop

    i=0
    Do Until objFileRead1840.AtEndOfStream
    'Numero da Linha
    i = i + 1

    'Le linha
    strLinha = objFileRead1840.ReadLine

       If strCompName = strLinha Then
          WScript.Echo "Nome do Computador: " & strCompName & " - Nome no arquivo: " & strLinha & " - Horário: 07h00 as 18h40"
          If agora < cdate(refsaida1830) Then 

             diferenca=DateDiff("n",agora,refentrada)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -l -f"
             End If

          Else
      
             diferenca=DateDiff("n",refsaida1830,agora)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -s -f"
             End If

          End If
       End If

    Loop

    i=0
    Do Until objFileRead1900.AtEndOfStream
    'Numero da Linha
    i = i + 1

    'Le linha
    strLinha = objFileRead1900.ReadLine

       If strCompName = strLinha Then
          WScript.Echo "Nome do Computador: " & strCompName & " - Nome no arquivo: " & strLinha & " - Horário: 07h00 as 19h10"
          If agora < cdate(refsaida1900) Then 

             diferenca=DateDiff("n",agora,refentrada)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -l -f"
             End If

          Else
      
             diferenca=DateDiff("n",refsaida1900,agora)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -s -f"
             End If

          End If
       End If

    Loop

    objFileRead1740.Close
    objFileRead1840.Close
    objFileRead1900.Close
    Set WShShell=Nothing

    Att. Daniel

    • Editado DaniGS sexta-feira, 3 de novembro de 2017 16:47
    • Marcado como Resposta DaniGS sexta-feira, 3 de novembro de 2017 16:48
    quarta-feira, 1 de novembro de 2017 15:15

Todas as Respostas

  • Olá,

    Vejo que a tendência de granularidade deste tipo de controle tende somente a aumente na sua Organização, não seria o momento de partir para uma Aplicação Corporativa para atuar nesta questão?

    Como sugestão indico o UserLock

    https://www.isdecisions.com/products/userlock/

    A disposição,

    Marcos Roberto de Lima
    MCT-MCTS-MCITP-MCP

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 31 de outubro de 2017 14:25
  • Acabei fazendo o seguinte, criei arquivos TXT onde coloco os nomes de computadores, um por linha.

    E fiz o script abaixo para ler os arquivos e comparar, assim executando a regra de logon que desejo apenas trabalhando no arquivo texto.

    Espero assim ajudar outras pessoas.

    ForReading = 1 
    refentrada="07:10:00" 'Não loga antes das 07h00
    refsaida1730="17:30:00" 'Não loga a partir das 17h40
    refsaida1830="18:30:00" 'Não loga a partir das 18h40
    refsaida1900="19:00:00" 'Não loga a partir das 19h10
    agora=time

    'Objeto FSO Tipo Arquivo
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Objeto Shell
    Set objShell=CreateObject("WScript.Shell")

    'Objeto para pegar o nome do computador
    strCompName = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%")

    'Objeto para ler o arquivo
    Set objFileRead1740 = objFSO.OpenTextFile("caminho_do_arquivo\07h00_17h40.txt", ForReading)
    Set objFileRead1840 = objFSO.OpenTextFile("caminho_do_arquivo\07h00_18h40.txt", ForReading)
    Set objFileRead1900 = objFSO.OpenTextFile("caminho_do_arquivo\07h00_19h00.txt", ForReading)

    i=0
    Do Until objFileRead1740.AtEndOfStream
    'Numero da Linha
    i = i + 1

    'Le linha
    strLinha = objFileRead1740.ReadLine

       If strCompName = strLinha Then
          WScript.Echo "Nome do Computador: " & strCompName & " - Nome no arquivo: " & strLinha & " - Horário: 07h00 as 17h40"
          If agora < cdate(refsaida1730) Then 

             diferenca=DateDiff("n",agora,refentrada)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -l -f"
             End If

          Else
      
             diferenca=DateDiff("n",refsaida1730,agora)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -s -f"
             End If

          End If
       End If

    Loop

    i=0
    Do Until objFileRead1840.AtEndOfStream
    'Numero da Linha
    i = i + 1

    'Le linha
    strLinha = objFileRead1840.ReadLine

       If strCompName = strLinha Then
          WScript.Echo "Nome do Computador: " & strCompName & " - Nome no arquivo: " & strLinha & " - Horário: 07h00 as 18h40"
          If agora < cdate(refsaida1830) Then 

             diferenca=DateDiff("n",agora,refentrada)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -l -f"
             End If

          Else
      
             diferenca=DateDiff("n",refsaida1830,agora)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -s -f"
             End If

          End If
       End If

    Loop

    i=0
    Do Until objFileRead1900.AtEndOfStream
    'Numero da Linha
    i = i + 1

    'Le linha
    strLinha = objFileRead1900.ReadLine

       If strCompName = strLinha Then
          WScript.Echo "Nome do Computador: " & strCompName & " - Nome no arquivo: " & strLinha & " - Horário: 07h00 as 19h10"
          If agora < cdate(refsaida1900) Then 

             diferenca=DateDiff("n",agora,refentrada)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -l -f"
             End If

          Else
      
             diferenca=DateDiff("n",refsaida1900,agora)
             Set WShShell=WScript.CreateObject("WScript.Shell")  
             If diferenca >= 10 Then
                WshShell.run "shutdown -s -f"
             End If

          End If
       End If

    Loop

    objFileRead1740.Close
    objFileRead1840.Close
    objFileRead1900.Close
    Set WShShell=Nothing

    Att. Daniel

    • Editado DaniGS sexta-feira, 3 de novembro de 2017 16:47
    • Marcado como Resposta DaniGS sexta-feira, 3 de novembro de 2017 16:48
    quarta-feira, 1 de novembro de 2017 15:15