USB conectados
Cada vez que un pendrive se conecta, Windows apunta su fabricante, modelo y número de serie. El rastro queda en el registro, en el log de instalación y en los eventos del propio equipo. Formatearlo no lo borra: la información se guarda en el ordenador, no en el pendrive.
El caso
Un informe interno aparece colgado fuera. Nadie subió nada a la nube, nadie envió correos sospechosos. La hipótesis más razonable es un pendrive: alguien se lo llevó. La pregunta es cuál, cuándo entró en el equipo y qué sesión lo usó. En los cajones hay cuatro pendrives sueltos, ninguno con pegatina. Uno de ellos tiene que ser el que entró en el equipo. Para saberlo no hace falta mirar el pendrive: hay que mirar el equipo.
La herramienta
Windows reparte el historial de los USB en cuatro sitios complementarios:
| Dónde | Qué guarda |
|---|---|
HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR | Fabricante, modelo y número de serie de cada pendrive que ha visto el equipo. |
C:\Windows\INF\setupapi.dev.log | La primera vez que Windows instaló los drivers del dispositivo, con fecha y hora. |
Canal Microsoft-Windows-Partition/Diagnostic (evento 1006) | Cada conexión del disco, con su número de serie y tamaño. |
MountedDevices y MountPoints2 del registro | Qué letra tuvo el pendrive y qué usuario lo tuvo montado. |
Cómo se usa
Todo se consulta desde PowerShell como administrador. No hace falta software extra: Windows ya trae lo necesario para listar los pendrives conocidos, leer el log de instalación y filtrar los eventos de conexión. Para los casos reales, en la sección final están los pasos que se usan sobre una copia del equipo.
Qué revela
Cruzando las fuentes, se puede reconstruir la vida de un pendrive en ese equipo:
| Pregunta | Dónde está la respuesta |
|---|---|
| ¿Qué dispositivo era? | Fabricante y modelo en USBSTOR y en el evento 1006. |
| ¿Es este pendrive? | El número de serie, en USBSTOR y en el evento 1006. |
| ¿Cuándo se conectó por primera vez? | setupapi.dev.log y la fecha de primera instalación. |
| ¿Cuándo por última vez? | Fechas de última conexión y desconexión, y el último evento 1006. |
| ¿Qué letra tuvo? | MountedDevices. |
| ¿Qué usuario lo usó? | MountPoints2 en el NTUSER.DAT de cada usuario. |
El detalle que da nombre al capítulo
El número de serie se queda en el ordenador, no en el pendrive. Formatear el dispositivo, borrar sus archivos o cambiarle el nombre no cambia nada de lo que el equipo ya apuntó. Si el pendrive aparece en un cajón, su serie se compara con la del registro y la pregunta queda respondida.
Con PowerShell
Las consultas al registro, al log y a los eventos están abajo plegadas: ábrelas cuando las necesites.
Ver comandos de PowerShell
Qué pendrives conoce este equipo
En PowerShell como administrador. Get-PnpDevice lista también los dispositivos que ya no están conectados, y sus propiedades dan las tres fechas clave sin tener que leer el registro a mano:
function Get-UsbHistorial {
Get-PnpDevice -Class DiskDrive -ErrorAction SilentlyContinue |
Where-Object InstanceId -like 'USBSTOR*' | ForEach-Object {
$id = $_.InstanceId
$props = Get-PnpDeviceProperty -InstanceId $id -ErrorAction SilentlyContinue
$p = { param($k) ($props | Where-Object KeyName -eq $k).Data }
[pscustomobject]@{
Dispositivo = $_.FriendlyName
Serie = ($id -split '\\')[-1]
PrimeraConexion = & $p 'DEVPKEY_Device_FirstInstallDate'
UltimaConexion = & $p 'DEVPKEY_Device_LastArrivalDate'
UltimaDesconexion = & $p 'DEVPKEY_Device_LastRemovalDate'
ConectadoAhora = $_.Present
}
}
}
Get-UsbHistorial | Sort-Object UltimaConexion -Descending | Format-Table -AutoSize
La primera vez, según el log de instalación
Select-String -Path C:\Windows\INF\setupapi.dev.log -Pattern 'Device Install.*USBSTOR' -Context 0,1 |
ForEach-Object { $_.Line; $_.Context.PostContext; '' }
Cada conexión, según los eventos
El evento 1006 aparece en Windows 10 y 11 cada vez que se conecta un disco. Carga la función que convierte los datos del evento en campos con nombre (la misma del capítulo 01):
function Get-EventData {
param([Parameter(ValueFromPipeline)]$Evento)
process {
$xml = [xml]$Evento.ToXml()
$datos = [ordered]@{ Hora = $Evento.TimeCreated; Id = $Evento.Id }
foreach ($d in $xml.Event.EventData.Data) { $datos[$d.Name] = $d.'#text' }
[pscustomobject]$datos
}
}
Get-WinEvent -LogName 'Microsoft-Windows-Partition/Diagnostic' -FilterXPath '*[System[EventID=1006]]' -ErrorAction SilentlyContinue |
Get-EventData |
Select-Object Hora, Manufacturer, Model, SerialNumber, Capacity |
Format-Table -AutoSize
Qué usuario lo usó
Cada volumen tiene un identificador (GUID). MountedDevices lo relaciona con el dispositivo, y MountPoints2 de cada usuario dice quién lo tuvo montado:
# GUID de volumen de los dispositivos USB que ha visto el equipo
(Get-Item 'HKLM:\SYSTEM\MountedDevices').Property | Where-Object { $_ -like '\??\Volume*' } | ForEach-Object {
$bytes = (Get-ItemProperty 'HKLM:\SYSTEM\MountedDevices').$_
$texto = [Text.Encoding]::Unicode.GetString($bytes)
if ($texto -match 'USBSTOR') { [pscustomobject]@{ Volumen = $_; Dispositivo = $texto } }
} | Format-List
# Volúmenes montados por el usuario actual
Get-ChildItem 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2' |
Where-Object PSChildName -like '{*}' | Select-Object PSChildName
En una investigación: sobre una copia
En un caso real no se trabaja en el equipo vivo. Se extraen de la imagen de disco las colmenas SYSTEM, SOFTWARE y el NTUSER.DAT de cada usuario, junto a setupapi.dev.log y los .evtx, y se analizan con Registry Explorer o RECmd:
# RECmd con el lote de reglas de Kroll, que incluye los artefactos USB
RECmd.exe -d C:\evidencia\registro --bn BatchExamples\Kroll_Batch.reb --csv C:\salida
Practica
Hazlo en una máquina virtual con paso de USB (Proxmox, Hyper-V o VirtualBox lo permiten) y con pendrives que no contengan nada tuyo.
Ver los 4 ejercicios
Conecta un pendrive, úsalo tres o cuatro veces en días distintos y lanza Get-UsbHistorial. Compáralo con setupapi.dev.log y con los eventos 1006.
¿Coinciden las horas con tus notas? ¿Cuál de las fuentes te da la primera conexión y cuál la última?
Formatea el pendrive (incluso cambiando el sistema de archivos) y conéctalo otra vez. Vuelve a lanzar la consulta.
¿Ha cambiado el número de serie? ¿Y el nombre que aparece en Windows Portable Devices?
Crea una segunda cuenta de usuario, inicia sesión con ella, conecta el pendrive y abre una carpeta. Vuelve a tu cuenta y mira el MountedDevices del sistema y los MountPoints2 de los dos usuarios.
¿En el MountPoints2 de qué usuario aparece el volumen? ¿Qué pasa si lo buscas desde tu sesión?
Exporta a un archivo .reg la clave HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR y ábrela con Registry Explorer, o apunta RECmd a una copia de las colmenas.
¿Encuentras en Properties de USBSTOR las mismas fechas que te dio PowerShell?