Ei, Equipe de Scripts!Respondendo a suas perguntas sobre UOs... por apenas 5 centavos

A Equipe de Scripts da Microsoft

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

P: Como posso exibir uma caixa de diálogo que permite selecionar um UO do Active Directory?

VOCÊ SABE, se nós da Equipe de Scripts ganhássemos um centavo toda vez que respondêssemos essa pergunta, teríamos, na verdade, apenas US$ 37,15, não é? É verdade, mas se ganhássemos um centavo por cada pessoa que quisesse fazer essa pergunta, mas que nunca chegou a perguntar, teríamos... bem, o valor não importa. Além do mais, não nos tornamos membros da Equipe de Scripts por dinheiro. Fazemos parte da Equipe de Scripts pela satisfação de ajudar as pessoas a realizar suas tarefas de administração do sistema de forma mais rápida e fácil.

Observação. Na verdade, tecnicamente nos tornamos membros da Equipe de Scripts por dinheiro. Mas nossos gerentes dizem: “Falando francamente, é possível que vocês ganhem muito dinheiro, mas apenas se estiverem dispostos a trabalhar muito e gerar resultados de alta qualidade.” Foi aí que decidimos que dinheiro não era tudo na vida.

Não importa. A questão é: muitas pessoas gostariam de saber como exibir uma caixa de diálogo que permitisse selecionar um UO e, desse modo, conectar-se a esse UO usando um script. “Vocês mostraram como exibir uma caixa de diálogo que permite escolher pastas”, diz um email recente, “e também mostraram como exibir uma caixa de diálogo que permite escolher arquivos. Por que vocês nunca mostraram como exibir uma caixa de diálogo que permite selecionar um OU do Active Directory®?"

Bem, para começar, nós realmente mostramos como exibir uma caixa de diálogo que permite selecionar uma pasta e você pode encontrar um exemplo disso aqui. Também mostramos a todos como exibir uma caixa de diálogo que permite selecionar arquivos; confira em microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx se não acreditar em nós. Esses artigos foram bem recebidos e sabemos que as pessoas estão empregando essas técnicas nos scripts. Então por que nunca mostramos às pessoas como exibir uma caixa de diálogo que permite selecionar OUs do Active Directory? É algum tipo de conspiração da Microsoft ou algo parecido?

Claro que não. (Opa... espera um minuto... é exatamente o que alguém envolvido em uma conspiração diria, não é?) A verdade é que existe um bom motivo para não termos mostrado como exibir uma caixa de diálogo que permite selecionar UOs do Active Directory: essa caixa de diálogo simplesmente não existe. Como dizem no beisebol, você não pode rebater no que não pode ver. E como dizemos na área de scripts, você não pode exibir o que não existe.

Isso é tudo para a coluna desse mês. Vejo vocês no mês que vem.

Não é bem assim. Segundo os editores da TechNet Magazine, isso não é tudo para esse mês. “E se uma caixa de diálogo como essa não existe?”, eles dizem. “Meu Deus, vocês fazem parte da Equipe de Scripts. Vocês não podem criar uma caixa de diálogo para resolver esse problema? Achamos que vocês podem fazer tudo que diz respeito aos scripts”.

Nem preciso dizer que os editores da TechNet Magazine estão profundamente enganados. Fazer tudo relacionado aos scripts? Não exatamente. Na verdade, nós da Equipe de Scripts sabemos como fazer apenas uma coisa relacionada aos scripts.

Felizmente, sabemos criar uma caixa de diálogo que permite selecionar um UO do Active Directory. Observe a Figura 1.

É um tipo de script longo, não é? Mas você conhece o nosso lema: você não pode fazer um omelete sem quebrar os ovos. Do mesmo modo, não é possível criar uma caixa de diálogo personalizada sem quebrar alguns ovos (ficamos com fome no meio dessa coluna e fomos fazer um lanche). Agora que estamos satisfeitos, veremos se conseguimos explicar como isso funciona.

O que estamos fazendo com o script é usar o modelo de objeto do Internet Explorer® para criar uma pseudocaixa de diálogo. Vamos criar uma instância do Internet Explorer, pegar uma coleção de UOs do Active Directory e, em seguida, exibir esses UOs em uma caixa de listagem em uma janela do Internet Explorer. Aguardamos até o usuário selecionar um UO, pegamos o ADsPath do item selecionado, fechamos a “caixa de diálogo” e partimos desse ponto.

