Device Activity Monitor (DAM) es una solución de monitoreo de actividad de dispositivos externos (USB, discos, móviles, tabletas) diseñada para estaciones de trabajo con Windows. Construida sobre la plataforma moderna de .NET (C# 10 / .NET 8+), esta arquitectura prioriza la resiliencia, la escalabilidad y el cumplimiento de los principios SOLID y patrones como CQRS (parcial).
El objetivo principal es capturar toda la actividad de E/S de ficheros (copia, borrado, capacidad) de un dispositivo externo, incluso ante la indisponibilidad de la Web API central de almacenamiento.
- 🛡️ Device Activity Monitor (DAM)
- Monitoreo Resiliente de Dispositivos Externos para Entornos Empresariales
- 🧭 Tabla de Contenido
- 🏛️ Arquitectura de la Solución (DAM)
- 🌊 Diagrama de Flujo y Relación de Monitoreo
- ⚙️ Características Técnicas
- 🔧 Prerequisitos
- 🚀 Guía de Instalación y Despliegue
- 1. Clonar el Repositorio
- 2. Compilar la Solución
- 3. Despliegue del Servicio de Windows
- 📦 Flujo de Despliegue y Distribución
- 3.1. ⚙️ Fase 1: Generación del Paquete de Distribución (Para Desarrolladores)
- 3.2. 🛠️ Fase 2: Instalación del Servicio (Para Usuarios Finales/Administradores)
- Contenido del Archivo
Install-Service.cmd - 4. Ejecutar la Web API (Inicialmente)
- 📋 Métricas Recolectadas
- 📚 Recursos y Documentación Especializada
La solución se estructura en capas bien definidas, siguiendo principios de diseño limpio. Esto facilita la separación de responsabilidades, el mantenimiento, y por supuesto, el testing del sistema.
| Proyecto | Tipo | 🎯 Responsabilidad Principal | Tecnologías Clave |
|---|---|---|---|
DAM.Host.WindowsService |
Host/Worker | Recolección de datos, monitoreo de eventos de hardware (WMI) y persistencia resiliente. | BackgroundService, WMI, Patrón Watcher. |
DAM.Presentation.WebAPI |
Web API | Punto de entrada para la persistencia remota de datos (API) y exposición de datos de monitoreo. | ASP.NET Core, EF Core. |
DAM.Presentation.BlazorApp |
Frontend | Interfaz de usuario para visualizar en tiempo real el estado y el historial de actividad de los dispositivos. | Blazor Web App (Interactive/SSR). |
DAM.Infrastructure |
Infraestructura | Implementación de EF Core (SQLite), Repositorios y la Lógica de Resiliencia (API vs. BD local). | EF Core, HttpClient. |
DAM.Core |
Dominio | Definiciones de entidades, DTOs e interfaces de contratos (SOLID - DIP). | C#, Interfaces. |
DAM.Tests.Monitoring |
Pruebas Automatizadas | Verificación de la lógica de negocio, integración con datos y simulación del flujo completo del servicio Worker. |
XUnit, Moq, EF Core In-Memory. |
Este diagrama utiliza el tipo Flowchart (Gráfico de Flujo) y muestra la secuencia de eventos (conexión del dispositivo) y las relaciones entre las capas de la aplicación (Host, Core, Infrastructure).
graph TD
subgraph DAM.Host.WindowsService [HOST DE SERVICIO]
W(Worker)
DM(IDeviceMonitor: WMI)
W --> |1. Inicia monitoreo| DM
DM -- Event: DeviceConnected(E:\) --> W
end
subgraph Monitoring [MÉCANISMO DE MONITOREO]
W -- 2. Crea instancia por unidad --> DAW(DeviceActivityWatcher: E:\)
DAW --> |Asigna propiedades| DA(DeviceActivity)
DAW --> FSW(FileSystemWatcher: E:\)
FSW -- Event: Created/Deleted --> DAW
DAW -- 3. Registra cambios en |MegabytesCopied/Deleted| --> DA
end
subgraph WindowsOS [SISTEMA OPERATIVO]
OS[Núcleo de Windows / Hardware]
click OS "Consulta WMI para SN/Modelo"
DM -- Consulta SO --> OS
FSW -- Eventos I/O --> OS
end
subgraph WorkerFlow [FLUJO DE TRABAJO DEL WORKER]
W -- Event: DeviceDisconnected(E:\) --> W_Handler[HandleDeviceDisconnected]
W_Handler -- 4. Detiene y Finaliza --> DAW
DAW -- Event: ActivityCompleted --> W_Persist[HandleActivityCompleted]
end
subgraph Infrastructure [INFRAESTRUCTURA Y PERSISTENCIA]
W_Persist -- 5. Llama a Persistencia Resiliente --> IAS(IActivityStorageService)
subgraph ResilientStorage [ResilientStorageService]
IAS -- Verifica disponibilidad --> IASC(IApiStatusChecker)
IASC -- API Inactiva (Fallo) --> LDS(LocalDbStorageService)
LDS -- 6. Llama a IActivityRepository --> IAR(IActivityRepository)
end
subgraph DataAccess [Entity Framework Core]
IAR -- Implementación: EF Core --> DbC(DeviceActivityDbContext)
DbC -- Mapea a tabla --> TDA[Tabla: DeviceActivities]
end
IAR -- 7. Guarda |DA| en --> DbC
DbC --> TDA
DA --> TDA
end
W --> W_Handler
W_Handler --> IAS
IAS --> IAR
IAR --> DbC
style W fill:#CCFFFF,stroke:#000000,stroke-width:2px
style DM fill:#C0C0C0,stroke:#000000
style DAW fill:#FFFF99,stroke:#000000,stroke-width:2px
style FSW fill:#FFFF99
style DA fill:#F08080
style W_Persist fill:#CCFFFF
style IAS fill:#90EE90,stroke:#000000,stroke-width:2px
style IASC fill:#90EE90
style LDS fill:#90EE90
style IAR fill:#B0C4DE,stroke:#000000,stroke-width:2px
style DbC fill:#ADD8E6
style TDA fill:#ADD8E6
- Monitoreo de Bajo Nivel: Uso de WMI (Windows Management Instrumentation) para detectar eventos de inserción y remoción de dispositivos.
- Aislamiento: Cada dispositivo conectado obtiene un objeto
DeviceActivityWatcherautónomo para monitorear sus operaciones de E/S a través deFileSystemWatcher. - Resiliencia de Persistencia: El servicio es capaz de conmutar automáticamente entre API Remota y SQLite Local si la Web API no está disponible (mecanismo Circuit Breaker simple).
- Auto-Recuperación del Servicio: Configuración del servicio de Windows a través de PowerShell para garantizar el reinicio automático tras cualquier detención o fallo.
- .NET SDK 8.0 o Superior: Para compilar y ejecutar los proyectos.
- Windows OS: Requerido para el funcionamiento de WMI y el servicio de Windows.
- PowerShell 5.1+: Necesario para ejecutar el script de despliegue.
git clone https://github.com/potlitel/DeviceActivityMonitor.git
cd DeviceActivityMonitordotnet buildEl despliegue ha sido refactorizado para utilizar un Paquete de Distribución (ZIP de Publicación), lo que simplifica la instalación para el usuario final a un único paso.
El proceso se divide en dos fases:
- Generación del Paquete (Lado del Desarrollador): Utilizando el script de empaquetado.
- Instalación (Lado del Usuario Final/Administrador): Utilizando el paquete generado.
El script Create-Release.ps1 automatiza la publicación del proyecto .NET, copia el script de despliegue necesario y empaqueta todo en un único archivo ZIP listo para ser distribuido.
-
Ubicación: Asegúrate de que
Create-Release.ps1se encuentre en el directorio raíz de la solución. -
Ejecución: Abre PowerShell en esa ubicación y ejecuta el script:
.\Create-Release.ps1 -
Resultado: El script creará una carpeta llamada
Releasesen la raíz de la solución, y dentro, el archivo ZIP con la nomenclatura:[NombreProyecto]-Release-[FechaHora].zipDebes obtener una salida similar a la siguiente:
.\Create-Release.ps1 1. Publicando proyecto 'DAM.Host.WindowsService'... Restore complete (1.7s) DAM.Core net10.0 succeeded (0.3s) → DAM.Core\bin\Release\net10.0\DAM.Core.dll DAM.Infrastructure net10.0 succeeded (0.4s) → DAM.Infrastructure\bin\Release\net10.0\DAM.Infrastructure.dll DAM.Host.WindowsService net10.0 win-x64 succeeded (1.6s) → bin\Release\PublishTemp\ Build succeeded in 5.3s 2. Copiando script de despliegue ajustado... 3. Generando archivo de notas de release... 4. Creando paquete de despliegue ZIP... 5. Aplicando política de retención (manteniendo los últimos 5 releases)... -> Número de releases menor o igual al límite. No se requiere limpieza. ✅ ¡Paquete de Despliegue Listo! Ruta del paquete: C:\Users\potli\OneDrive\Documentos\Alexis-Cuba\DeviceActivityMonitor\Releases\DAM.Host.WindowsService-Release-20251213-103545.zip Instrucción para el usuario: Descomprima el ZIP y ejecute 'Install-Service.ps1' como Administrador.
Una vez que se tiene el paquete ZIP, la instalación es sencilla y directa.
-
Descomprimir el Paquete: Descomprime el archivo ZIP de publicación en la ubicación de tu preferencia (ej.
C:\Instalacion\). -
Ejecutar el Instalador: Dentro de la carpeta descomprimida, localiza el script renombrado
Install-Service.ps1. -
Ejecutar como Administrador: Haz clic derecho en
Install-Service.ps1y selecciona "Ejecutar con PowerShell".⚠️ Nota: Aparecerá la ventana del Control de Cuentas de Usuario (UAC). Debes hacer clic en "Sí" para permitir que el script se ejecute con permisos elevados. -
Monitorear y Finalizar: El script se ejecutará, publicará el servicio de Windows y lo iniciará automáticamente, mostrando el mensaje de éxito:
✅ ¡Despliegue Completado y Servicio Iniciado Correctamente!
@echo off
REM --- CONFIGURACIÓN DE RUTAS ---
:: Define el nombre del script de PowerShell
set "SCRIPT_NAME=Deploy-Service.ps1"
:: RUTA A DONDE ESTÁ EL PROYECTO .NET CORE
:: 📌 EJEMPLO: Si la solución está en 'C:\SourceCode\MiSolucion'
set "PROJECT_PATH=C:\SourceCode\MiSolucion\DAM.Host.WindowsService"
:: RUTA DONDE SE INSTALARÁ EL SERVICIO (Usualmente Program Files)
:: 📌 EJEMPLO: La carpeta donde residirá el ejecutable final
set "DEPLOY_PATH=C:\Program Files\DeviceActivityMonitor"
REM ------------------------------
echo.
echo =======================================================
echo Despliegue de Device Activity Monitor
echo =======================================================
echo.
echo El proceso de instalación iniciará en una nueva ventana.
echo NOTA: Debe aceptar el dialogo de Administrador (UAC) para continuar.
echo.
pause
:: Comando para ejecutar el script de PowerShell con privilegios de Administrador (RunAs)
powershell -Command "Start-Process -FilePath 'powershell.exe' -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File \"%~dp0%SCRIPT_NAME%\" -ProjectPath \"%PROJECT_PATH%\" -DeployPath \"%DEPLOY_PATH%\"' -Verb RunAs"
if %ERRORLEVEL% NEQ 0 (
echo.
echo ❌ ERROR: La instalación fue cancelada o no se pudo elevar.
pause > nul
) else (
echo.
echo ✅ Despliegue solicitado. Verifique la nueva ventana de PowerShell para el resultado.
pause > nul
)Para probar el mecanismo resiliente, es recomendable iniciar la API:
cd DAM.Presentation.WebAPI
dotnet runEl DeviceActivityWatcher registra meticulosamente la siguiente información por sesión de conexión:
-
Información básica: Modelo, Número de Serie, Capacidad.
-
Tiempos:
InsertedAt,ExtractedAt,TimeInserted. -
Métricas de E/S: Megabytes copiados y borrados.
-
Capacidad: Capacidad disponible al insertarse y al extraerse.
-
Detalle: Listado de ficheros copiados y borrados.
-
Eventos especiales (ej: formateo, a ser implementado).
Esta sección contiene enlaces directos a la documentación detallada y a los manuales técnicos esenciales para comprender a fondo el proyecto.
Profundiza en cómo garantizamos la calidad y la fiabilidad de nuestro código.
| Documento | 🎯 Enfoque Principal | Enlace Rápido |
|---|---|---|
| Estrategia de Pruebas | Cobertura de la lógica de negocio, integración con EF Core, y flujo End-to-End (E2E) del Worker Service. |
Ir a la Documentación Completa |
¡Las contribuciones son bienvenidas! Si deseas ayudar a mejorar este proyecto, puedes hacerlo siguiendo estos pasos:
- Haz un fork del repositorio.
- Crea una nueva rama con tu feature o corrección:
git checkout -b nombre-de-tu-rama - Realiza tus cambios y realiza commits claros y descriptivos.
- Envía un pull request describiendo detalladamente tus modificaciones.
Por favor, asegúrate de que tu código sigue las buenas prácticas, y si haces mejoras significativas, considera incluir pruebas o documentación adicional.
Este proyecto está bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.
¡Gracias por visitar y usar este proyecto! ✨
Si tienes dudas, sugerencias o quieres contribuir, no dudes en abrir un issue 📥 o contactarme directamente:
- GitHub: potlitel 👨💻
- Email: potlitel@gmail.com ✉️
¡Espero tus aportes y comentarios! 💬😊