Tenía la misma pregunta que tú, y resolví algo con powershell (scripting integrado de Windows) usando técnicas del Scripting Guy Blog aquí y aquí . El script se ejecuta continuamente como un proceso en segundo plano, que puede comenzar en el inicio de sesión del sistema con el programador de tareas. El script será notificado cada vez que se conecte una nueva unidad y luego haga algo (aquí configura el script en lugar de la tarea). Dado que está básicamente en pausa mientras espera la próxima unidad conectada, no debería encontrar que ocupa muchos recursos. Aquí voy:
1) Inicie Powershell ISE, que se puede encontrar en su menú de inicio en Accesorios / Windows Powershell. 2) Copie y pegue lo siguiente en Powershell:
#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "Z:\sync.bat"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange
3) Debe modificar la secuencia de comandos anterior para indicarle qué unidad debe buscar y qué ejecutar. Las dos líneas para cambiar son:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Mi disco duro USB llamado 'Mirror' está configurado como la unidad Z:. Podrías usarlo if ($driveLabel -eq 'MyDiskLabel')
si no te importara la carta.
start-process "Z:\sync.bat"
Ruta de cualquier tarea que desee hacer. En mi ejemplo, he creado un archivo por lotes en mi unidad USB que inicia 3-4 líneas de comando de tareas de copia de seguridad.
4) Cuando haya terminado, guarde su script en algún lugar (extensión .ps1
), luego vaya a crear una tarea en el Programador de tareas para que su script se ejecute en segundo plano. El mío se ve así:
- Activador: al iniciar sesión
- Acción: iniciar un programa
- Programa / script: powershell
- Añadir argumentos:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) ¡Voilà!
6) Cosas extra:
Si desea que su ventana de script esté oculta, use estos argumentos:
- Añadir argumentos:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Si desea enviar los mensajes de script a un archivo de registro (que se sobrescribe cada vez que se inicia el script, es decir, al iniciar sesión), utilice la siguiente acción de tarea:
- Programa / script: cmd
- Agregar argumentos:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Cada vez que desee finalizar el script oculto en ejecución, puede finalizar el proceso "Powershell" en el Administrador de tareas.
El único inconveniente es que no se ejecutará nada cuando inicie su computadora con la unidad ya conectada.
$newEvent.SourceEventArgs.NewEvent
los eventos de su interés en.Como ya expliqué en esta discusión (pero se trataba de ejecutar un programa cuando se extrae una unidad USB), USB Safely Remove , aunque no es gratuito, puede ejecutar un programa cuando se activan algunos eventos sobre dispositivos USB:
Por supuesto, esto no responde completamente a la pregunta, ya que no se trata de usar tareas programadas, pero el objetivo es el mismo, creo, que es ejecutar un programa específico cuando se conecta una memoria USB.
fuente
Debería ser bastante fácil usar EventVwr.
Encuentre el evento que desea: cuando conecté un dispositivo de almacenamiento masivo USB, se activaron los siguientes eventos (en la categoría de aplicación): 20001, 20003, 7036 y algunos otros menos relevantes. Asegúrese de probar esos eventos contra otros eventos de dispositivos USB para evitar falsos positivos.
haga clic derecho en el evento y haga clic en "Adjuntar tarea a este evento" (relevante solo en Windows Vista o superior, para XP hay CLI EventTrigger), elija "Iniciar un programa" y apúntelo al script que desea ejecutar.
Para pasar al script los parámetros del evento que necesita, eche un vistazo en este artículo . En los eventos 20001 y 20003 puede encontrar la ruta UNC al nuevo almacenamiento. Con la utilidad Sysinternals Junction puede crear enlaces a las rutas UNC.
fuente
Pude hacer que esto funcionara: encontré el evento 1003 en registros de aplicaciones y servicios, Microsoft-Windows-DriverFrameworks-UserMode para un teléfono conectado a usb
XML completo del evento:
Y el filtro de eventos personalizado para mi tarea:
Del mismo modo para una unidad USB, fue el evento 2100, 2101, 2105, 2106
Para una unidad USB específica:
Parece que el evento 2101 ocurre 3 veces con
"<request>"
etiquetas ligeramente diferentes cuando conecto mi unidad usb:No tengo idea de lo que esto significa, pero aquí hay un filtro para solo uno de ellos para evitar disparadores múltiples: (esto solo se disparará para esta unidad USB específica)
Tenga en cuenta que los símbolos de unión deben escapar como
&
fuente
Como otros han mencionado, parece que el Evento de registro del sistema 7036 del Administrador de control de servicios es el único evento que se correlaciona de manera confiable con una unidad USB que se inserta. Verifiqué esto insertando una unidad USB y ejecutando el siguiente comando powershell para enumerar todas las entradas del registro de eventos de todas las fuentes en la última hora:
Desafortunadamente, el Evento 7036 se genera cada vez que Service Control Manager inicia o detiene con éxito cualquier servicio, por lo que se requiere un filtrado adicional.
El filtrado disponible en la GUI del Visor de eventos / Programador de tareas es bastante básico y no permite ningún filtrado en los datos del evento; solo le permite filtrar los metadatos que en este caso no le dicen nada sobre qué servicio tiene estado cambiado y a qué estado ha cambiado. Eso se lleva a cabo en "param1" y "param2" de EventData. Por lo tanto, el siguiente filtro XPath se puede utilizar para capturar solo el servicio relevante que se está iniciando:
Desde allí, puede ejecutar su secuencia de comandos, idealmente con una lógica adicional para verificar que la unidad USB que se ha insertado es la que le interesa.
fuente
Encontré un evento mejor (IMO) en el registro de eventos ubicado en Aplicaciones y registros de servicio-Microsoft-Windows-Ntfs_Operational. Eventid 4. Se ve así:
ID. De suceso 4 El volumen NTFS se ha montado correctamente.
A partir de eso, puede crear un activador de tareas programadas y filtrar por nombre de volumen o etiqueta. Este evento se encontró en un cuadro de Windows Server 2019, sin embargo, por alguna razón, no lo veo en mi escritorio de Windows 10 (1809). Puede ser un evento solo de servidor ...
fuente