Observação: esta será a caixa de diálogo mais estranha e interessante já criada? Sim se por “estranha e interessante” você estiver se referindo à estrutura da caixa que não tem nem mesmo um botão OK ou Cancelar. Mas, para nos defender, a idéia é simplesmente dar a estrutura básica. Se desejar personalizar ou modificar a caixa de diálogo, terá que fazer isso sozinho.

(Meu Deus, se recebêssemos um centavo cada vez que disséssemos “Desculpe, você terá que fazer isso sozinho” realmente estaríamos ricos. Envie suas doações para a Equipe de Scripts, CC: TechNet Magazine.)

Para que a explicação de nossa técnica caiba no espaço designado para nós, teremos que pular algumas etapas. Por exemplo, tudo que vamos mencionar sobre o seguinte bloco de código é que ele cria uma instância do Internet Explorer que tem 350 pixels por 400 pixels e, assim, oculta coisas como a barra de endereço e a barra de status:

Set objExplorer = CreateObject( _
    "InternetExplorer.Application")

objExplorer.Navigate "about:blank"   
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width= 350
objExplorer.Height = 400 
objExplorer.Left = 400
objExplorer.Top = 400
objExplorer.Visible = 1             

Obviamente, tudo isso nos dá uma janela do Internet Explorer em branco. Para obter a lista de UOs em nosso domínio, precisamos fazer uma pesquisa no Active Directory. Não podemos explicar os detalhes da pesquisa do Active Directory hoje; para obter mais informações sobre isso, consulte nossa série de duas partes no Script Center em microsoft.com/technet/scriptcenter/resources/tales/sg0405.mspx. O que podemos fazer é dizer que este é o código usado para recuperar o Nome e o ADsPath de cada UO do domínio fabrikam.com:

objCommand.CommandText = _
    "SELECT Name, ADsPath FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory=
    'organizationalUnit' ORDER BY Name"

Ah, e só para facilitar as coisas, também classificamos os UOs em ordem alfabética por nome. A cláusula ORDER BY Name tem essa finalidade. (Sem problemas; afinal, estamos aqui para servi-lo.)

Quando chamamos o método Execute, voltamos a um conjunto de registros que consiste em todos os UOs encontrados no fabrikam.com. Desse modo, nossa próxima etapa é exibir cada UO em uma caixa de listagem.

Então, como fazemos isso? Primeiro, precisamos construir a caixa de listagem inteira na memória. Para os iniciantes, isso significa usar essa linha de código para armazenar a marca <SELECT> em uma variável chamada strHTML:

strHTML = "<select size = '20' name='OUList' style='width:300px'>"

O que estamos fazendo com essa linha de código? Bem, simplesmente estamos construindo uma caixa de listagem HTML padrão (o que é possível fazer usando a marca <SELECT>). No meio do caminho, damos à caixa de listagem o nome OUList e a configuramos para exibir 20 itens por vez e ter 300 pixels (300px). Se você conhecer um pouco de HTML, o código anterior será familiar.

Em seguida, temos que adicionar alguns itens (ou seja, alguns UOs) à caixa de listagem. Por uma coincidência surpreendente, nosso conjunto de registros é constituído pelas informações sobre cada UO de nosso domínio. Desse modo, podemos configurar um loop Do Until que percorre o conjunto de registros inteiro, capta as informações e adiciona cada UO à caixa de listagem. Dentro do loop, usamos o seguinte código (novamente, HTML padrão para adicionar itens à uma caixa de listagem) para adicionar cada UO, configurando o item para que o nome do UO seja exibido na lista e, caso você clique no UO na caixa de listagem, o ADsPath é transferido para o script:

strHTML = strHTML & "<option value= " & _
    Chr(34) & objRecordSet.Fields
    ("AdsPath").Value & Chr(34)
strHTML = strHTML & ">" & objRecordSet.
    Fields("Name").Value

