Inicio de la tarea programada detectando la conexión del dispositivo USB

Sé que se ha discutido que no es posible iniciar una aplicación de una unidad usb en la conexión debido a las limitaciones de autorun (o autoplay ??) en Win 7. Pero es posible crear una tarea programada con un tipo de evento disparador . Seguramente debe haber un evento ocurriendo cuando la unidad – o cualquier dispositivo USB, de hecho – está conectada.

¿Alguien tiene la menor idea de qué ID de evento debo usar? O al menos qué tipo de evento? ¿Dónde puedo encontrar el evento en el visor de eventos?

El hilo Programador de tareas: ¿Cómo sincronizar automáticamente mi unidad flash USB? Tiene esta respuesta por un usuario llamado monótono, que utiliza PowerShell junto con el programador de tareas:

Tuve la misma pregunta que usted, y trabajó algo con powershell (windows built-in scripting) utilizando técnicas de la Scripting Guy Blog aquí y aquí . La secuencia de comandos se ejecuta continuamente como un proceso de fondo, que puede iniciar en el inicio de sesión del sistema con el programador de tareas. La secuencia de comandos se notificará cada vez que una nueva unidad está conectada y luego hacer algo (aquí se configura el script en lugar de la tarea). Ya que básicamente se detiene mientras espera la siguiente unidad conectada, no debería encontrar que ocupa muchos recursos. Aquí voy:

1) Inicie Powershell ISE, que se puede encontrar en el menú de inicio bajo Accesorios / Windows PowerShell. 2) Copiar pega 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) Es necesario modificar el script anterior para indicar al script qué unidad buscar y qué ejecutar. Las dos líneas a cambiar son:

 if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror') 

Mi disco duro usb llamado 'Espejo' se establece como la unidad Z :. Usted podría apenas utilizar if ($driveLabel -eq 'MyDiskLabel') si usted no cuidó sobre la letra.

 start-process "Z:\sync.bat" 

Ruta de cualquier tarea que desee hacer. En mi ejemplo, he creado un archivo de hornada en mi impulsión del USB que comienza 3-4 líneas de comando de las tareas de la reserva.

4) Cuando haya terminado, guarde el script en algún lugar (extensión .ps1 ), luego vaya a crear una tarea en el Programador de tareas para que su secuencia de comandos se ejecute en segundo plano. Mina 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) Material adicional:

Si desea ocultar su ventana de script, utilice estos argumentos:

  • Añadir argumentos:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Si desea imprimir los mensajes de secuencia de comandos en un archivo de registro (que se sobrescribe cada vez que se inicia la secuencia de comandos, es decir, en el inicio de sesión), utilice la siguiente acción de tarea:

  • Programa / script: cmd
  • Añadir 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 nada se ejecutará cuando arranque su computadora con la unidad ya conectada. (El script podría ser cambiado para realizar un primer cheque inicialmente, aunque, pero he tenido suficiente para hoy!)

Como ya he explicado en esta discusión (pero se trata de ejecutar un programa cuando se elimina una unidad USB), USB Safely Remove , aunque no libre, puede ejecutar un programa cuando se desencadenan algunos eventos sobre dispositivos USB:

Otra característica de USB Safely Remove que lo distingue de un software similar es iniciar cualquier aplicación no sólo después de conectar un dispositivo , sino también antes de eliminarlo. La función de ejecución automática le permite configurar la copia de seguridad de datos antes de desconectar una unidad de disco duro extraíble, ejecutar Total Commander con el contenido de la pen drive, desmontar automáticamente una unidad TrueCrypt cifrada antes de desconectar los medios USB, etc.

Introduzca aquí la descripción de la imagen

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.

Debería ser bastante fácil usar EventVwr.

  1. Encuentre el evento que desea – Cuando conecté un dispositivo de almacenamiento masivo USB, activó los siguientes eventos (bajo categoría de aplicación): 20001, 20003, 7036 y otros menos relevantes. Asegúrese de probar esos eventos contra otros eventos de dispositivos USB para evitar falsos positivos.

  2. Haga clic con el botón derecho del ratón en el evento y haga clic en "Adjuntar tarea a este evento" (relevante sólo en Windows Vista o superior – para XP hay CLI EventTrigger), seleccione "Iniciar un programa" y apúntelo al script que desea ejecutar.

  3. Para pasar a la secuencia de comandos los parámetros de evento que necesita tener un vistazo en este artículo . Bajo los eventos 20001 y 20003 puede encontrar la ruta UNC al nuevo almacenamiento. Utilizando la utilidad Sysinternals Junction puede crear vínculos a las rutas UNC.

Pude conseguir esto para trabajar: Encontré el acontecimiento 1003 en registros de las aplicaciones y de los servicios, Microsoft-Windows-DriverFrameworks-UserMode para un teléfono enchufado a usb

