scriptomatic

12 de agosto de 2008

Hace poco descubrí una herramienta de script muy útil para todos los que tengamos Active Directory. Esta es una herramienta gratuita de Microsoft llamada ADSI Scriptomatic. ADSI sin las siglas de Active Directory Services Interfaces. Una vez descargado y descomprimido copiamos su ejecutable dentro de la carpeta Windows y ya podemos comenzar a utilizarlo.

Con Sriptomatic podemos arrancar un Wizard que nos escribe el código necesario en Windwos Script Host necesario para acceder a los objetos del LDAP del Active Directory. Podemos hacer cuatro operaciones basicas: crear un objeto, borrarlo, leerlo o modificarlo. Estas cuatro operaciones las podemos hacer sobre otros cinco objetos: usuario, computadores, impresoras, grupos o unidades organizativas. Si queremos leer los datos de un usuario llamado "test" dentro de la unidad organizativa "central", seleccionariamos del Wizard "leer" y "usuario".

Al final solo tenemos que modificar el código segun nuestras necesidades:

strContainer = "ou=Central"
strName = "test"

On Error Resume Next

Set objRootDSE = GetObject("LDAP://rootDSE")
If strContainer = "" Then
  Set objItem = GetObject("LDAP://" & _
    objRootDSE.Get("defaultNamingContext"))
Else
  Set objItem = GetObject("LDAP://cn=" & strName & "," & strContainer & "," & _
    objRootDSE.Get("defaultNamingContext"))
End If

strname = objItem.Get("name")
WScript.Echo "usuario: " & strname
strtelephoneNumber = objItem.Get("telephoneNumber")
WScript.Echo "telefono: " & strtelephoneNumber
strmail = objItem.Get("mail")
WScript.Echo "correo: " & strmail
El ejemplo anterior consulta el usuario "test" y muestra por pantalla su nombre de usuario, telefono y dirección de correo.

Aun no he utilizado Scriptomatic pero se me ocurre poder utilizarlo para automatizar el alta y baja de usuarios del Active Directory de forma automática.

Podemos ir más lejos. Tambien existe el Scriptomatic Version 2 (sin el ADSI delante) que funciona y se instala de la misma manera pero que nos da la posibilidad de acceder a cualquien objeto WMI de Windows (procesos, usuario, espacio en disco, red, politicas...) y todo con lenguaje de script.
Supongamos que queremos tener tener un listado de los trabajos que hay pendientes en la impresora. Desde Scriptomatic Version 2 seleccionamos en "WMI Namespaces" la opción root\CIMV2 y el "WMI Class" seleccionamos Win32_PrinJob.

Obtendremos un código como este:
On Error Resume Next

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

arrComputers = Array("MI_SERVIDOS")
For Each strComputer In arrComputers
   WScript.Echo
   WScript.Echo "=========================================="
   WScript.Echo "Computer: " & strComputer
   WScript.Echo "=========================================="

   Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PrintJob", "WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)

   For Each objItem In colItems
      WScript.Echo "Caption: " & objItem.Caption
      WScript.Echo "DataType: " & objItem.DataType
      WScript.Echo "Description: " & objItem.Description
      WScript.Echo "Document: " & objItem.Document
      WScript.Echo "DriverName: " & objItem.DriverName
      WScript.Echo "ElapsedTime: " & WMIDateStringToDate(objItem.ElapsedTime)
      WScript.Echo "HostPrintQueue: " & objItem.HostPrintQueue
      WScript.Echo "InstallDate: " & WMIDateStringToDate(objItem.InstallDate)
      WScript.Echo "JobId: " & objItem.JobId
      WScript.Echo "JobStatus: " & objItem.JobStatus
      WScript.Echo "Name: " & objItem.Name
      WScript.Echo "Notify: " & objItem.Notify
      WScript.Echo "Owner: " & objItem.Owner
      WScript.Echo "PagesPrinted: " & objItem.PagesPrinted
      WScript.Echo "Parameters: " & objItem.Parameters
      WScript.Echo "PrintProcessor: " & objItem.PrintProcessor
      WScript.Echo "Priority: " & objItem.Priority
      WScript.Echo "Size: " & objItem.Size
      WScript.Echo "StartTime: " & WMIDateStringToDate(objItem.StartTime)
      WScript.Echo "Status: " & objItem.Status
      WScript.Echo "StatusMask: " & objItem.StatusMask
      WScript.Echo "TimeSubmitted: " & WMIDateStringToDate(objItem.TimeSubmitted)
      WScript.Echo "TotalPages: " & objItem.TotalPages
      WScript.Echo "UntilTime: " & WMIDateStringToDate(objItem.UntilTime)
      WScript.Echo
   Next
Next

Function WMIDateStringToDate(dtmDate)
WScript.Echo dtm: 
 WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
 Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
 & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2))
End Function

Microsoft también habla Logonomatic (scripts de inicio de session en Windows) y de Eventomatic (scripts para acceder al visor de sucesos de Windows) pero no he encontrado información y parece ser solo proyectos futuros del grupo de programadores de scripting de Microsot.