Jump to content
teckV

[vbscript] Administrar com WSH Script ADUtils

Recommended Posts

teckV

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.