Xml completo del evento:

 - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> - <System> <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" /> <EventID>1003</EventID> <Version>1</Version> <Level>4</Level> <Task>17</Task> <Opcode>1</Opcode> <Keywords>0x8000000000000000</Keywords> <TimeCreated SystemTime="2016-08-19T01:42:06.292278900Z" /> <EventRecordID>17516</EventRecordID> <Correlation /> <Execution ProcessID="456" ThreadID="2932" /> <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> <Computer>5CG6070VFK-W7.nikonprecision.com</Computer> <Security UserID="S-1-5-18" /> </System> - <UserData> - <UMDFDriverManagerHostCreateStart lifetime="{AFEC92AD-6015-4AB4-86AE-F34CEE06A977}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event"> <HostGuid>{193a1820-d9ac-4997-8c55-be817523f6aa}</HostGuid> <DeviceInstanceId>USB.VID_04E8&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&0000</DeviceInstanceId> </UMDFDriverManagerHostCreateStart> </UserData> </Event> 

Y el filtro de eventos personalizados para mi tarea:

 <QueryList> <Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational"> <Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=1003]] and *[UserData[UMDFDriverManagerHostCreateStart[DeviceInstanceId="USB.VID_04E8&amp;PID_6860&amp;MS_COMP_MTP&amp;SAMSUNG_ANDROID.6&amp;3400EB54&amp;1&amp;0000"]]]</Select> </Query> </QueryList> 

Del mismo modo para una unidad USB fue el evento 2100, 2101, 2105, 2106
Para una unidad USB específica:

 - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> - <System> <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" /> <EventID>2101</EventID> <Version>1</Version> <Level>4</Level> <Task>37</Task> <Opcode>2</Opcode> <Keywords>0x8000000000000000</Keywords> <TimeCreated SystemTime="2016-08-19T01:52:37.922289600Z" /> <EventRecordID>17662</EventRecordID> <Correlation /> <Execution ProcessID="10956" ThreadID="11892" /> <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> <Computer>5CG6070VFK-W7.nikonprecision.com</Computer> <Security UserID="S-1-5-19" /> </System> - <UserData> - <UMDFHostDeviceRequest instance="WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" lifetime="{4493DBFB-81E8-4277-933D-955C4DDDD482}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event"> - <Request major="27" minor="20"> <Argument>0x0</Argument> <Argument>0x141b</Argument> <Argument>0x0</Argument> <Argument>0x0</Argument> </Request> <Status>0</Status> </UMDFHostDeviceRequest> </UserData> </Event> 

Parece que el evento 2101 ocurre 3 veces con etiquetas "<request>" ligeramente diferentes cuando conecto mi unidad USB:

 <Request major="27" minor="20"> <Request major="27" minor="9"> <Request major="27" minor="0"> 

No tengo ni idea de lo que esto significa, pero aquí es un filtro para sólo uno de ellos para evitar múltiples desencadenantes: (esto sólo se disparará para esta unidad USB específico)

 <QueryList> <Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational"> <Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=2101]] and *[UserData[UMDFHostDeviceRequest[@instance="WPDBUSENUMROOT\UMB\2&amp;37C186B&amp;0&amp;STORAGE#VOLUME#_??_USBSTOR#DISK&amp;VEN_SANDISK&amp;PROD_SANDISK_CRUZER&amp;REV_8.02#0774230A28933B7E&amp;0#" and Request[@major="27" and @minor="20"]]]]</Select> </Query> </QueryList> 

Tenga en cuenta que los signos comerciales deben escaparse como &amp;

Como otros han mencionado, parece que el registro de sistema Evento 7036 desde el Administrador de control de servicios es el único evento que se correlaciona de forma fiable con una unidad USB que se inserta. Comprobé esto insertando una unidad USB y ejecutando el siguiente comando powershell para listar todas las entradas del registro de eventos de todas las fuentes en la última hora:

 get-winevent | where {$_.timecreated -ge (get-date) - (new-timespan -hour 1)} 

Desafortunadamente, el Evento 7036 se genera cada vez que el Administrador de Control de Servicio inicia o detiene con éxito cualquier servicio, por lo que se requiere filtrado adicional.

El filtrado disponible en la GUI de Event Viewer / Task Scheduler 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 acerca de qué servicio tiene Estado cambiado y en qué estado ha cambiado. Esto se mantiene en "param1" y "param2" del EventData. Por lo tanto, el siguiente filtro XPath puede utilizarse para capturar sólo el inicio del servicio relevante:

 <QueryList> <Query Id="0" Path="System"> <Select Path="System">*[System[Provider[@Name='Service Control Manager'] and (Level=4 or Level=0) and (band(Keywords,36028797018963968)) and (EventID=7036)]] and *[EventData[ Data[@Name="param1"]="Portable Device Enumerator Service" and Data[@Name="param2"]="running" ] ] </Select> </Query> </QueryList> 

Desde allí se puede ejecutar su script, idealmente con alguna lógica adicional en el lugar para comprobar que la unidad USB que se ha insertado es la que le interesa.

Intereting Posts