Por que transferir o ADsPath para o script? É fácil. Imagine que, em vez disso, tivéssemos transferido o nome do UO. Se o nome for, por exemplo, Finance, será difícil vinculá-lo ao UO; além disso, “Finance” não é uma cadeia de vinculação ADSI válida propriamente dita. No entanto, se voltarmos ao ADsPath (LDAP://ou=Finance,dc=fabrikam,dc=com), a vinculação é moleza. Isso porque o ADsPath é exatamente do que precisamos para localizar e estabelecer a conexão com um objeto do Active Directory.

A propósito, estamos exibindo o Nome na caixa de listagem porque supomos que seus UOs têm nomes exclusivos. Talvez isso não aconteça; por exemplo, os UOs North America\Research e Europe\Research têm o mesmo nome (Research). Se os UOs tiverem nomes duplicados, use um property-say, ADsPath ou distinguishedName-in na caixa de listagem. Isso você deve decidir sozinho. (Uau! Mais um centavo!)

Por falar nisso, observe que ainda estamos construindo a caixa de listagem da memória: cada item adicionado à caixa está sendo adicionado à variável strHTML. Tudo isso faz parte do plano: salvamos o código inteiro da caixa de listagem na variável strHTML e, em seguida, usamos o valor dessa variável para adicionar realmente a caixa de listagem à nossa instância do Internet Explorer.

Após todos os UOs terem sido adicionados, usamos essa linha de código para significar o final da caixa de listagem:

strHTML = strHTML & "</select>"

Nesse momento, strHTML contém todas as marcas HTML necessárias para criar uma caixa de listagem e, o melhor de tudo, uma caixa na qual cada item representa um UO do Active Directory. Isso significa que agora podemos atribuir o valor de strHTML à propriedade InnerHTML de nosso documento do Internet Explorer:

objExplorer.Document.Body.InnerHTML = strHTML

Por sua vez, isso nos dá uma caixa de listagem que exibe todos os UOs de um domínio.

Calma, não vá embora; ainda não terminamos. Por exemplo, ainda precisamos de algum código que permita pausar o script até o usuário selecionar um UO na caixa de diálogo; sem esse código, a caixa de listagem seria exibida, mas o script continuaria em execução, independentemente da seleção do usuário. Credo! Para manter esse cenário, usamos o seguinte bloco de código:

Do While objExplorer.Document.Body.All.OUList.Value = ""
    Wscript.Sleep 300
Loop

O que estamos fazendo aqui é verificar repetidamente o valor de nossa caixa de listagem (o qual, como você talvez se lembre, chamamos de OUList, o mesmo nome que um dos rapazes da Equipe de Scripts deu para sua filha). Se o valor for uma cadeia vazia (indicando que nenhum item foi selecionado), simplesmente pausamos o script por 300 milissegundos, pesquisamos e verificamos novamente. Esse processo continua: a) sempre; b) até o usuário selecionar um item na caixa de listagem; ou c) até o usuário fechar a janela do Internet Explorer.

Suponha que o usuário não selecione um UO na caixa de listagem. Nesse caso, pegamos o valor (que é o ADsPath do UO) e o atribuímos a uma variável chamada strTargetOU:

strTargetOU = objExplorer.Document.Body.All.OUList.Value

Em seguida, usamos o método Quit para ignorar a instância do Internet Explorer conforme mostrado abaixo:

objExplorer.Quit

Nessa etapa, estamos quase terminando. Primeiro, verificamos se strTargetOU é igual a uma cadeia vazia:

If strTargetOU = "" Then
    Wscript.Quit
End If

Em caso afirmativo, o usuário terá fechado o Internet Explorer sem selecionar um UO; nós, por sua vez, usamos o método Wscript.Quit para encerrar o script. (Estamos imaginando que caso o usuário não tenha selecionado um UO, ele não está realmente interessado em executar o script.) No entanto, se strTargetOU não for igual a uma cadeia vazia, repetimos o valor da variável:

Wscript.Echo strTargetOU

Obviamente, em um script real, você provavelmente continuaria e se vincularia ao UO do Active Directory em vez de simplesmente repetir o ADsPath. Mas, você sabe o que eles dizem, ou pelo menos o que nós dizemos: você terá que fazer isso sozinho.

Como já mencionamos, e você pode observar na Figura 2, não é a caixa de diálogo mais estranha já criada, mas funciona e é mais fácil do que inserir um ADsPath (supondo que você mal conhece o ADsPath). Além disso, você tem a oportunidade de personalizar o código, e a caixa de diálogo, para satisfazer suas necessidades.

Figure 2 A simple script dialog

Figure 2** A simple script dialog **

Se ganhássemos um centavo para cada coluna que já escrevemos sobre como exibir uma caixa de diálogo que permite selecionar um UO do Active Directory... Ganharíamos 5 centavos a mais do que a TechNet Magazine normalmente paga.

Não estamos reclamando de jeito nenhum.

A Equipe de Scripts da Microsoft trabalha para (na verdade, está empregada pela) 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.

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