Buenas tardes,
Hace algún tiempo tuvimos que realizar un inventario de todos los productos Autodesk instalados en nuestras computadoras. Autodesk nos suministró un archivo Autodesk.XML para ejecutar con Inventory Solution 6.x pero nostros ya teníamos Inventory Solution 7.x por lo tanto convertí Autodesk.XML a un inventario personalizado para Inventory Solution 7.x. Quizás les sirva!
Step 1: Create a Custom Data Class. For example: Autodesk (See attached screenshot custom_data_class_autodesk.png)
Step 2: Create a Client Task, with script type equals to vbscript, run as Symantec Management Agent credentials and this script content:
'******************************************************************************
'Autor: Hugo Nieva
'Descripción: Custom Inventory para Altiris 7 de productos Autodesk.
' Basado en el Custom Inventory para Altiris 6 creado por Autodesk
' Autodesk.xml. En el servidor Altiris Notification Server 7 se creó
' un Custom Data Class.
'
'Custom Data Class: "Autodesk"
'
'Versión: 1.2
'
'Modificaciones:
' 2011-10-26 v0.0: Se crea script
' 2011-10-31 v1.0: Primer versión funcional
' 2011-11-01 v1.1: Se refactoriza el código creando dos funciones GetAutodesk...
' 2011-11-03 v1.2: Se corrige resultado de fila c0=False
'******************************************************************************
Option Explicit
'On Error Resume Next
Const HKEY_LOCAL_MACHINE = &H80000002
Const sinError = 0
Dim modoTest
'Configurar modoTest = True para probar la información obtenida por este script,
'generando un archivo XML en C:\ por ejemplo "Autodesk.xml"
modoTest = False
'==============================================================================
'Creo una instancia del componente Altiris objobjNSE
Dim objNSE
Set objNSE = WScript.CreateObject ("Altiris.AeXNSEvent")
'Configuro el header data del objNSE. NO modificar el siguiente GUID!
objNSE.To = "{1592B913-72F3-4C36-91D2-D4EDA21D2F96}"
objNSE.Priority = 1
'Creo el Inventory data block. Se asume que en el servidor ya se configuró
'un data class con el siguiente GUID o Nombre
Dim objDCInstance
'Instancio el data class según su GUID
Dim dataClassGUID
'dataClassGUID = "{bf5581fb-fd5c-4672-a013-1b35604196b1}"
'set objDCInstance = objNSE.AddDataClass ("{bf5581fb-fd5c-4672-a013-1b35604196b1}")
'Instancio el data class según su Nombre: Autodesk
Dim dataClassName
dataClassName = "Autodesk"
Set objDCInstance = objNSE.AddDataClass (dataClassName)
Dim objDataClass
Set objDataClass = objNSE.AddDataBlock (objDCInstance)
'==============================================================================
Dim objDataRow
'Listado de productos Autodesk a revisar
Dim objProductosAutodesk ' Create a variable que será un objeto Dictionary
Set objProductosAutodesk = CreateObject("Scripting.Dictionary")
'Agrego los productos que aparecen en el archivo Autodesk.xml
'más los identificados luego del Hardware Inventory
'Según el archivo Autodesk.xml para los siguientes productos
'el criterio es buscar la llave de registro "StandaloneNetworkType"
objProductosAutodesk.Add "0", "SOFTWARE\Autodesk\AutoCAD\R18.2"
objProductosAutodesk.Add "1", "SOFTWARE\Autodesk\AutoCAD\R18.1"
objProductosAutodesk.Add "2", "SOFTWARE\Autodesk\AutoCAD\R18.0"
objProductosAutodesk.Add "3", "SOFTWARE\Autodesk\AutoCAD\R17.2"
objProductosAutodesk.Add "4", "SOFTWARE\Autodesk\AutoCAD\R17.1"
objProductosAutodesk.Add "5", "SOFTWARE\Autodesk\AutoCAD\R17.0"
objProductosAutodesk.Add "6", "SOFTWARE\Autodesk\AutoCAD\R16.2"
objProductosAutodesk.Add "7", "SOFTWARE\Autodesk\AutoCAD\R16.1"
objProductosAutodesk.Add "8", "SOFTWARE\Autodesk\AutoCAD\R16.0"
objProductosAutodesk.Add "9", "SOFTWARE\Autodesk\AutoCAD LT"
objProductosAutodesk.Add "10", "SOFTWARE\Autodesk\AutoCAD LT\R10"
objProductosAutodesk.Add "11", "SOFTWARE\Autodesk\AutoCAD LT\R11"
objProductosAutodesk.Add "12", "SOFTWARE\Autodesk\AutoCAD LT\R12"
objProductosAutodesk.Add "13", "SOFTWARE\Autodesk\AutoCAD LT\R13"
objProductosAutodesk.Add "14", "SOFTWARE\Autodesk\AutoCAD LT\R14"
objProductosAutodesk.Add "15", "SOFTWARE\Autodesk\AutoCAD LT\R15"
objProductosAutodesk.Add "16", "SOFTWARE\Autodesk\AutoCAD LT\R16"
objProductosAutodesk.Add "17", "SOFTWARE\Autodesk\AutoCAD LT\R17"
objProductosAutodesk.Add "18", "SOFTWARE\Autodesk\Inventor"
objProductosAutodesk.Add "19", "SOFTWARE\Autodesk\Inventor\RegistryVersion11.0"
objProductosAutodesk.Add "20", "SOFTWARE\Autodesk\Inventor\RegistryVersion12.0"
objProductosAutodesk.Add "21", "SOFTWARE\Autodesk\Inventor\RegistryVersion13.0"
objProductosAutodesk.Add "22", "SOFTWARE\Autodesk\Inventor\RegistryVersion14.0"
objProductosAutodesk.Add "23", "SOFTWARE\Autodesk\Inventor\RegistryVersion15.0"
objProductosAutodesk.Add "24", "SOFTWARE\Autodesk\Inventor\RegistryVersion16.0"
Dim objItems, i
Dim strKeyPath, strProductName, strRelease, strSerialNumber, strLocaleID, strKeyName, strStandaloneNetworkType
objItems = objProductosAutodesk.Items ' Get de todos los productos
For i = 0 To objProductosAutodesk.Count -1 ' Iteramos en cada producto Autodesk
strKeyPath = objItems(i) '"SOFTWARE\Autodesk\AutoCAD\R18.2" etc etc
strStandaloneNetworkType = Null
GetAutodeskSpecificInfo HKEY_LOCAL_MACHINE, strKeyPath, strProductName, strRelease, _
strSerialNumber, strLocaleID, strKeyName, strStandaloneNetworkType, "StandaloneNetworkType"
If (Not IsNull(strStandaloneNetworkType)) Then
'Grabo la información en un XML para ser enviado al servidor
'Agrego una nueva fila al data block
Set objDataRow = objDataClass.AddRow
'Configuro las columnas con los valores obtenidos del registro de Windows
objDataRow.SetField 0, ToXmlString(strProductName)
objDataRow.SetField 1, ToXmlString(strRelease)
objDataRow.SetField 2, ToXmlString(strSerialNumber)
objDataRow.SetField 3, ToXmlString(strLocaleID)
objDataRow.SetField 4, ToXmlString(strKeyName)
objDataRow.SetField 5, ToXmlString(strStandaloneNetworkType)
End If
Next
objProductosAutodesk.RemoveAll
'Según el archivo Autodesk.xml para los siguientes productos
'el criterio es buscar la llave de registro "Release"
objProductosAutodesk.Add "0", "SOFTWARE\Autodesk\AutoCAD\R15.0"
objProductosAutodesk.Add "1", "SOFTWARE\Autodesk\AutoCAD\R14.0"
objProductosAutodesk.Add "2", "SOFTWARE\Autodesk\AutoCAD"
objItems = objProductosAutodesk.Items ' Get de todos los productos
For i = 0 To objProductosAutodesk.Count -1 ' Iteramos en cada producto Autodesk
strKeyPath = objItems(i) '"SOFTWARE\Autodesk\AutoCAD\R18.2" etc etc
strRelease = Null
GetAutodeskSpecificInfo HKEY_LOCAL_MACHINE, strKeyPath, strProductName, strRelease, _
strSerialNumber, strLocaleID, strKeyName, strStandaloneNetworkType, "Release"
If (Not IsNull(strRelease)) Then
'Grabo la información en un XML para ser enviado al servidor
'Agrego una nueva fila al data block
Set objDataRow = objDataClass.AddRow
'Configuro las columnas con los valores obtenidos del registro de Windows
objDataRow.SetField 0, ToXmlString(strProductName)
objDataRow.SetField 1, ToXmlString(strRelease)
objDataRow.SetField 2, ToXmlString(strSerialNumber)
objDataRow.SetField 3, ToXmlString(strLocaleID)
objDataRow.SetField 4, ToXmlString(strKeyName)
objDataRow.SetField 5, ToXmlString(strStandaloneNetworkType)
End If
Next
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{450063AA-643B-417C-8CF5-405BA3F4EF40}"
strRelease = Null
GetAutodeskAddRemoveProgInfo HKEY_LOCAL_MACHINE, strKeyPath, strProductName, strRelease
If (Not IsNull(strRelease)) Then
'Grabo la información en un XML para ser enviado al servidor
'Agrego una nueva fila al data block
Set objDataRow = objDataClass.AddRow
'Configuro las columnas con los valores obtenidos del registro de Windows
objDataRow.SetField 0, ToXmlString(strProductName)
objDataRow.SetField 1, ToXmlString(strRelease)
End If
'Sólo para ver la información recolectada
If modoTest = True Then
Dim objFSO, WshShell, objFile
Dim archivoXMLResultado
archivoXMLResultado = "C:\" & dataClassName & ".xml"
Set objFSO = WScript.CreateObject("Scripting.Filesystemobject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFile = objFSO.CreateTextFile(archivoXMLResultado, True, True)
objFile.Write objNSE.XmlBody
objFile.Close
WScript.Echo objNSE.XmlBody
'WshShell.Run "wordpad.exe " & Chr(34) & archivoXMLResultado & Chr(34)
Else
'Envio la información al Notification Server 7
objNSE.SendQueued
End If
'Eliminamos los objetos creados
Set objProductosAutodesk = Nothing
'************************ FUNCIONES ***************************
Function GetAutodeskSpecificInfo (regRootKey, sKeyPath, sProductName, sRelease, _
sSerialNumber, sLocaleID, sKeyName, sStandaloneNetworkType, sCheckType)
Dim strComputer, retorno
Dim strCheckKey, objRegistry, subKey, arrSubKeys, sCheckPath, sCheckValue
strComputer = "."
retorno = 1
sProductName = sRelease = sSerialNumber = sLocaleID = sKeyName = sStandaloneNetworkType = Null
Select Case sCheckType
Case "StandaloneNetworkType" strCheckKey = "StandaloneNetworkType"
Case "Release" strCheckKey = "Release"
End Select
Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
retorno = objRegistry.EnumKey (regRootKey, sKeyPath, arrSubKeys)
If retorno = sinError Then
sCheckPath = sKeyPath
sCheckValue = Null
For Each subKey In arrSubKeys
sCheckPath = sCheckPath & "\" & subKey
objRegistry.GetDWORDValue regRootKey, sCheckPath, strCheckKey, sCheckValue
If (Not IsNull(sCheckValue)) Then ' <> "" Then
objRegistry.GetStringValue regRootKey, sCheckPath, "ProductName", sProductName
objRegistry.GetStringValue regRootKey, sCheckPath, "Release", sRelease
objRegistry.GetStringValue regRootKey, sCheckPath, "SerialNumber", sSerialNumber
objRegistry.GetStringValue regRootKey, sCheckPath, "LocaleID", sLocaleID
sKeyName = subKey
objRegistry.GetDWORDValue regRootKey, sCheckPath, "StandaloneNetworkType", sStandaloneNetworkType
End If
Next
End If
GetAutodeskSpecificInfo = retorno
Set objRegistry = Nothing
End Function
'**************************************************************
Function GetAutodeskAddRemoveProgInfo (regRootKey, sKeyPath, sProductName, sRelease)
Dim strComputer, retorno
Dim objReg, sSerialNumber
strComputer = "."
retorno = 1
sProductName = sRelease = Null
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
retorno = objReg.GetStringValue (HKEY_LOCAL_MACHINE, sKeyPath, "DisplayName", sSerialNumber)
If retorno = sinError Then
If (Not IsNull(sSerialNumber)) Then ' <> "" Then
objReg.GetStringValue HKEY_LOCAL_MACHINE, sKeyPath, "DisplayName", sProductName
objReg.GetStringValue HKEY_LOCAL_MACHINE, sKeyPath, "DisplayVersion", sRelease
End If
End If
GetAutodeskAddRemoveProgInfo = retorno
Set objReg = Nothing
End Function
'***************************************************************
Function ToXmlString (strInput)
Dim strOutput
If (IsNull(strInput)) Then
ToXMLString = strInput
Else
strOutput = Replace(strInput, "&", "&")
strOutput = Replace(strOutput, """", """)
strOutput = Replace(strOutput, "<", "<")
ToXmlString = Replace(strOutput, ">", ">")
End If
End Function
Step 3: test the client task with some computer, by doing a Quick Run. After a few minutes, you can open Resource Manager, select the test computer and check Custom Inventory collected data:
Step 4: apply to production computers and create a report to see the inventory data!
Saludos,
Hugo