none
Excluir TODOS membros de ADM LOCAL e inserir novos membros (Grupos ou Usuario) RRS feed

  • Pergunta

  •  

    Galera analisem o cenario...

     

    Tenho 7000 maquinas espalhadas ae pelo mundao com Windows em versoes ESPANHOL, ITALIANO, FRANCES (eu acho), INGLES e PORTUGUES... enfim...

     

    O script que vai ser distribuido por SMS 2003 (nada de GPO, minha equipe nao esta com acesso).

     

    Pois bem, atualmente as maquinas tem um monte de usuarios como ADM LOCAL alem de alguns grupos tbm.

     

     Preciso do seguinte, primeiramente, ADICIONAR 2 GRUPOS dentro dos administradores locais das maquinas

    1º ADMTEMP

    2º ADMFIXO

    Sao esses os dois grupos... os mesmos ja tem seus devidos usuarios configurados dentro dele.

     

     

    A questao é, preciso de um scrpt que verifique se é ADMINISTRADOR ou ADMINISTRATOR e posteriormente faça as devidas funcoes do script, na verdade quero evitar ERROS no script caso o sistema esteja com uma versao em portugues e outra em ingles. POIS O ERRO APARECERIA PARA O USUARIO e como usuario qq coisa ta abrindo chamado imagina como ia ficar meu fluxo de chamadas.

     

    Apos adicionar esses 2 grupos citados, apenas os grupos e usuarios abaixo devem estar listado como ADM LOCAL

     

    1º ADMTEMP (grupo)

    2º ADMFIXO (grupo)

    3º administrador ou administrator (dependendo da linguagem) (usuario)

    4º SUPORTE (usuario)

     

    Detalhes, pode haver usuarios dentro do grupo adm local que esteja APENAS NESSE GRUPO e se for um user LOCAL da maquina, consequentemente o script nao pode simplesmente DELETAR e sim MOVER esses demais usuarios para o grupo de usuarios comum. LEMBRANDO QUE MEU PARQUE TEM WINDOWS XP e 2000, intaum os objetos levados em consideracao nesse script deve atender as todas as variaveis de nomes ADM (em italiano eu sei que é ADMINISTRATOR).

     

    Bom, seria basicamente isso... tentei detalhar o maximo possivel e se alguem puder me ajudar agradeços de coração.

     

    LEMBRANDO MAIS UM DETALHE, ESSE SCRIPT SERÁ EXECUTADO DE TEMPOS EM TEMPOS, PODE SER QUE MAIS UM GRUPO OU MAIS UM USUARIO DEVA TER OS DEVIDOS ACESSOS, POR ISSO, SE ALGUEM PUDER ME INDICAR QUAIS LINHAS A MAIS ADICIONAR QUANDO SURGIR ESSA DEMANDA EU AGRADEÇO.

     

     

     

    sexta-feira, 25 de julho de 2008 08:24

