Ei, Equipe de Scripts!Gerenciando ingenuamente usuários e grupos locais

A Equipe de Scripts da Microsoft

Faça download do código deste artigo: HeyScriptingGuy2007_04.exe (151KB)

Como posso gerenciar descritores de segurança em arquivos e pastas?

Acredite ou não, houve um tempo – há muito tempo é claro – que a Equipe de Scripts realmente não era tão inteligente. Nós sabemos que é difícil de acreditar, mas – o que você quer dizer com não é tão difícil de acreditar? E o que você quer dizer com não foi há muito tempo? Por quê? Nós lhe diremos – ah, OK. Obviamente você viu um dos autores da Equipe de Scripts tentando conectar uma TV nova um dia desses.

Em sua defesa, no entanto, esse específico membro da Equipe de Scripts argumentaria que conectar uma TV nova não é algo importante para a ciência espacial; na verdade, é uma ciência mais complicada. Basta ver que conectar a própria TV envolve três cabos de vídeo e um par de cabos de áudio; no topo disso você terá então que conectar um videocassete, um DVD e um Xbox®, para não mencionar as indicações de conjuntos aleatórios de números em remoto “universal” para tentar e conseguir reconhecer todos esses dispositivos. Comparado a isso, colocar um satélite em órbita em torno do planeta Marte é muito fácil!

Notavelmente, a Equipe de Scripts na verdade tenta obter todas essas conexões da forma correta. No entanto, quando ele ligou tudo, nada aconteceu. Obedientemente, ele verificou duas, três vezes cada conexão. Ele havia lido todos os manuais de usuário e até mesmo verificado o manual online para ver se poderia ter alguma informação faltando. Nada. Ele estava quase sacrificando um MP3 player quando percebeu que não havia concluído a etapa principal: conectar o cabo na tomada da parede.

Observação: você pode estar pensando se é tão difícil conectar todas as coisas da Família de Scripts, talvez a Família de Scripts é que tenha muitas coisas. Na verdade, esse membro da Equipe de Scripts concordaria com isso. No entanto, a qualquer momento que a família decidir adquirir mais itens, esse membro da Equipe de Scripts perderá de 2 a 0. Não, deveria ser de 2 a 1, mas é 2-0. Por algum motivo, o Pai do membro da Equipe de Scripts nunca parece participar das escolhas da família, e não tem nenhuma função nesse caso.

Na resposta à sua próxima dúvida, sim, ele tentou. Mas as Nações Unidas recusaram enviar monitores de eleição para a causa da Equipe de Scripts.

É claro, agora que pensamos sobre isso, não era muita coisa, afinal de contas a Equipe de Scripts (bem, o membro da nova TV em específico) não era burra nem ingênua. Por exemplo, quando eles estavam planejando o Guia de Scripts da Microsoft® Windows® 2000, eles pediram ajuda de vários... especialistas... no momento de concluir os capítulos dos livros. Um dos capítulos que não foi aprovado foi o capítulo sobre gerenciamento de usuários e grupos locais. “Gerenciar usuários e grupos locais?!?”, disseram os especialistas. “Por que isso está sendo considerado? Quem se importa com o gerenciamento de usuários e grupos locais?”.

Bem, para grande parte da nossa decepção descobrimos que todos (com a possível exceção de nossos “especialistas” internos) se preocupam com usuários e grupos locais. Cada semana recebemos toneladas de emails de pessoas perguntando como fazer coisas como adicionar um usuário a um grupo local, excluir um usuário de um grupo local ou alterar a senha do Administrador local em um computador.

Está certo, o Repositório de Scripts da Central de Scripts apresenta alguns scripts de exemplo que mostram como executar essas tarefas, mas a maioria desses scripts funciona em computador uma só vez. Isso não é o suficiente: as pessoas querem saber como fazer isso em várias máquinas, e tudo ao mesmo tempo. Alterar a senha do administrador local em um computador em más condições? Mantenham contato com o mundo real, Equipe de Scripts – queremos fazer isso em todos os nossos computadores ou em todos os computadores em uma unidade organizacional ou em todos os nossos servidores de email ou – bem, você entendeu!.

Considerando o fato de que o Guia de Scripts ter sido publicado em 2003, isso significa que gastamos praticamente quatro anos sendo incomodados com as mesmas mensagens de email. “Aqui está outro leitor perguntando como ele pode ler os nomes do computador a partir de uma planilha do Excel® e alterar a senha do administrador local em cada um desses computadores”, um dos membros da Equipe de Scripts recentemente lembrou. “O que podemos fazer em relação a isso?”

