Iniciando a tarefa agendada detectando a conexão do dispositivo USB

21

Eu sei que foi discutido que não é possível iniciar um aplicativo a partir de uma unidade USB na conexão devido a limitações de autorun (ou autoplay ??) no Win 7. Mas é possível criar uma tarefa agendada tendo um gatilho de tipo de evento. Certamente, deve haver um evento ocorrendo quando a unidade - ou qualquer outro dispositivo USB - estiver conectada.

Alguém tem a menor idéia de qual ID de Evento devo usar? Ou pelo menos que tipo de evento? Onde posso encontrar o evento no visualizador de eventos?

    
por gemisigo 07.12.2010 / 15:49

5 respostas

12

O segmento Agendador de Tarefas: Como sincronizar automaticamente minha unidade flash USB? tem essa resposta por um usuário chamado monotone, que usa o PowerShell junto com o Agendador de Tarefas:

I had the same question as you, and worked out something with powershell (windows built-in scripting) using techniques from the Scripting Guy Blog here and here. The script runs continuously as a background process, which you can start at system logon with task scheduler. The script will be notified whenever a new drive is plugged and then do something (here you configure the script rather than the task). Since it is basically paused while waiting for the next plugged drive, you should not find it takes up much resources. Here I go:

1) Start Powershell ISE, which can be found in your start menu under Accessories/Windows Powershell. 2) Copy paste the following into 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) You need to modify the script above to tell the script what drive to look for, and what to execute. The two lines to change are:

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

My usb hard drive named 'Mirror' is set as the Z: drive. You could just use if ($driveLabel -eq 'MyDiskLabel') if you didn't care about the letter.

start-process "Z:\sync.bat"

Path of whatever task you want to do. In my example, I have created a batch file on my USB drive which starts 3-4 backup tasks command lines.

4) When you're done, save your script somewhere (extension .ps1), then go create a task in Task Scheduler to have your script run in background. Mine looks like this:

  • Trigger: At log on
  • Action: Start a program
  • Program/script: powershell
  • Add arguments: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Voilà!

6) Extra stuff:

If you want your script window to be hidden, use these arguments:

  • Add arguments:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

If you want to output the script messages into a log file (that gets overwritten everytime the script starts, i.e. at log on), use the following task action:

  • Program/script: cmd
  • Add arguments:
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt"

Anytime you want to end the running hidden script, you can end the "Powershell" process in Task Manager.

The only downside is that nothing will run when you boot your computer with the drive already plugged in. (The script could be changed to perform a first check initially though, but I've had enough for today!)

    
por 26.11.2014 / 19:41
6

Como já expliquei em esta discussão (mas era sobre a execução de um programa quando uma unidade USB é removida), USB Remove com segurança , embora não seja gratuito, pode executar um programa quando alguns eventos sobre dispositivos USB são acionados:

Another USB Safely Remove feature that distinguishes it from similar software is starting any applications not only after connecting a device, but also before removing it. The autorun feature allows you to set up data backup before disconnecting a removable hard drive, to run Total Commander with the contents of the pen-drive, automatically unmount an encrypted TrueCrypt drive before disconnecting the USB media, etc.

Naturalmente, isso não responde totalmente à pergunta, pois não se trata de usar tarefas agendadas, mas o objetivo é o mesmo, eu acho, que é executar um programa específico quando um pen drive USB é conectado.

    
por 25.05.2011 / 14:09
5

Deve ser muito fácil usar o EventVwr.

  1. Encontre o evento que você deseja - Quando eu conectei um dispositivo de armazenamento em massa USB, ele acionou os seguintes eventos (na categoria de aplicativo): 20001, 20003, 7036 e alguns outros menos relevantes. Certifique-se de testar esses eventos em relação a outros eventos de dispositivos USB para evitar falsos positivos.

  2. clique com o botão direito do mouse no evento e clique em "Anexar tarefa a este evento" (relevante apenas no Windows Vista ou superior - para XP há o CLI EventTrigger), escolha "Iniciar um programa" e aponte para o script desejado para executar.

  3. Para passar para o script, os parâmetros do evento que você precisa dão uma olhada em este artigo . Nos eventos 20001 e 20003, você pode encontrar o caminho UNC para o novo armazenamento. Usando o utilitário Sysinternals Junction, você pode criar links para os caminhos UNC.

por 14.10.2013 / 15:46
2

Consegui que isso funcionasse: Eu encontrei o evento 1003 em logs de aplicativos e serviços, Microsoft-Windows-DriverFrameworks-UserMode para um telefone conectado ao usb

xml completo do 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>

E o filtro de eventos personalizados para minha tarefa:

<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>

Da mesma forma para uma unidade USB foi evento 2100, 2101, 2105, 2106
Para uma unidade 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&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 o evento 2101 acontece três vezes com tags "<request>" ligeiramente diferentes quando eu conecto meu pen drive:

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

Eu não tenho idéia do que isso significa, mas aqui está um filtro para apenas um deles para evitar vários gatilhos: (isso só será acionado para este drive 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&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>

Observe que o "e" comercial deve ter um escape como &amp;

    
por 19.08.2016 / 04:05
1

Como outros já mencionaram, parece que o Evento de log do sistema 7036 do Gerenciador de controle de serviços é o único evento que se correlaciona de maneira confiável com uma unidade USB sendo inserida. Eu verifiquei isso inserindo uma unidade USB e executando o seguinte comando powershell para listar todas as entradas do log de eventos de todas as fontes na última hora:

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

Infelizmente, o Evento 7036 é gerado toda vez que o Gerenciador de Controle de Serviços inicia ou para com êxito qualquer serviço, portanto, é necessária uma filtragem adicional.

A filtragem disponível na GUI do Visualizador de Eventos / Agendador de Tarefas é bastante básica e não permite qualquer filtragem nos dados do evento - ela só permite filtrar os metadados que, neste caso, não informam nada sobre qual serviço mudou de estado e para qual estado ele foi alterado. Isso é mantido em "param1" e "param2" do EventData. O filtro XPath a seguir pode, portanto, ser usado para capturar apenas o serviço relevante sendo iniciado:

<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>

De lá, você pode executar seu script, de preferência com alguma lógica adicional para verificar se a unidade USB que foi inserida é a que você está interessado.

    
por 02.11.2013 / 15:00