Respostas

  • Falaaaa Albert,

     

     

    Falei que iria fazer tá ai, se lig estava vendo o que vc estar precisando fazer tem uma coisa que fiquei em duvida é sobre  o grupo admins. do dominio vc tb vai excluir do grupo Administradores local das maquinas? Bom esse script ele remove td inclusive o grupo admins.  do dominio, na verdade o que ele faz é verificar o nome da conta administrador local pelo SID independete se a conta estiver em  ingles ou portu ou outras linguas o SID é universal e  assim remove tds os usuarios  e grupos que tiverem no grupo administradores menos a conta administrador e no final ele add os grupos e users  que vc esta precisando , e alem disso te dar um log com eventuais erros q possam ocorrere p cada máquina,  ver ai como ficou.

     

     

    Para rodar o script especifique a maquina remota (o nome) e tb os grupos q quer add ao grupo administradores, siga os comentários do script:

     

    Code Snippet

    'Add_e_removendo_users_do_grupo_PC_local_ou_remoto
    'Por Lenardo Couto Conrado
    'Em 29.07.2008


    redim GroupsOfAdministrador(10)
    Dim GroupAdmName, NameUserAdministrador, strComputer
    Set UserSuporte = GetObject("WinNT://SF/leonardo.conrado") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO USER
    Set AdmTemp = GetObject("WinNT://SF/Admins. do dominio") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO
    Set AdmFixo = GetObject("WinNT://SF/TECNOASP_NOC") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO

    FileLog = "logfile.txt"  'NOME E CAMINHO DO LOGFILE
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Set ObjFSO = CreateObject("Scripting.FileSystemObject")
    Set ObjFileRead = ObjFSO.opentextfile(FileLog, ForReading, True)
    Set ObjFileAppending = ObjFSO.opentextfile(FileLog, ForAppending, True)

    strComputer = "wkstaspnoc002" 'INFORME AQUI O NOME DO COMPUTADOR (LOCAL OU REMOTO) NÃO O IP E NEM PONTO "." P/ LOCAL
    On Error Resume Next

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 'VC DEVE SER ADMINISTRADOR DA MAQUINA E N PODE HAVER FIREWALL NO CAMINHO
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando conecta-se via WMI ao PC remoto"
        Err.Clear
       wscript.quit
      End if   


    Set colAccounts = objWMIService.ExecQuery _
        ("Select * From Win32_UserAccount Where Domain = '" & strComputer & "'")
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando query para colecionar users do pc remoto"
        Err.Clear
       wscript.quit
      End if   

     

    For Each objAccount in colAccounts
     
     If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then 'Achou A conta administrador padrão
         Set ObjAdministrador = GetObject("WinNT://" & strComputer & "/" & objAccount.Name & "")
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo"
        Err.Clear
       wscript.quit
      End if   
      NameUserAdministrador = objAccount.Name
      
     End if 
    Next 
     i = 0 
     For each GroupOf in ObjAdministrador.groups
      i = i + 1
      GroupsOfAdministrador(i) = GroupOf.name
      'wsh.echo GroupsOfAdministrador(i)
     Next
     
     If (i >= 1) Then
     j = 1
      While (j <= i)
       Set objGroup = objWMIService.ExecQuery _
          ("Select * From Win32_Group Where Name = '" & GroupsOfAdministrador(j) & "' and Domain = '" & strComputer & "'")
        if  Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando executar query"
          Err.Clear
          'wscript.quit
        End If
       For each groupIn in objGroup
        GroupSID = groupIn.SID
        'wsh.echo GroupSID
        If GroupSID = "S-1-5-32-544" then 'SELECIONA O USUARIO ADMINISTRADOR PELO SID
         GroupAdmName = groupIn.name
         Set ObjGroupAdm = GetObject("WinNT://" & strComputer & "/" & GroupAdmName & ",group")
         if  Err.number <> 0 then
            WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo administrador"
            Err.Clear
            'wscript.quit
         End If
         For Each OtherUsers In ObjGroupAdm.Members
          NameOtherUsers = OtherUsers.name
          'wsh.echo NameOtherUsers
          AdsPathOtherUsers = OtherUsers.AdsPath
          'Wsh.echo AdsPathOtherUsers
          If (Ucase(NameOtherUsers) <> Ucase(NameUserAdministrador)) Then 'SE NÃO É A CONTA LOCAL ADMINISTRADOR ENTÃO DELETE
           'wsh.echo NameOtherUsers
           ObjGroupAdm.Remove(OtherUsers.AdsPath)
           if  Err.number <> 0 then
            WriteLog strComputer & vbTab & Err.Description & vbTab &"Tentando remover objeto(grupos e usuarios) do grupo"
            Err.Clear
            'wscript.quit
           End If
          End If       
         Next
         
        End If
       Next
       j = j + 1
      Wend
      'wsh.echo AdmTemp.class
      ObjGroupAdm.add(UserSuporte.adspath)
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if   
      ObjGroupAdm.add(AdmTemp.adspath)
      if Err.number <> 0 then
          WriteLog  strComputer & vbTab &Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
      ObjGroupAdm.add(AdmFixo.adspath)
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
     End If
     
    Function WriteLog (Text)
     ObjFileAppending.WriteLine "Erro!! " & now &"  "& Text
    End Function

     

     

    terça-feira, 29 de julho de 2008 19:31
  • Leonardo, OBRIGADO!!! Mais uma vez conseguiu me ajudar de maneira muito objetiva!!!

     

    Conforme testes, o segundo script nao funcionou, e seu primeiro script que esta atendendo as necessidades. Alterei ele conforme conversamos e o resultado ficou conforme descrito abaixo. TESTADO E FUNCIONANDO perfeitamente:

     

    'INICIO DO SCRIPT

    'Add_e_removendo_users_do_grupo_PC_local_ou_remoto
    'Por Lenardo Couto
    'Em 29.07.2008

    redim GroupsOfAdministrador(10)
    Dim GroupAdmName, NameUserAdministrador, sComputer
    Set UserSuporte = GetObject("WinNT://rivaldo.local/comum") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO USER
    Set AdmTemp = GetObject("WinNT://rivaldo.local/grupo01") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO
    Set AdmFixo = GetObject("WinNT://rivaldo.local/grupo02") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO

    FileLog = "c:\teste.txt"  'NOME E CAMINHO DO LOGFILE
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Set ObjFSO = CreateObject("Scripting.FileSystemObject")
    Set ObjFileRead = ObjFSO.opentextfile(FileLog, ForReading, True)
    Set ObjFileAppending = ObjFSO.opentextfile(FileLog, ForAppending, True)

    Set oWshNet = CreateObject("WScript.Network")
    sComputer = oWshNet.ComputerName

    On Error Resume Next

    Set objWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2") 'VC DEVE SER ADMINISTRADOR DA MAQUINA E N PODE HAVER FIREWALL NO CAMINHO
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando conecta-se via WMI ao PC remoto"
        Err.Clear
       wscript.quit
      End if  


    Set colAccounts = objWMIService.ExecQuery _
        ("Select * From Win32_UserAccount Where Domain = '" & sComputer & "'")
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando query para colecionar users do pc remoto"
        Err.Clear
       wscript.quit
      End if  

     

    For Each objAccount in colAccounts
     
     If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then 'Achou A conta administrador padrão
         Set ObjAdministrador = GetObject("WinNT://" & sComputer & "/" & objAccount.Name & "")
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo"
        Err.Clear
       wscript.quit
      End if  
      NameUserAdministrador = objAccount.Name
     
     End if
    Next
     i = 0
     For each GroupOf in ObjAdministrador.groups
      i = i + 1
      GroupsOfAdministrador(i) = GroupOf.name
      'wsh.echo GroupsOfAdministrador(i)
     Next
     
     If (i >= 1) Then
     j = 1
      While (j <= i)
       Set objGroup = objWMIService.ExecQuery _
          ("Select * From Win32_Group Where Name = '" & GroupsOfAdministrador(j) & "' and Domain = '" & sComputer & "'")
        if  Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando executar query"
          Err.Clear
          'wscript.quit
        End If
       For each groupIn in objGroup
        GroupSID = groupIn.SID
        'wsh.echo GroupSID
        If GroupSID = "S-1-5-32-544" then 'SELECIONA O USUARIO ADMINISTRADOR PELO SID
         GroupAdmName = groupIn.name
         Set ObjGroupAdm = GetObject("WinNT://" & sComputer & "/" & GroupAdmName & ",group")
         if  Err.number <> 0 then
            WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo administrador"
            Err.Clear
            'wscript.quit
         End If
         For Each OtherUsers In ObjGroupAdm.Members
          NameOtherUsers = OtherUsers.name
          'wsh.echo NameOtherUsers
          AdsPathOtherUsers = OtherUsers.AdsPath
          'Wsh.echo AdsPathOtherUsers
          If (Ucase(NameOtherUsers) <> Ucase(NameUserAdministrador)) Then 'SE NÃO É A CONTA LOCAL ADMINISTRADOR ENTÃO DELETE
           'wsh.echo NameOtherUsers
           ObjGroupAdm.Remove(OtherUsers.AdsPath)
           if  Err.number <> 0 then
            WriteLog sComputer & vbTab & Err.Description & vbTab &"Tentando remover objeto(grupos e usuarios) do grupo"
            Err.Clear
            'wscript.quit
           End If
          End If      
         Next
        
        End If
       Next
       j = j + 1
      Wend
      'wsh.echo AdmTemp.class
      ObjGroupAdm.add(UserSuporte.adspath)
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
      ObjGroupAdm.add(AdmTemp.adspath)
      if Err.number <> 0 then
          WriteLog  sComputer & vbTab &Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if 
      ObjGroupAdm.add(AdmFixo.adspath)
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if 
     End If
     
    Function WriteLog (Text)
     ObjFileAppending.WriteLine "Erro!! " & now &"  "& Text
    End Function

    'FIM DO SCRIPT

     

    Esse script nao é necessario editar e incluir o nome do PC que vai executar pois uma variavel "pega" o nome NETBIOS da maquina.

     

    Vlw.

    quarta-feira, 30 de julho de 2008 01:33

