• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

teckV

[vbscript] Administrar com WSH Script ADUtils

1 mensagem neste tópico

Administar com VBScript WSH final - Nova Versão

vou agora mostrar um script completo que é no fundo um pequeno utilitário para Active Directory e não só.

Podem usar partes para colocar noutros scripts como a rotina de leitura e parsing de files de config ou a rotina de leitura e parsing de dados de input na linha de comandos.

ficheiro de configuração:

O ficheiro de configuração é um simples txt com os pares de chave/valor separados por ==.

A posição dos pares de chave/valor é irrelevante e para comentar coloquem um # no inicio da linha.

exemplo de um file de config:

#----------inicio file config -------------------

#Explorem o script para entender melhor o file de config, é meu e é Open Source

#cuidado com as opções não comentadas, dependendo da operação algumas

#opções devem tar comentadas e outras não

#é um utilitário interno, não uma ferramenta para Script Kidies

#ldapq==CN=Sus_Postos,OU=Edificios,OU=Workstations,

#ldapq==CN=Domain Admins,OU=Special Users,OU=MinhaEmpresa,

ldapq==CN=username,OU=Special Users,OU=MinhaEmpresa,

dbserver==meuSQLserver

dblogin==User ID=meuUser;Password=minhaPassword

#esta operação lista todos os membros de um grupo ou OU, depende do path LDAP

#operacao==listarou

#operação que compara os membros do grupo ou OU´s com uma BD interna

#operacao==versus

#retorna uma propriedade de um objecto AD

operacao==getprop

#nome da propriedade

nameProp==whenCreated

#nome do file a guardar os resultados

outputfile==domainadmins.txt

propCondition==description=

headerFile==Listagem de servidores sem descrição nos seguintes OU´s

headerFile==OU=Lisboa,OU=Servidores,OU=ITmanag

headerFile==OU=Porto,OU=Servidores,OU=ITmanag

#----------fim file config -------------------

Este script deve correr sob o ambiente do CScript para o output e input na linha de comandos(consola)

syntax: c:\cscript adutils.vbs . .

eplorem as opções na linha de comandos.....

------------------------ script file

'on error resume next

Const ADS_SCOPE_SUBTREE = 2

Const adOpenStatic = 3

Const adLockOptimistic = 3

dim arrLDAPgroup(), headerFile(), retLDAPvalue(), retDBHosts()

dim strArgDB, strArgLDAP

' este array está fixo porque houve problemas no seu redimensionamento dinamico... a ver melhor

dim arrComm(30,1)

dim dbserver, dblogin, operacao, outputfile, nameProp, propCondition

Dim strMember, strDNSDomain, strContainer, seleciona

Dim objGroup, objRootDSE, arrMemberOf, objLastLogon

Set fso = CreateObject("Scripting.FileSystemObject")

Set objStdIn = WScript.StdIn

Set objStdOut = WScript.StdOut

Set objConnection = CreateObject("ADODB.Connection")

objStdOut.writeline "tempo inicio... " & time

i=0

ii=0

if Wscript.Arguments.count=0 then

objStdOut.writeline "Introduza o file de config..."

strConfFile = objStdIn.readline

elseif Wscript.Arguments.Item(0)="." then

strConfFile = "app.conf"

else

strConfFile = Wscript.Arguments.Item(0)

end if

If fso.FileExists(strConfFile) Then

set f = fso.opentextfile(strConfFile,1,-2)   

Else

    objStdOut.writeline "Ficheiro de Config não encontrado..."

    Wscript.quit

End If

if Wscript.Arguments.count=2 then

parHostType = Wscript.Arguments.Item(1)

else

parHostType = 0

end if

'---------------- Inicio Ler a configuração  ---------------------------------

private sub lerConfFile()

Do While Not f.AtEndOfStream

strConfText = f.Readline()

arrConfLine = Split(strConfText, "==", -1, 1)

if instr(left(strConfText,1),"#")=0 then

for each strConfElem in arrConfLine

arrComm(i,ii) = strConfElem

ii=ii+1

next

i=i+1

ii=0

end if

Loop

i=0

redim headerFile(0)

redim arrLDAPgroup(0)

for each strParam in arrComm

select case strParam

case "ldapq"

arrLDAPgroup(ubound(arrLDAPgroup)) = arrComm(i,1)

redim preserve arrLDAPgroup(ubound(arrLDAPgroup)+1)

i=i+1

case "dblogin"

dblogin = arrComm(i,1)

i=i+1

case "dbserver"

dbserver = arrComm(i,1)

i=i+1

case "operacao"

operacao = arrComm(i,1)

i=i+1

case "nameProp"

nameProp = arrComm(i,1)

i=i+1

case "outputfile"

outputfile = arrComm(i,1)

i=i+1

case "propCondition"

propCondition = arrComm(i,1)

i=i+1

case "headerFile"

headerFile(ubound(headerFile)) = arrComm(i,1)

redim preserve headerFile(ubound(headerFile)+1)

i=i+1

end select

next

end sub

