Client Management Suite

 View Only

Custom Inventory for Autodesk Products in Notification Server 7.x 

May 27, 2013 02:38 PM

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)

 

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, "&", "&amp;")
    strOutput = Replace(strOutput, """", "&quot;")
    strOutput = Replace(strOutput, "<", "&lt;")
    ToXmlString = Replace(strOutput, ">", "&gt;")
  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:

resource_manager_custom_inv_autodesk.png

 

Step 4: apply to production computers and create a report to see the inventory data!

 

Saludos,

Hugo

Statistics
0 Favorited
0 Views
0 Files
0 Shares
0 Downloads

Tags and Keywords

Comments

May 29, 2014 05:09 PM

Hola Hugo,

He intentado usar la plantilla que has creado, y ejecutado en el agente sin errores. Sin embargo, en el Resource Manager no obtengo el resultado de la carpeta ni del data class.

Me parece que el custom script es un poco diferente en la version 7.5.

Si llegas a revisarlo, seria genial.

Saludos.

Harold.

May 29, 2014 01:11 PM

Hola Harold, Gracias por tu comentario! No, no lo he probado en versión 7.5 :-( dado que todavía no tengo un servidor de test con SMP 7.5

Saludos!

Hugo

May 29, 2014 01:05 PM

Hello Durga! Five minutes ago I tested the script on Windows XP (spanish version) and it worked. Do you receive an error message? What line?

Thanks,

Hugo

May 29, 2014 12:37 PM

Hola Harold! No lo he probado en versión 7.5, porque aún no tengo un servidor de test con esa versión :-(

Has tenido algún inconveniente?

May 08, 2014 01:47 PM

Hola Hugo!

Esta muy bueno tu script,y en este momento me encuentro en la misma odisea de sacar los seriales de Autocad con un custom inventory.

Pregunta: Este script aplica a la version 7.5??

Gracias

Jan 27, 2014 01:30 PM

Script not working for Windows XP, Please check and re modify the script to work for Windows xp machines also.

Related Entries and Links

No Related Resource entered.