Eu tinha a mesma pergunta que você e resolvi algo com o PowerShell (script interno do Windows) usando técnicas do Scripting Guy Blog aqui e aqui . O script é executado continuamente como um processo em segundo plano, que você pode iniciar no logon do sistema com o planejador de tarefas. O script será notificado sempre que uma nova unidade for conectada e, em seguida, faça alguma coisa (aqui você configura o script em vez da tarefa). Como está basicamente em pausa enquanto aguarda a próxima unidade conectada, você não deve encontrar muitos recursos. Aqui vou eu:
1) Inicie o Powershell ISE, que pode ser encontrado no menu Iniciar em Acessórios / Windows Powershell. 2) Copie e cole o seguinte no 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) Você precisa modificar o script acima para informar ao script qual unidade procurar e o que executar. As duas linhas a serem alteradas são:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Meu disco rígido USB chamado 'Mirror' é definido como Z: drive. Você poderia usar if ($driveLabel -eq 'MyDiskLabel')
se não se importasse com a carta.
start-process "Z:\sync.bat"
Caminho de qualquer tarefa que você deseja executar. No meu exemplo, criei um arquivo em lotes na minha unidade USB que inicia de 3 a 4 linhas de comando das tarefas de backup.
4) Quando terminar, salve seu script em algum lugar (extensão .ps1
) e, em seguida, crie uma tarefa no Agendador de Tarefas para que seu script seja executado em segundo plano. O meu fica assim:
- Disparador: no logon
- Ação: iniciar um programa
- Programa / script: powershell
- Adicione argumentos:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) Coisas extras:
Se você deseja que sua janela de script fique oculta, use estes argumentos:
- Adicione argumentos:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Se você deseja exibir as mensagens de script em um arquivo de log (que é substituído sempre que o script é iniciado, ou seja, no logon), use a seguinte ação da tarefa:
- Programa / script: cmd
- Adicionar argumentos:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Sempre que você quiser finalizar o script oculto em execução, poderá finalizar o processo "PowerShell" no Gerenciador de Tarefas.
A única desvantagem é que nada será executado quando você inicializar o computador com a unidade já conectada. (O script pode ser alterado para executar uma primeira verificação inicialmente, mas eu já tive o suficiente por hoje!)
$newEvent.SourceEventArgs.NewEvent
para os eventos que você está interessado.Como já expliquei nesta discussão (mas tratava-se de executar um programa quando uma unidade USB é removida), o USB Safely Remove , embora não seja gratuito, pode executar um programa quando alguns eventos sobre dispositivos USB são acionados:
Obviamente, 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 dispositivo USB estiver conectado.
fonte
Deve ser bastante fácil usar o EventVwr.
Encontre o evento que você deseja - Quando 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. Teste esses eventos com outros eventos de dispositivos USB para evitar falsos positivos.
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 existe o CLI EventTrigger), escolha "Iniciar um programa" e aponte-o para o script que deseja executar.
Para passar para o script os parâmetros do evento, consulte 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.
fonte
Consegui fazer isso funcionar: Encontrei o evento 1003 nos logs de aplicativos e serviços, Microsoft-Windows-DriverFrameworks-UserMode para um telefone conectado a usb
XML completo do evento:
E o filtro de evento personalizado para minha tarefa:
Da mesma forma, para uma unidade USB, foi o evento 2100, 2101, 2105, 2106.
Para uma unidade USB específica:
Parece que o evento 2101 acontece 3 vezes com
"<request>"
tags ligeiramente diferentes quando eu conecto minha unidade USB:Não tenho idéia do que isso significa, mas aqui está um filtro para apenas um deles evitar vários disparos: (isso só será acionado para esta unidade USB específica)
Observe que os e comerciais devem ser escapados como
&
fonte
Como já mencionado, parece que o evento 7036 do log do sistema do Service Control Manager é o único evento que se correlaciona de maneira confiável com a inserção de uma unidade USB. 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:
Infelizmente, o Evento 7036 é gerado toda vez que o Service Control Manager inicia ou interrompe com êxito qualquer serviço, portanto, é necessária uma filtragem adicional.
A filtragem disponível na GUI do Event Viewer / Task Scheduler é bastante básica e não permite nenhuma filtragem nos dados do evento - apenas permite filtrar os metadados que, nesse caso, não informam sobre o serviço. estado alterado e em que estado foi alterado. Isso é mantido em "param1" e "param2" do EventData. O seguinte filtro XPath pode, portanto, ser usado para capturar apenas o serviço relevante inicializado:
A partir daí, você pode executar seu script, idealmente com alguma lógica adicional para verificar se a unidade USB que foi inserida é a que você está interessado.
fonte
Encontrei um evento (IMO) melhor no log de eventos localizado em Aplicativos e Logs de Serviço-Microsoft-Windows-Ntfs_Operational. Eventid 4. É assim:
Identificação do evento 4 O volume NTFS foi montado com êxito.
A partir disso, você pode criar um gatilho de tarefa agendada e filtrar por nome e / ou rótulo de volume. Este evento foi encontrado em uma caixa do Windows Server 2019, no entanto, por algum motivo, não o vejo na área de trabalho do Windows 10 (1809). Pode ser um evento apenas para servidor ....
fonte