Plugin wmicFileCheckCommands (integridad de archivos Windows)

Plugin wmicFileCheckCommands (integridad de archivos Windows)

Este script es un plugin en Perl para revisar archivos en máquinas Windows a través de WMI (Windows Management Instrumentation).
Lo que hace es conectarse remotamente a un host Windows, ejecutar consultas WMI (ya sea con el binario wmic local o vía un servicio wmic_server), obtener información de ciertos archivos (tamaño, fechas, versión, existencia), y luego generar datos estructurados (JSON, tablas, alertas).

Declaración de paquete y módulos usados

package wmicFileCheckCommands; our $VERSION = "1.0.4"; use strict; use warnings; use Encode 2.23; use Try::Tiny; use JSON::XS;
  • Define el paquete wmicFileCheckCommands, versión 1.0.4.

  • Usa strict y warnings para validar código.

  • Encode, Try::Tiny (manejo de errores con try/catch) y JSON::XS (codificar/decodificar JSON rápido).

 

Subrutina principal: collect_configuration

Esta función es el núcleo: se conecta a un Windows remoto, obtiene datos de archivos, y devuelve un JSON.

sub collect_configuration { my (%args) = @_; my ($node, $node_info, $command, $credential_set, $logger, $opconfig) = @args{qw(node node_info command credential_set logger opconfig)};
  • Recibe un hash de parámetros (nodo, info de nodo, comando a ejecutar, credenciales, logger, config global).

  1. Configuración

my $config = $opconfig->{config}; my $use_wmic_server = $config->{"opconfig_use_wmic_server"} // 0; my $wmic_server_location = $config->{"opconfig_wmic_server_location"} // "http://127.0.0.1:2313/wmic"; my $domain = $credential_set->{domain} || "WORKSPACE";
  • Permite usar dos métodos para obtener la info:

a) Cliente local wmic ejecutado en Linux.

b) Servidor remoto wmic_server (HTTP API).

  1. Leer archivo de entrada (lista de archivos a revisar)

open( my $fh, "<", $command->{exec} ) or return { error => "failed to open file $command->{exec}" };
  • El archivo $command->{exec} contiene rutas de archivos que se deben chequear.

  • Se normalizan (lc, quitar barras dobles) y se guardan en $file_list y $file_map.

  1. Generar mapa de consultas

my $request_map = get_request_map(file_list => $file_list);
  • Esta función divide las rutas en archivos individuales y directorios completos (para consultas más eficientes).

  1. Consultar archivos y directorios vía WMI

Dentro de un try { ... } catch { ... }:

  • Para cada directorio y archivo, genera una query WMI:

SELECT Name, CreationDate, LastModified, Version, FileSize, InstallDate FROM CIM_DataFile WHERE Drive="C:" AND Path="\\windows\\"
  • Si usa wmic_server, la consulta va por HTTP.

  • Si usa wmic local, ejecuta el binario /usr/local/nmis9/bin/wmic.

Guarda resultados en $results, marcando cada archivo como:

  • Found=1, si existe.

  • Found=0, si no aparece en la respuesta.

  1. Retornar resultados

$results = JSON::XS->new->pretty(1)->canonical(1)->encode( $results ); return { success => 1, configuration_data => $results };
  • Devuelve JSON con todos los archivos consultados, sus propiedades y si fueron encontrados.

 

Funciones auxiliares del plugin

  1. get_request_map: divide las rutas en archivos exactos o directorios para consultas más rápidas.

Ejemplo:

C:\Windows\System32\cmd.exe: va a lista de archivos directos.

C:\Program Files\MyApp\: consulta por directorio completo.

 

  1. run_wmic_query: ejecuta el binario wmic con credenciales.

/usr/local/nmis9/bin/wmic --domain='WORKGROUP' --server='192.168.1.10' --query='select ...'
  • Recibe JSON como salida, lo decodifica.

  • Maneja errores comunes:

no such host: host inaccesible.

ERROR_ACCESS_DENIED: credenciales inválidas.

 

  1. run_wmic_server_query:

  • Hace lo mismo, pero contra un servidor REST (wmic_server) usando Mojo::UserAgent.

  • Envía un POST con { id, token, host, query }.

  • Devuelve JSON o un error HTTP.

 

  1. process_configuration: toma el JSON generado en collect_configuration y lo procesa para NMIS/opConfig.

  • Decodifica JSON.

  • Prepara una tabla con columnas:

Name, Found, FileSize, CreationDate, LastModified, InstallDate, Version.

  • Crea alertas:

    • Si el archivo no existe: "Required File Missing" (Critical).

    • Si todo bien: evento "Normal" (para cerrar alertas pasadas).

  • Formatea fechas de WMI (yyyymmddHHMMSS.micros+TZ) a YYYY-MM-DD HH:MM:SS.

  • Devuelve:

    • derived_info: tabla para la interfaz.

    • alerts: eventos a generar

 

  1. getDiskBytes: convierte tamaños en bytes a unidades legibles:

  • 1 GB: x.xx GB

  • 1 MB: x.xx MB

  • 1 KB: x.xx KB

  • else: x b.

 

Información adicional sobre wmic y wmic_server

Contexto inicial: en las versiones anteriores del plugin se utilizaba únicamente wmic_server.

wmic_server es un servicio intermedio expuesto vía HTTP que recibe una petición con:

  • id (usuario)

  • token (contraseña o API key)

  • host (equipo Windows destino)

  • query (consulta WMI a ejecutar)

 

Evolución del plugin en esta versión

El plugin ahora soporta dos métodos de consulta, seleccionables en la configuración (opconfig_use_wmic_server en opCommon.json):

a) Modo wmic_server

  • Se sigue usando la API REST.

{ "id": "usuario", "token": "clave/token", "host": "10.10.10.5", "query": "SELECT ... FROM CIM_DataFile ..." }

b) Modo wmic local

  • Ejecuta el binario /usr/local/nmis9/bin/wmic directamente desde el servidor Linux de NMIS/opConfig.

  • Usa credenciales usuario/contraseña/dominio para autenticarse en el host Windows.

  • Soporta autenticación Kerberos (--auth-type=krb5, --auth-spnego).

  • La salida del comando wmic ya viene en JSON, y el plugin la decodifica.

 

Beneficios de esta nueva versión del plugin

  • Más flexible: el administrador decide si usar wmic_server o wmic local.

  • Compatibilidad retroactiva: sigue soportando wmic_server con token, para no romper instalaciones existentes.

  • Menos dependencias externas: no obliga a instalar y mantener el wmic_server si no es necesario.