Bem, levamos quatro anos, mas finalmente descobrimos! A Figura 1 mostra exatamente o que podemos fazer em relação a isso.

Figure 1 Finalmente eu descobri!

On Error Resume Next

Set objExcel = CreateObject(“Excel.Application”)
Set objWorkbook = objExcel.Workbooks.Open(“C:\Scripts\Test.xls”)
objExcel.Visible = True

i = 2

Do Until objExcel.Cells(i, 1).Value = “”
    strComputer = objExcel.Cells(i, 1).Value   
    Set objUser = GetObject(“WinNT://” & strComputer & “/Administrator”)
    If Err = 0 Then
         objUser.SetPassword “egTY634!alK2”
         objExcel.Cells(i, 2).Value = Now
    End If
    Err.Clear
    i = i + 1
Loop

Observação: Como você pode ver, não levamos quatro anos para escrever esse script por ele ser muito difícil; levamos quatro anos para escrevê-lo pelo fato de sempre demorarmos para fazer quase tudo. É por isso que você nunca quer perder as festas anuais de final de ano da Equipe de Scripts; afinal de contas, você nunca sabe quando, ou se, no ano seguinte terá festa.

O que temos aqui é um script que apresenta os nomes de computadores a partir de uma planilha e, em seguida, altera a senha do administrador local em cada um desses computadores. Para realizar essa mágica, iniciamos com facilidade, supondo que você tenha uma planilha muito simples, uma que se pareça com a Figura 2. (Caso contrário, crie uma agora mesmo.)

Figura 2 Lista obrigatória de computadores

Figura 2** Lista obrigatória de computadores **(Clique na imagem para aumentar a exibição)

Como você pode ver, não há nada de especial aqui. Na coluna 1 (coluna A), listamos os nomes de todos os computadores que têm as senhas que precisamos alterar. Na coluna 2 (coluna B), simplesmente controlamos a data e a hora que a senha do administrador em cada computador foi alterada. Isso facilita para você manter as guias ativadas independentemente de as senhas do administrador estarem todas sincronizadas.

Em relação ao script por si só, resolvemos tudo rapidamente com a instrução On Error Resume Next. Geralmente, não nos importamos de incluir tratamento de erros em nossos scripts. Não por sermos contrários ao tratamento de erros; em vez disso, é pelo fato de tentarmos manter os nossos scripts breves e fáceis de acompanhar. No entanto, nesse caso, a instrução On Error Resume Next é fundamental. Afinal de contas, o nosso script está tentando se conectar a pontos em computadores diferentes. O que acontece se um desses computadores estiver desligado? Bem, com o tratamento de erros, não acontecerá nada. É claro, ocorrerá um erro, mas o script poderá ignorá-lo e continuar. Sem o tratamento de erros aconteceria a mesma coisa que aconteceu com o membro da Equipe de Scripts quando ele ligou a nova TV pela primeira vez: nada.

Em seguida, utilizaremos o bloco a seguir de código para criar uma instância do objeto Excel.Application, fazer com que essa instância do Excel esteja visível na tela e abrir a planilha C:\Scripts\Test.xls:

Set objExcel = CreateObject _
    (“Excel.Application”)
Set objWorkbook = objExcel.Workbooks.Open _
    (“C:\Scripts\Test.xls”)
objExcel.Visible = True

E, por último, mas não certamente menos importante, atribuiremos o valor 2 a uma variável do contador nomeada i. Utilizaremos essa variável para controlar a nossa atual linha na planilha.

Observação: então, por que i recebe o valor 2? É fácil: se você analisar na planilha detalhadamente você verá que os nossos dados na verdade começam na linha 2. A linha 1 é apenas a linha do cabeçalho.

Viu? Podemos não ser tão bons em conectar cabos YPbPr1, mas sabemos alguma coisa sobre scripts.

Bem, às vezes...

Agora estamos prontos para o trabalho. Primeiramente, configuramos um loop Do Until que executará até encontrar uma célula vazia na coluna 1. E sim, isso significa que não importa o que mais você faça, você não pode deixar nenhuma linha em branco na coluna 1. Se o seu script encontrar uma linha em branco, ele assumirá que foi atingido o final dos dados, de forma que o loop (e o script) será encerrado. E apesar de haver formas de solucionar isso, é muito mais fácil apenas evitar ter linhas em branco em qualquer parte da planilha.

Dentro do loop, começamos atribuindo o valor encontrado na linha da célula i, coluna 1 para uma variável nomeada strComputer. (Lembre-se, a primeira vez no loop i é igual a 2; portanto, estaremos trabalhando com o valor na linha 2 da célula, coluna 1.) Utilizamos então essa linha de código para criar uma referência de objeto (objUser) para a conta do administrador no computador representado pela variável strComputer:

Set objUser = GetObject(“WinNT://” & _
    strComputer & “/Administrator”)

Se algo for errado com esse script, você verá isso nesse momento. Por exemplo, suponha que estejamos tendo problemas de rede, suponha que o computador tenha sido desligado ou que um dos membros da Equipe de Scripts tenha conectado o DVD de forma errada e tenha ocorrido um blecaute em toda a região ocidental dos Estados Unidos. Se qualquer uma dessas coisas acontecer, não poderemos efetuar uma conexão ao computador. É por isso que verificamos imediatamente o valor do objeto VBScript Err:

If Err = 0 Then

Se o objeto Err for igual a 0, isso significa que tivemos problema para conectar o computador (e com a conta do administrador) sem qualquer problema. Se Err for igual a qualquer coisa além de 0, isso pode significar somente uma coisa: a nossa tentativa de conexão falhou. Nesse caso, nem tentaremos alterar a senha nesse computador; nem é necessário dizer, se não podemos fazer uma conexão, não poderemos alterar a senha.

Supondo que tudo ocorra bem e que não ocorram erros, executaremos as seguintes duas linhas de código:

objUser.SetPassword “egTY634!alK2”
objExcel.Cells(i, 2).Value = Now

Na linha 1, usamos o método SetPassword para atribuir uma nova senha (egTY634!alK2) à conta do administrador local. (E sim, sabemos: você não deve usar o nome do seu filho como uma senha.) Na linha 2, gravamos a data e a hora atual (usando a função VBScript Now) na linha da célula i, coluna 2. Observe que atualizamos a coluna Senha Alterada somente se você pudesse na verdade se conectar ao computador remoto e alterar a senha. Se não conseguirmos nos conectar a computador, então seu campo correspondente Senha Alterada nunca será atualizado; é dessa forma que podemos fizer quais operações tiveram êxito e quais não tiveram.

O que tudo isso significa? Isso significa que, na primeira vez que passar pelo loop, a nossa planilha se parecerá com a Figura 3.

Figura 3 Lista de computadores depois de redefinir a primeira senha

Figura 3** Lista de computadores depois de redefinir a primeira senha **(Clique na imagem para aumentar a exibição)

Muita coisa para o computador 1. Agora precisamos apenas de uma limpeza antes de continuar:

Err.Clear
i = i + 1

Curtas como devem ser, essas linhas de código são muito importantes. (Como se a Equipe de Scripts fosse escrever qualquer linha de código que não fosse tão importante!). A primeira linha redefine o objeto Err como 0. Se não ocorrer erro, isso é redundante; afinal de contas, nesse caso o Err já será 0. Se um erro ocorrer, no entanto, o Err será igual a um valor diferente de 0. Nesse caso, é fundamental que o objeto Err seja redefinido manualmente. Por quê? Como esse é o objeto Error: ele somente controla os erros, ele não controla os êxitos. Por exemplo, suponha que tenha ocorrido um problema com o computador 1 e não possamos efetuar uma conexão. Visando o argumento, digamos que isso fez com que o objeto Error fosse definido como 99.

Agora, vamos supor que façamos um loop e consigamos nos conectar com êxito ao computador 2. Qual você acha que vai ser o valor de Err agora? É isso mesmo: você goste ou não, o Err ainda será definido como 99. Isso é devido ao fato de o valor do objeto Err ser alterado somente quando ocorre um erro; se não ocorrer erro, no entanto, o objeto Err manterá o seu atual valor sempre.

Isso realmente é importante para nós? Bem, deveria ser. Afinal de contas, tecnicamente não alteramos a senha em um computador se conseguirmos efetuar com êxito uma conexão; em vez disso alteramos a senha somente se Err for igual a 0. E – espere aí enquanto pegamos a calculadora – sim, você estava certo: 99 não é igual a 0 (exceto, é claro, nas eleições da Família da Equipe de Scripts, quando os 99 votos do Pai da Equipe de Scripts chegam a 0). E o que nos importa, mesmo que tenhamos feito a conexão para o computador 2, é que Err não seja igual a 0. E como Err não é igual a 0, nem mesmo tentamos alterar a senha do administrador local.

Em outras palavras, se o valor de Err sempre for alterado, você precisará redefinir esse valor para 0; caso contrário, o seu script acreditará que ocorreu um erro. E como você redefiniria o objeto Err de volta para 0? Você entendeu: basta chamar Err.Clear.

Em seguida, incrementamos o valor de i em 1. Por quê? Bem, na primeira vez em que foi executado o loop, a variável i igual a 2; isso pelo fato de desejarmos conectar ao computador listado na linha 2, coluna 1. Na segunda vez em que o loop foi executado, o objetivo era conectar ao computador listado na linha 3, coluna 1. Vendo como i é a variável que indica a linha que você quer trabalhar, precisamos fazer com que i seja igual a 3. E, como todos sabem, 2 + 1 = 3. (Ainda bem que ainda temos a calculadora, não é mesmo?) Somente então executaremos o loop e repetiremos o processo com o próximo computador na planilha.

Agora, muito bem, mas – veja como não somos mais tão ingênuos – estamos bem alertas de que esse script, por si só, raramente afetará o email que receberemos. “O lance do Excel foi interessante”, as pessoas dizem, “mas ainda preciso alterar a senha do administrador local em todos os computadores em uma unidade organizacional ou em todos os computadores listados em um arquivo de texto. Ou talvez eu queira obter um pop-up de uma lista de computadores e selecionar um de uma caixa de listagem. Ou talvez o que eu realmente gostaria de fazer fosse ...”

Relaxe. O seu desejo é o comando para a Equipe de Scripts. (Supondo que você queira esperar quatro anos para que o seu desejo se torne realidade.) No fim das contas, temos pontos de modelos de vários computadores publicados na Central de Scripts, modelos que tornam extremamente fácil a execução de um script em várias máquinas. Por exemplo, suponha que você queira alterar a senha do administrador local em todos os computadores em uma unidade organizacional. Ei, sem problemas. O modelo para execução de um script em todos os computadores em uma unidade organizacional seria semelhante à Figura 4.

Figure 4 Executando um script em uma unidade organizacional

On Error Resume Next

Set objOU = GetObject(“LDAP://OU=Finance,dc=fabrikam,dc=com”)
objOU.Filter = Array(“Computer”)

For Each objComputer in objOU
    strComputer = objComputer.CN

    ‘ 
=====================================================================
    ‘ Insert your code here
    ‘ 
=====================================================================

    Set objComputer = GetObject(“WinNT://” & strComputer & “”)
    objComputer.Filter = Array(“User”)
    For Each objUser in objComputer
        Wscript.Echo objUser.Name
    Next

    ‘ 
=====================================================================
    ‘ End
    ‘ 
=====================================================================

Next

Consulte a seção no modelo rotulada “Inserir seu código aqui?”. Tudo o que você precisa fazer é excluir o código de amostra localizado nessa seção e substituí-lo com o código (o qual você pode copiar desta coluna) para alterar a senha do administrador local. Em outras palavras, substitua o código de exemplo pelo código a seguir:

Set objUser = GetObject(“WinNT://” & _
    strComputer & “/Administrator”)
If Err = 0 Then
    objUser.SetPassword “egTY634!alK2”
End If
Err.Clear

Esse exemplo específico não registraria em log os resultados para você, mas você pode facilmente adicionar o código sozinho. Substitua o código de exemplo, altere a cadeia de caracteres da conexão LDAP://OU=Finance,dc=fabrikam,dc=com para que aponte para uma das suas unidades organizacionais e você estará pronto.

Para falar a verdade, publicamos esses modelos há um ano, imaginando que seria um dos itens mais populares da Central de Scripts. O que houve de errado: eles quase nunca foram usados, apesar de as pessoas nos escreverem quase todo dia perguntando como executar scripts em várias máquinas. Estamos supondo que ninguém sabia da existência desses modelos. Mas agora você sabe. Ou pelo menos você saberá se lhe dissermos onde encontrá-los: microsoft.com/technet/scriptcenter/scripts/templates. Hum, talvez seja por isso que nunca ninguém usou esses modelos...

Agora que a Equipe de Scripts não é mais tão ingênua quanto antes, isso também significa que eles não são mais tão burros e bobos como eram? Digamos assim: há não muito tempo um dos membros da Equipe de Scripts decidiu passar o final de semana consertando algumas coisas em casa. Quando ele voltou ao trabalho na segunda-feira, seu polegar estava tão machucado que não poderia estancar um sangramento e um grande arranhão na sua perna.

O que me faz pensar que realmente não foi tão mau assim! Pelo menos para um membro da Equipe de Scripts.

A Equipe de Scripts da Microsoft trabalha para – bem, estão empregados por ela – a Microsoft. Quando não está jogando/treinando/assistindo beisebol (e diversas outras atividades), ela administra o TechNet Script Center. Confirme isso em www.scriptingguys.com (em inglês).

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..