'---------------- Fim Ler a configuração  ---------------------------------

private sub noRecBD

objStdOut.writeline "Não foram retornados registos da BD..."

objStdOut.writeline "Verifique o parametro Host_Type!"

objStdOut.writeline "sp para Servidores e Postos"

objStdOut.writeline "9 para Postos"

objStdOut.writeline "11 para Servidores"

objStdOut.writeline "Ex: cscript issus.vbs . sp"

wscript.quit

end sub

'------------------ Retorna os hosts em BD --------------------------------

private sub getDBhosts(hostType)

Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open "Provider=SQLOLEDB;Data Source=" & dbserver & ";" & _

        "Initial Catalog=bcp_security;" & dblogin & ";"

           

strSelect = "SELECT host_nameinfo FROM SEC_hostinfo"

' ------- configuração com a opção "sp" para postos e servidores tipo 9 e 11

if hostType = "sp" then

strSelect = strSelect & " where host_type=9 or host_type=11"

elseif hostType <> 0 then

strSelect = strSelect & " where host_type=" & cint(hostType)

end if

objRecordSet.Open strSelect, objConnection, adOpenStatic, adLockOptimistic

if objRecordSet.eof or objRecordSet.bof then

noRecBD

end if

objRecordSet.MoveFirst

redim retDBHosts(objRecordSet.recordcount)

i=0

do until objRecordSet.eof

retDBHosts(i) = objRecordSet.Fields("host_nameinfo").Value

i=i+1

objRecordSet.MoveNext

loop

end sub

'-------------------- Retorna dados da AD ---------------------------

private sub getLDAP()

i=0

ii=0

redim retLDAPvalue(0)

'----- Ligar ao AD ---------  arrLDAPgroup(0)

Set objRootDSE = GetObject("LDAP://RootDSE")

strDNSDomain = objRootDSE.Get("DefaultNamingContext")

for each strLDAPq in arrLDAPgroup

if not isempty(strLDAPq) then

strContainer = strLDAPq

Set objGroup = GetObject ("LDAP://"& strContainer & strDNSDomain)

objGroup.getInfo

select case operacao

case "listargroup"

if getprop = 0 then

arrMemberOf = objGroup.GetEx("member")

For Each strMember in arrMemberOf

redim preserve retLDAPvalue(ubound(retLDAPvalue)+1)

strName = split(strMember,",",-1,1)

strDName = split(strName(0),"=",-1,1)

retLDAPvalue(ubound(retLDAPvalue)) = strDName(1)

i=i+1

Next

elseif getprop=1 then

redim retLDAPvalue(0)

retLDAPvalue(0) = objGroup.Get(nameProp)

end if

case "listarou"

seleciona = true

For each ObjOU in objGroup

if propCondition <> "" and left(ObjOU.name,2)<>"OU" then

seleciona = false

propNameValue = split(propCondition,"=",-1,1)

nameprop = propNameValue(0)

if objou.Description = propNameValue(1) then seleciona=true

objstdout.writeline " seleciona " & seleciona

end if

if seleciona = true and left(ObjOU.name,2)<>"OU" then

strLine = ObjOU.CN & "  > Descrição = " & ObjOU.description

if nameprop<>"" and propCondition = "" then

strline = strline & " > prop:" & nameprop & " = " & objou.get(nameprop)

end if

retLDAPvalue(ubound(retLDAPvalue)) = strline

redim preserve retLDAPvalue(ubound(retLDAPvalue)+1)

i=i+1

end if

Next

end select

end if

next

end sub

'-------------------- Compara hosts em LDAP e BD Sav ---------------------------

private sub compareObjs()

inSus=0

Set stream = fso.CreateTextFile(outputfile)

for each strArgDB in retDBHosts

'objStdOut.Writeline "strArgDB = " & strArgDB

for each strArgLDAP in retLDAPvalue

if instr(1,strArgDB, strArgLDAP,1) and strArgLDAP<>"" then

isSus=1

end if

next

if isSus=0 then

stream.Writeline "Nome " & strArgDB

objstdout.Writeline "Nome " & strArgDB

else

isSus=0

end if

next

end sub

'-------------------- Fim Compara hosts em LDAP e BD Sav ---------------------------

'-------------------- Inicio Main --------------------------------------------------

lerConfFile

' ----------- separar por operação--------------------

select case operacao

case "versus"

getDBhosts(parHostType)

if err.number <> 0 then

noRecBD

end if

getprop = 0

getLDAP

compareObjs

case "listargroup","listarou"

iii=1

getLDAP

Set stream = fso.CreateTextFile(outputfile)

for each header in headerFile

stream.writeline header

next

stream.writeline

for each strArgLDAP in retLDAPvalue

stream.writeline iii & " > nome = " & strArgLDAP

iii=iii+1

next

case "getprop"

getprop = 1

getLDAP

objstdout.Writeline "Valor da proprieda " & nameProp & " = " & retLDAPvalue(0)

end select

objStdOut.writeline "tempo fim... " & time

Set objConnection = nothing

teckV onBoard

h2k5

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora