sexta-feira, 28 de dezembro de 2012

Script de Logon

Escrito por Douglas Baiocco   
Um problema muito comum quando a rede começa a crescer é a manutenção das configurações dos usuários do domínio. Em muitos casos, cada setor possui arquivos e programas específicos, unidades de rede e impressoras. Não é diferente onde trabalho. Pensando em facilitar um pouco a nossa vida, utilizamos alguns recursos do próprio sistema operacional, dentre os quais podemos citar os scripts de logon. Este recurso é de extrema importância para todo administrador, já que automatiza muitas funções importantes do sistema, tais como mapeamento de impressoras, cópia de ícones, execução de programas, mapeamento de unidades de disco, etc.
A linguagem para a criação dos scripts pode ser um simples arquivo de lote do MS-DOS até sofisticados programas executáveis. Nós utilizamos aqui uma linguagem bastante poderosa: Wscript (Windows Shell Script), que além de realizar todas as tarefas que necessitamos, nos permite muito mais controle sobre o que está sendo executado.

Nosso cenário, até o momento, é este:

Existem vários setores na empresa, cada qual com suas impressoras. As impressoras são instaladas em uma máquina com Windows 2003 Server funcionando como servidor de impressão. Cada impressora é compartilhada no servidor e instalada nas máquinas dos setores.
Existe uma unidade de rede em outro servidor, compartilhada e com as permissões de acesso definidas pelos grupos dos setores. Cada máquina deve estar com o drive z: apontando para esta pasta compartilhada.

Alguns ícones devem ser colocados na área de trabalho dos usuários, para que este tenha acesso facilitado aos programas da empresa.

Temos aproximadamente 350 equipamentos entre notebooks e desktops na rede e aproximadamente 800 usuários ativos cadastrados no Active Directory. Imagine o problema quando surge um pedido como esse: “Precisamos alterar o ícone do programa XYZ dos usuários”.

Esse era um tipo de pesadelo que tínhamos todas as noites, daqueles que, ao acordarmos, preferíamos não dormir novamente.

No começo, entravamos em cada perfil de usuário, na pasta desktop e alterávamos o ícone. Após duas semanas, estavam todos alterados. Depois de algumas vezes repetindo este processo, resolvemos adotar uma solução mais “inteligente”: colocar os ícones no desktop da pasta All Users, replicando assim para todos os usuários da máquina. Maravilha! Reduziram o serviço pela metade, mas ainda assim, uma semana era perdida.

Enfim, alguma luz começou a aparecer no fim do túnel: desenvolvemos algumas tarefas automatizadas com scripts de logon.

Scripts mal feitos, diga-se de passagem, primitivos, realizavam basicamente o mapeamento de unidades de rede.

Mas como uma árvore plantada, regada e cuidada com muito carinho, o nosso script cresceu, tomou forma, tornou-se um belo script de logon em sua plena forma.

Agora, não tememos mais alterações de ícones, não temos calafrios com a chegada de novos usuários e não perdemos nossas noites de sono tentando lembrar em quais usuários esquecemos de instalar aquela impressora nova.

As funções do script que utilizamos são:

Mapeamento de unidades de rede
Criação dos ícones na área de trabalho do usuário
Instalação da impressora de acordo com a Unidade Organizacional em que o usuário se encontra
Definição de máquinas especiais para testes
Execução de programas diários de auditoria

Todas essas funções serão descritas aqui, da forma mais objetiva possível, para a propagação deste incrível recurso. Eu aceito sugestões e melhorias nos scripts, já que não sou programador por profissão, portanto, há possibilidade de erros.

Lembre-se, não estou ensinando a linguagem, nem tenho conhecimento suficiente para isso, apenas estou demonstrando o que muita pesquisa e trabalho podem realizar. Caso tenha realmente interesse em WSH, existem muitos livros, dicas e tutoriais na internet para a consulta.

“Deus disse: Faça-se a luz e a luz foi feita”

Abaixo o script de logon, com explicações sobre os pontos importantes:

‘#####################################################################
‘Este é um ponto bastante interessante do arquivo de script. É aqui que tudo começa e onde tudo pode terminar. Esta linha faz com que o script continue sua execução em caso de encontrar algum erro em sua programação. Caso esta linha esteja comentada ou não exista, a cada erro na execução, aparecerá uma mensagem e o script encerra sua atividade. Deixe esta recurso
‘#####################################################################
On Error Resume Next


‘#####################################################################
‘Neste ponto definimos os objetos e variáveis que iremos utilizar durante o script
‘#####################################################################
Set net = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem",,48)
Set unidades = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Set wshShell = CreateObject("WScript.Shell")
objDesktop = wshShell.SpecialFolders("Desktop")
strUserProfile = wshShell.ExpandEnvironmentStrings("%USERPROFILE%")
set fso=createobject("scripting.filesystemobject")
For Each objItem in colItems
NomeComputador = objItem.Caption
next
‘#####################################################################


