Generar Inventario Automático #1

Extraer datos de los equipos con batch

Hace unas semanas se me presetó un problema en el trabajo: Necesitamos Marca, Modelo, Serie, Hostname, y Versión del Sistema Operativo para hoy. El único detalle es que se trataba de más de 30 equipos y ya pasaba de medio día. Además de que eso no significaba que el resto de trabajo del día fuera a desaparecer. Simplemente era otra cosa más que se debía hacer, pero con tiempo límite muy cercano.

Inventario de Ordenadores

Como ya sabía que sería un problema sacar esa información “a mano” de todos los equipos. Intercambié una hora de “trabajo manual” para intentar escribir un script que recopilara esta información lo más rápido y automáticamente posible.

Ese día era vital tener los datos, así que únicamente volqué el resultado de algunos comandos en un archivo y luego fui pasando la información a una base de datos de forma manual cuando ya tenía todos los archivos. Pero en los siguientes días me dediqué a ir puliendo ese script para simplificarme las cosas. De eso se trata este post, un script que recopila información de los equipos para realizar un inventario.

Para obtener los datos necesarios el proceso es muy sencillo, basta con crear varios archivos temporales con la información que se requiere y después unificar los datos en un archivo. Posteriormente se copia este archivo a un servidor, dispositivo extraíble o unidad de almacenamiento en red donde se almacenará un archivo por cada equipo a inventariar.

En un post futuro escribiré cómo automatizar la unificación de todos estos archivos en un documento de excel. Pero la empresa que en este momento nos quita el sueño es otra.

Los comandos que vamos a utilizar son pocos y bastante sencillos, es más importante como ordenar los datos y el proceso para discriminar la información, pero igual es necesario saber que se trata de los siguientes:

  • systeminfo
  • ipconfig
  • net
  • wmic

Con un poco de tiempo organizando y discriminando la información que podemos obtener lo que a mi me parece más importante es:

  • IP
  • User Full Name
  • Username
  • Hostname
  • Marca
  • Modelo
  • Serie
  • Versión de Sistema Operativo
  • Arquitectura

Después de algunos días y un montón de pruebas el script recopila la información en varios archivos temporales, después los integra todos en un único archivo, mueve el archivo final en la ruta asignada para ello y borra todos los archivos temporales que se crearon en el proceso.

@echo off
color 2
cls

rem Ruta para guardar los archivos:
set invDir=\\raspberrypi\Files\Documentos\Inventary
set comment=Este campo es por si se requiere un comentario extra.

echo "Loading..."

rem Recopilar información en archivos temporales:
net user /domain %username% | find "completo" > %tmp%\uName.txt
systeminfo >> %tmp%\sysnfo.txt
ipconfig | find "IPv4" > %tmp%\ip.txt
wmic csproduct get name > %tmp%\serie.txt
wmic csproduct get identifyingnumber >> %tmp%\serie.txt
type %tmp%\sysnfo.txt | find "Fabricante del sistema:" > %tmp%\mar.txt
type %tmp%\sysnfo.txt | find "Nombre del sistema" > %tmp%\nom.txt
type %tmp%\sysnfo.txt | find "Versi" > %tmp%\ver.txt
type %tmp%\sysnfo.txt | find "Tipo de sistema" > %tmp%\tip.txt

rem Pasar datos útiles a variables:
for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do set fecha=%%c_%%b_%%a
set /p PREVIP=<%tmp%\ip.txt
set /p PREVUNAME=<%tmp%\uName.txt
set /p PREVMAR=<%tmp%\mar.txt
set /p PREVNOM=<%tmp%\nom.txt
set /p PREVVER=<%tmp%\ver.txt
set /p PREVTIP=<%tmp%\tip.txt
set IP=%PREVIP:~47%
set fileName=%IP%-%fecha%.txt
set mar=%PREVMAR:~43%
set nom=%PREVNOM:~43%
set ver=%PREVVER:~43%
set tip=%PREVTIP:~43%
set uName=%PREVUNAME:~43%

rem Volcar información a un único archivo.
echo %uName% > %tmp%\%fileName%
echo %username% >> %tmp%\%fileName%
echo %computername% >> %tmp%\%fileName%
type %tmp%\serie.txt >> %tmp%\%fileName%
echo %mar% >> %tmp%\%fileName%
echo %nom% >> %tmp%\%fileName%
echo %ver% >> %tmp%\%fileName%
echo %tip% >> %tmp%\%fileName%
echo %comment% >> %tmp%\%fileName%

rem Mover archivo al destino especificado.
move /Y %tmp%\%fileName% %invDir%

rem Eliminar los archivos temporales creados anteriormente.
del %tmp%\uName.txt
del %tmp%\sysnfo.txt
del %tmp%\ip.txt
del %tmp%\serie.txt
del %tmp%\mar.txt
del %tmp%\nom.txt
del %tmp%\ver.txt
del %tmp%\tip.txt

El archivo final lleva de nombre la IP del dispositivo y la fecha de la recolección de los datos por si hubiera cambiado el usuario o el equipo tener un histórico sin perder información por sobreescritura. En mi prueba este archivo tendría como nombre 10.0.2.15-202_03_10.txt y el contenido sería más o menos así:

Elon Reeve Musk
emusk
MuskDesktop
Name        
VirtualBox  
IdentifyingNumber  
ABC123456                  
HP EliteDesk 800 G3 mini 
Microsoft Windows 10 Home 
10.0.19043 N/D Compilaci¢n 19043 
x64-based PC 
Este campo es por si se requiere un comentario extra. 

Cuando recopilemos una cantidad considerable de estos archivos el problema será agrupar los datos, pero eso lo veremos en otro post. Por ahora nos quedaremos aquí, con una automatización un poco “inútil” que recopila dados que sueltos sirven bastante poco, pero con algo de imaginación e invirtiendo un poco de tiempo es extremadamente útil.

Falta pulir algunos detalles como es hecho de que autómaticomente reconozca el idioma del sistema operativo y extraiga la información correctamente por lo menos en español y en inglés (actualmente sólo lo hace en español) o que en el rchivo final no se guarden las líneas Name o IdentifyingNumber para tener un resultado más limpio. Pero eso se irá mejorando con el tiempo a menos que encuentre una forma más eficiente de lograr el mismo resultado.

Recuerda que te estaré leyendo en mi twitter @engell25 o aquí abajo, en los comentarios, por si tienes recomendaciones, aportes o feedback. Nos leemos pronto.

Si te gusta lo que hago y quisieras apoyarme puedes suscribirte a mi Patreon o con un donativo vía PayPal lo que me facilita dedicar más tiempo a crear contenido con más frecuencia y que este sea de mayor calidad. No es obligatorio, pero si tienes la oportunidad te estaré profundamente agradecido.
 
comments powered by Disqus