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
strictywarningspara validar código.Encode,Try::Tiny(manejo de errores contry/catch) yJSON::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).
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).
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_listy$file_map.
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).
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
wmiclocal, 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.
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
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.
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.
run_wmic_server_query:
Hace lo mismo, pero contra un servidor REST (
wmic_server) usandoMojo::UserAgent.Envía un POST con
{ id, token, host, query }.Devuelve JSON o un error HTTP.
process_configuration: toma el JSON generado encollect_configurationy 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) aYYYY-MM-DD HH:MM:SS.Devuelve:
derived_info: tabla para la interfaz.alerts: eventos a generar
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 ..."
}Se conecta al endpoint configurado, por defecto: http://127.0.0.1:2313/wmic
El resultado llega en JSON.
b) Modo wmic local
Ejecuta el binario
/usr/local/nmis9/bin/wmicdirectamente 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
wmicya 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_serverowmiclocal.Compatibilidad retroactiva: sigue soportando
wmic_servercon token, para no romper instalaciones existentes.Menos dependencias externas: no obliga a instalar y mantener el
wmic_serversi no es necesario.