‘#####################################################################
‘Identifica em que Unidade Organizacional está localizado o usuário corrente e atribui a variável ou.
‘Observe a linha onde devemos colocar o nome do domínio da máquina(substitua “seu domínio” pelo nome do domínio da sua rede)
‘#####################################################################
strUserId = net.UserName
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 2000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = "SELECT samaccountname, distinguishedName FROM LDAP://dc=seu dominio,dc=com,dc=br' WHERE objectCategory='user' AND sAMAccountName='" & strUserId & "'"
Set objRecordSet = objCommand.Execute
intCounter = 0
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
cn_full=objRecordSet.Fields("distinguishedName").value
intCounter = intCounter + 1
objRecordSet.MoveNext
Loop
cn1=split(cn_full,"OU=")
ou=split(cn1(1),",")
‘#####################################################################



‘#####################################################################
‘Neste local, o script abre o arquivo impressoras.txt e faz a leitura do mesmo para o mapeamento das impressoras.
‘O arquivo deve estar no mesmo local onde o script está rodando
‘Mude o nome do servidor de impressão para o nome do servidor de impressão da sua rede
‘#####################################################################
Set ObjScript = CreateObject("Scripting.FileSystemObject")
Set Texto = ObjScript.OpenTextFile("impressoras.txt")
setor="[" & ou(0) & "]"
dim x
dim LinhaTexto(100)
dim Linhaprojeto(100)
Do
LinhaTexto(x) = Texto.ReadLine
x=x+1
Loop Until texto.atendofstream = true
Texto.Close
do while cont<=ubound(LinhaTexto)
if LinhaTexto(cont) <> "" then
if LinhaTexto(cont) = setor then
cont2=cont
do while cont2<=ubound(LinhaTexto)
if LinhaTexto(cont2) <> "" then
if LinhaTexto(cont2) <> setor then
if LinhaTexto(cont2) <> "[fim]" then
net.AddWindowsPrinterConnection "\\nome do servidor de impressão\" &LinhaTexto(cont2)
wscript.echo LinhaTexto(cont2)
end if
end if
if LinhaTexto(cont2) = "[fim]" then
exit do
end if
end if
cont2=cont2+1
loop
end if
end if
cont=cont+1
loop
‘#####################################################################


‘O arquivo impressoras.txt deve ter esta estrutura (sem apóstrofe no inicio):

‘[setor]
‘Impressora1
‘Impressora2
‘[fim]

‘[setor2]
‘Impressora3
‘Impressora4
‘[fim]

‘Obs.: O nome do setor deve ser igual ao nome da Unidade Organizacional (OU) no Active Directory.


‘#####################################################################
‘Inicia procedimentos para as máquinas específicas de teste
‘Aqui definimos as máquinas que têm características especiais, como ícones e mapeamentos que as demais não têm.
‘O conteúdo do arquivo deve ter o nome das máquinas, um por linha, todos em maiúsculo.
‘#####################################################################
x=0
cont=0
Set Texto = ObjScript.OpenTextFile("maquinas_teste.txt")
Do
linhaprojeto(x) = Texto.ReadLine
x=x+1
Loop Until texto.atendofstream = true
Texto.Close
do while cont<=ubound(linhaprojeto)
if Linhaprojeto(cont) <> "" then
if Linhaprojeto(cont) = NomeComputador then

‘drive específico das máquinas de teste
If unidades.DriveExists("x:") Then
Net.RemoveNetworkDRIVE "x:", True, True
Net.MapNetworkDrive "x:", "\\maquina\pasta_compartilhada",true
objShell.NameSpace("x:").Self.Name = "Arquivos"
else
Net.MapNetworkDrive "x:", "\\maquina\pasta_compartilhada ",true
objShell.NameSpace("x:").Self.Name = "Arquivos"
end if

end if
cont=cont+1
loop
‘#####################################################################





‘#####################################################################
‘Opções para todos os usuários
‘#####################################################################
If unidades.DriveExists("z:") Then
Net.RemoveNetworkDRIVE "z:", True, True
Net.MapNetworkDrive "z:", "\\maquina\pasta_compartilhada",true
objShell.NameSpace("z:").Self.Name = "Arquivos"
else
Net.MapNetworkDrive "z:", "\\maquina\pasta_compartilhada ",true
objShell.NameSpace("z:").Self.Name = "Arquivos"
end if

‘copiar ícone para a área de trabalho
fso.copyfile "\\dominio\NETLOGON\icones\icone.lnk", strUserProfile&"/desktop/", "true"
‘#####################################################################


‘Sair do script
Wscript.Quit

A criação do script é fácil, apenas crie um arquivo com o conteúdo e salve com a extensão .VBS dentro da pasta netlogon do servidor do Active Directory.
Defina o script de logon do usuário em Active Directory Users and Computers, nas ferramentas administrativas.
Selecione o usuário e entre nas propriedades do mesmo, na guia Profile, coloque, na caixa Logon Script, o nome do arquivo .VBS criado.