Video Screencast Help

Custom Inventory for Autodesk Products in Notification Server 7.x

Created: 27 May 2013 • Updated: 27 May 2013 • 1 comment
hnieva's picture
+1 1 Vote
Login to vote

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:

res_manager_custom_inv_autodesk.png

 

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

 

Saludos,

Hugo

Comments 1 CommentJump to latest comment

durga.gadde@locuz.com's picture

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

Regards,

Durga Prasad G

 

0
Login to vote