Todas as Respostas

  •  

    Po galera ninguem tem uma dica por onde começar pelo menos?!
    segunda-feira, 28 de julho de 2008 17:36
  • Falaaaa Albert,

     

     

    Falei que iria fazer tá ai, se lig estava vendo o que vc estar precisando fazer tem uma coisa que fiquei em duvida é sobre  o grupo admins. do dominio vc tb vai excluir do grupo Administradores local das maquinas? Bom esse script ele remove td inclusive o grupo admins.  do dominio, na verdade o que ele faz é verificar o nome da conta administrador local pelo SID independete se a conta estiver em  ingles ou portu ou outras linguas o SID é universal e  assim remove tds os usuarios  e grupos que tiverem no grupo administradores menos a conta administrador e no final ele add os grupos e users  que vc esta precisando , e alem disso te dar um log com eventuais erros q possam ocorrere p cada máquina,  ver ai como ficou.

     

     

    Para rodar o script especifique a maquina remota (o nome) e tb os grupos q quer add ao grupo administradores, siga os comentários do script:

     

    Code Snippet

    'Add_e_removendo_users_do_grupo_PC_local_ou_remoto
    'Por Lenardo Couto Conrado
    'Em 29.07.2008


    redim GroupsOfAdministrador(10)
    Dim GroupAdmName, NameUserAdministrador, strComputer
    Set UserSuporte = GetObject("WinNT://SF/leonardo.conrado") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO USER
    Set AdmTemp = GetObject("WinNT://SF/Admins. do dominio") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO
    Set AdmFixo = GetObject("WinNT://SF/TECNOASP_NOC") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO

    FileLog = "logfile.txt"  'NOME E CAMINHO DO LOGFILE
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Set ObjFSO = CreateObject("Scripting.FileSystemObject")
    Set ObjFileRead = ObjFSO.opentextfile(FileLog, ForReading, True)
    Set ObjFileAppending = ObjFSO.opentextfile(FileLog, ForAppending, True)

    strComputer = "wkstaspnoc002" 'INFORME AQUI O NOME DO COMPUTADOR (LOCAL OU REMOTO) NÃO O IP E NEM PONTO "." P/ LOCAL
    On Error Resume Next

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 'VC DEVE SER ADMINISTRADOR DA MAQUINA E N PODE HAVER FIREWALL NO CAMINHO
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando conecta-se via WMI ao PC remoto"
        Err.Clear
       wscript.quit
      End if   


    Set colAccounts = objWMIService.ExecQuery _
        ("Select * From Win32_UserAccount Where Domain = '" & strComputer & "'")
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando query para colecionar users do pc remoto"
        Err.Clear
       wscript.quit
      End if   

     

    For Each objAccount in colAccounts
     
     If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then 'Achou A conta administrador padrão
         Set ObjAdministrador = GetObject("WinNT://" & strComputer & "/" & objAccount.Name & "")
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo"
        Err.Clear
       wscript.quit
      End if   
      NameUserAdministrador = objAccount.Name
      
     End if 
    Next 
     i = 0 
     For each GroupOf in ObjAdministrador.groups
      i = i + 1
      GroupsOfAdministrador(i) = GroupOf.name
      'wsh.echo GroupsOfAdministrador(i)
     Next
     
     If (i >= 1) Then
     j = 1
      While (j <= i)
       Set objGroup = objWMIService.ExecQuery _
          ("Select * From Win32_Group Where Name = '" & GroupsOfAdministrador(j) & "' and Domain = '" & strComputer & "'")
        if  Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando executar query"
          Err.Clear
          'wscript.quit
        End If
       For each groupIn in objGroup
        GroupSID = groupIn.SID
        'wsh.echo GroupSID
        If GroupSID = "S-1-5-32-544" then 'SELECIONA O USUARIO ADMINISTRADOR PELO SID
         GroupAdmName = groupIn.name
         Set ObjGroupAdm = GetObject("WinNT://" & strComputer & "/" & GroupAdmName & ",group")
         if  Err.number <> 0 then
            WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo administrador"
            Err.Clear
            'wscript.quit
         End If
         For Each OtherUsers In ObjGroupAdm.Members
          NameOtherUsers = OtherUsers.name
          'wsh.echo NameOtherUsers
          AdsPathOtherUsers = OtherUsers.AdsPath
          'Wsh.echo AdsPathOtherUsers
          If (Ucase(NameOtherUsers) <> Ucase(NameUserAdministrador)) Then 'SE NÃO É A CONTA LOCAL ADMINISTRADOR ENTÃO DELETE
           'wsh.echo NameOtherUsers
           ObjGroupAdm.Remove(OtherUsers.AdsPath)
           if  Err.number <> 0 then
            WriteLog strComputer & vbTab & Err.Description & vbTab &"Tentando remover objeto(grupos e usuarios) do grupo"
            Err.Clear
            'wscript.quit
           End If
          End If       
         Next
         
        End If
       Next
       j = j + 1
      Wend
      'wsh.echo AdmTemp.class
      ObjGroupAdm.add(UserSuporte.adspath)
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if   
      ObjGroupAdm.add(AdmTemp.adspath)
      if Err.number <> 0 then
          WriteLog  strComputer & vbTab &Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
      ObjGroupAdm.add(AdmFixo.adspath)
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
     End If
     
    Function WriteLog (Text)
     ObjFileAppending.WriteLine "Erro!! " & now &"  "& Text
    End Function

     

     

    terça-feira, 29 de julho de 2008 19:31
  • Ja esse aqui coleta de uma OU ou do dominio inteiro, não testei pq estou sem Lab na verdade só o que é preciso testar é a hr que ele pega o nome do computador nessa linha strComputer = objRecordSet.Fields("Name").Value ele deve pegar somente o nome e não o dominio e nome exemplo : "SF\WKSTASPNOC001"  se ele pegar assim não vai funcionar ai tem que usar outra propriedade.

     

     

    Code Snippet

    'Add_e_removendo_users_do_grupo_PC_local_ou_remoto
    'Por Lenardo Couto
    'Em 29.07.2008
    On Error Resume Next

    Const ADS_SCOPE_SUBTREE = 2
    Dim StrUserName

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"

    Set objCOmmand.ActiveConnection = objConnection
    objCommand.CommandText = _
        "Select Name, distinguishedName from 'LDAP://OU=Computadores,OU=Bahia,DC=leoelo,DC=br' " _' Informe aqui a OU do Computadores e o seu dominio
            & "Where objectClass='computer'" 
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    Do Until objRecordSet.EOF
        
     ObjDN = objRecordSet.Fields("distinguishedName").Value
     strComputer = objRecordSet.Fields("Name").Value

    redim GroupsOfAdministrador(10)
    Dim GroupAdmName, NameUserAdministrador, strComputer
    Set UserSuporte = GetObject("WinNT://SF/leonardo.conrado") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO USER
    Set AdmTemp = GetObject("WinNT://SF/Admins. do dominio") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO
    Set AdmFixo = GetObject("WinNT://SF/TECNOASP_NOC") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO

    FileLog = "logfile.txt"  'NOME E CAMINHO DO LOGFILE
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Set ObjFSO = CreateObject("Scripting.FileSystemObject")
    Set ObjFileRead = ObjFSO.opentextfile(FileLog, ForReading, True)
    Set ObjFileAppending = ObjFSO.opentextfile(FileLog, ForAppending, True)

     


    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 'VC DEVE SER ADMINISTRADOR DA MAQUINA E N PODE HAVER FIREWALL NO CAMINHO
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando conecta-se via WMI ao PC remoto"
        Err.Clear
       wscript.quit
      End if   


    Set colAccounts = objWMIService.ExecQuery _
        ("Select * From Win32_UserAccount Where Domain = '" & strComputer & "'")
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando query para colecionar users do pc remoto"
        Err.Clear
       wscript.quit
      End if   

     

    For Each objAccount in colAccounts
     
     If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then 'Achou A conta administrador padrão
         Set ObjAdministrador = GetObject("WinNT://" & strComputer & "/" & objAccount.Name & "")
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo"
        Err.Clear
       wscript.quit
      End if   
      NameUserAdministrador = objAccount.Name
      
     End if 
    Next 
     i = 0 
     For each GroupOf in ObjAdministrador.groups
      i = i + 1
      GroupsOfAdministrador(i) = GroupOf.name
      'wsh.echo GroupsOfAdministrador(i)
     Next
     
     If (i >= 1) Then
     j = 1
      While (j <= i)
       Set objGroup = objWMIService.ExecQuery _
          ("Select * From Win32_Group Where Name = '" & GroupsOfAdministrador(j) & "' and Domain = '" & strComputer & "'")
        if  Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando executar query"
          Err.Clear
          'wscript.quit
        End If
       For each groupIn in objGroup
        GroupSID = groupIn.SID
        'wsh.echo GroupSID
        If GroupSID = "S-1-5-32-544" then 'SELECIONA O USUARIO ADMINISTRADOR PELO SID
         GroupAdmName = groupIn.name
         Set ObjGroupAdm = GetObject("WinNT://" & strComputer & "/" & GroupAdmName & ",group")
         if  Err.number <> 0 then
            WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo administrador"
            Err.Clear
            'wscript.quit
         End If
         For Each OtherUsers In ObjGroupAdm.Members
          NameOtherUsers = OtherUsers.name
          'wsh.echo NameOtherUsers
          AdsPathOtherUsers = OtherUsers.AdsPath
          'Wsh.echo AdsPathOtherUsers
          If (Ucase(NameOtherUsers) <> Ucase(NameUserAdministrador)) Then 'SE NÃO É A CONTA LOCAL ADMINISTRADOR ENTÃO DELETE
           'wsh.echo NameOtherUsers
           ObjGroupAdm.Remove(OtherUsers.AdsPath)
           if  Err.number <> 0 then
            WriteLog strComputer & vbTab & Err.Description & vbTab &"Tentando remover objeto(grupos e usuarios) do grupo"
            Err.Clear
            'wscript.quit
           End If
          End If       
         Next
         
        End If
       Next
       j = j + 1
      Wend
      'wsh.echo AdmTemp.class
      ObjGroupAdm.add(UserSuporte.adspath)
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if   
      ObjGroupAdm.add(AdmTemp.adspath)
      if Err.number <> 0 then
          WriteLog  strComputer & vbTab &Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
      ObjGroupAdm.add(AdmFixo.adspath)
      if Err.number <> 0 then
          WriteLog strComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
     End If
     
    Function WriteLog (Text)
     ObjFileAppending.WriteLine "Erro!! " & now &"  "& Text
    End Function

     

     

    terça-feira, 29 de julho de 2008 19:39
  • Leonardo, OBRIGADO!!! Mais uma vez conseguiu me ajudar de maneira muito objetiva!!!

     

    Conforme testes, o segundo script nao funcionou, e seu primeiro script que esta atendendo as necessidades. Alterei ele conforme conversamos e o resultado ficou conforme descrito abaixo. TESTADO E FUNCIONANDO perfeitamente:

     

    'INICIO DO SCRIPT

    'Add_e_removendo_users_do_grupo_PC_local_ou_remoto
    'Por Lenardo Couto
    'Em 29.07.2008

    redim GroupsOfAdministrador(10)
    Dim GroupAdmName, NameUserAdministrador, sComputer
    Set UserSuporte = GetObject("WinNT://rivaldo.local/comum") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO USER
    Set AdmTemp = GetObject("WinNT://rivaldo.local/grupo01") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO
    Set AdmFixo = GetObject("WinNT://rivaldo.local/grupo02") 'INFORME AQUI NETBIOS DO DOMINIO E NOME DO GRUPO

    FileLog = "c:\teste.txt"  'NOME E CAMINHO DO LOGFILE
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Set ObjFSO = CreateObject("Scripting.FileSystemObject")
    Set ObjFileRead = ObjFSO.opentextfile(FileLog, ForReading, True)
    Set ObjFileAppending = ObjFSO.opentextfile(FileLog, ForAppending, True)

    Set oWshNet = CreateObject("WScript.Network")
    sComputer = oWshNet.ComputerName

    On Error Resume Next

    Set objWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2") 'VC DEVE SER ADMINISTRADOR DA MAQUINA E N PODE HAVER FIREWALL NO CAMINHO
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando conecta-se via WMI ao PC remoto"
        Err.Clear
       wscript.quit
      End if  


    Set colAccounts = objWMIService.ExecQuery _
        ("Select * From Win32_UserAccount Where Domain = '" & sComputer & "'")
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando query para colecionar users do pc remoto"
        Err.Clear
       wscript.quit
      End if  

     

    For Each objAccount in colAccounts
     
     If Left (objAccount.SID, 6) = "S-1-5-" and Right(objAccount.SID, 4) = "-500" Then 'Achou A conta administrador padrão
         Set ObjAdministrador = GetObject("WinNT://" & sComputer & "/" & objAccount.Name & "")
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo"
        Err.Clear
       wscript.quit
      End if  
      NameUserAdministrador = objAccount.Name
     
     End if
    Next
     i = 0
     For each GroupOf in ObjAdministrador.groups
      i = i + 1
      GroupsOfAdministrador(i) = GroupOf.name
      'wsh.echo GroupsOfAdministrador(i)
     Next
     
     If (i >= 1) Then
     j = 1
      While (j <= i)
       Set objGroup = objWMIService.ExecQuery _
          ("Select * From Win32_Group Where Name = '" & GroupsOfAdministrador(j) & "' and Domain = '" & sComputer & "'")
        if  Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando executar query"
          Err.Clear
          'wscript.quit
        End If
       For each groupIn in objGroup
        GroupSID = groupIn.SID
        'wsh.echo GroupSID
        If GroupSID = "S-1-5-32-544" then 'SELECIONA O USUARIO ADMINISTRADOR PELO SID
         GroupAdmName = groupIn.name
         Set ObjGroupAdm = GetObject("WinNT://" & sComputer & "/" & GroupAdmName & ",group")
         if  Err.number <> 0 then
            WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando instanciar objeto do grupo administrador"
            Err.Clear
            'wscript.quit
         End If
         For Each OtherUsers In ObjGroupAdm.Members
          NameOtherUsers = OtherUsers.name
          'wsh.echo NameOtherUsers
          AdsPathOtherUsers = OtherUsers.AdsPath
          'Wsh.echo AdsPathOtherUsers
          If (Ucase(NameOtherUsers) <> Ucase(NameUserAdministrador)) Then 'SE NÃO É A CONTA LOCAL ADMINISTRADOR ENTÃO DELETE
           'wsh.echo NameOtherUsers
           ObjGroupAdm.Remove(OtherUsers.AdsPath)
           if  Err.number <> 0 then
            WriteLog sComputer & vbTab & Err.Description & vbTab &"Tentando remover objeto(grupos e usuarios) do grupo"
            Err.Clear
            'wscript.quit
           End If
          End If      
         Next
        
        End If
       Next
       j = j + 1
      Wend
      'wsh.echo AdmTemp.class
      ObjGroupAdm.add(UserSuporte.adspath)
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if  
      ObjGroupAdm.add(AdmTemp.adspath)
      if Err.number <> 0 then
          WriteLog  sComputer & vbTab &Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if 
      ObjGroupAdm.add(AdmFixo.adspath)
      if Err.number <> 0 then
          WriteLog sComputer & vbTab & Err.Description & vbTab & "Tentando adcionar objeto ao grupo"
        Err.Clear
      End if 
     End If
     
    Function WriteLog (Text)
     ObjFileAppending.WriteLine "Erro!! " & now &"  "& Text
    End Function

    'FIM DO SCRIPT

     

    Esse script nao é necessario editar e incluir o nome do PC que vai executar pois uma variavel "pega" o nome NETBIOS da maquina.

     

    Vlw.

    quarta-feira, 30 de julho de 2008 01:33