martes, 29 de noviembre de 2011

Obtener información de un archivo .ini con SCCM

Hola

En ciertas ocasiones nos solicitan obtener información de un archivo utilizando SCCM.
Al principio seguramente pensaríamos que podríamos utilizar "File Collection" podría ser la solución. Lamentablemente no es tan fácil, File Collection solo copia los archivos pero no podemos ver el contenido dinamicamente con SCCM. (No podríamos crear un reporte con el contenido del fichero)

Para ello es necesario enviar la información del fichero al WMI en cada equipo y modificar el smsdef.mof para obtener esta información con SCCM.

Debemos crear un paquete para que ejecute un VBS, este VBS enviará la información al WMI.

Si sabemos que solo unas máquinas tienen el fichero podemos publicarlo solo a esas máquinas (podríamos utilizar el software inventory para saber si la máquina tiene el fichero).
También podemos tener en cuenta cada cuanto se modifica el fichero para modificar el advertisiment y ejecutarlo cada cierto tiempo que creemos que se modifica el fichero.

Como hacerlo?

Crear un paquete que solo tenga el VBS que detalla abajo y publicar el advertisiment como cscript.exe WhateverYouCalledIt.vbs

Cambiar el TheIniFile= por el nombre del fichero INI del cual que queremos obtener información
En este ejemplo se obtiene el campo "Release" y "Description"

on error resume next'Lee el contenido del archivo .ini
'Vuelca el contenido a WMI
Set fso = CreateObject("Scripting.FileSystemObject")
TheIniFile = "c:\temp\someinifile.ini"


Dim wbemCimtypeString
wbemCimtypeString = 8


' Remueve la clases
Set oLocation = CreateObject("WbemScripting.SWbemLocator")
Set oServices = oLocation.ConnectServer(,"root\cimv2")
set oNewObject = oServices.Get("CM_INIBuildInfo")
oNewObject.Delete_
'=================
'Lee el archivo y obtiene la informacion
'=================
Dim str1(1)
Set objfile = fso.OpenTextFile(TheIniFile,1,False)
Do Until objFile.AtEndOfStream
strstring = objfile.ReadLine
If InStr(strstring,"=") > 0 then
   str2 = Split(strstring, "=", -1, 1)
   If lcase(str2(0)) = "release" Then
     str1(0) = str2(1)
   End If
   If LCase(str2(0)) = "description" Then
     str1(1) = str2(1)
   End If
End If
Loop
objfile.close


'==================
'Copia la informacion a un Namespace de WMI
'==================
' Se crea la estructura para copiarla a WMI
' Nota=no usar la palabra release, esta reservada internamente
Set oDataObject = oServices.Get
oDataObject.Path_.Class = "CM_INIBuildInfo"
oDataObject.Properties_.add "Rel" , wbemCimtypeString
oDataObject.Properties_("Rel").Qualifiers_.add "key" , True
oDataObject.Properties_.add "Description" , wbemCimtypeString
oDataObject.Put_


Set oNewObject = oServices.Get("CM_INIBuildInfo" ).SpawnInstance_
oNewObject.Rel = cstr(str1(0))
oNewObject.Description = str1(1)
oNewObject.Put_


wscript.quit


'================

Como les había comentado debemos modificar el fichero sms_def.mof file en inboxes\clifiles.src\hinv para que SCCM pueda obtener la información. Siempre pegarlo al final del contenido.

//============Info de fichero INI===========
//Pre-requisito: Ejecutar el programa que copia la informacion a WMI
//==================================
[ SMS_Report     (TRUE),
  SMS_Group_Name ("INIBuildInfo"),
  SMS_Class_ID   ("CUSTOM|INIBuildInfo|1.0") ]
class CM_INIBuildInfo : SMS_Class_Template
{
    [SMS_Report (TRUE), key ] string rel;
    [SMS_Report (TRUE)      ] string Description;
};

Espero que les sea de utilidad.

Saludos

Gastón Gardonio