У вас есть опыт работы с WMI (инструментарий управления Windows)? Это идеально подходит для такого рода задач. Кроме того, это часть Windows, поэтому она должна вызывать минимальные накладные расходы.
Ниже приведен пример сценария Perl, который выполняет некоторые простые действия при подключении USB-накопителя. Ваш скрипт не обязательно должен быть на Perl, WMI поддерживает целый ряд языков сценариев и программирования.
Некоторые переменные
use Win32::OLE::Const 'Microsoft WMI Scripting';
my $ComputerName = "localhost";
my $NameSpace = "root/cimv2";
my $WbemServices = Win32::OLE->GetObject("winmgmts://$ComputerName/$NameSpace");
Зарегистрировать событие (USB подключен)
my $Instance = $WbemServices->Get(__EventFilter)->SpawnInstance_();
$Instance->{Name} = "myfilter";
$Instance->{QueryLanguage} = "WQL";
$Instance->{Query} = qq[SELECT * FROM __InstanceCreationEvent WITHIN 1
WHERE TargetInstance ISA 'Win32_LogicalDisk'
and TargetInstance.Name<>'B:'
and TargetInstance.Name<>'A:'];
# there are other queries possible
my $Filter = $Instance->Put_(wbemFlagUseAmendedQualifiers);
my $Filterpath = $Filter->{path};
Определить действие
# example 1 : execute script
my $Instance = $WbemServices->Get(ActiveScriptEventConsumer)->SpawnInstance_();
$Instance->{Name} = "myscript";
$Instance->{ScriptingEngine} = "PerlScript";
$Instance->{ScriptText} = q[open FILE, ">>C:\\\\usb.txt";print FILE "USB plugged in\n";];
# you could call your backup script / check for dates / etc.
# example 2 : execute command
my $Instance = $WbemServices->Get(CommandLineEventConsumer)->SpawnInstance_();
$Instance->{Name} = "mycommand";
$Instance->{CommandLineTemplate} = "echo Hello world!";
# you could call your backup script / check for dates / etc.
my $Consumer = $Instance->Put_(wbemFlagUseAmendedQualifiers);
my $Consumerpath = $Consumer->{path};
Связать событие и действие
my $Instance = $WbemServices->Get(__FilterToConsumerBinding)->SpawnInstance_();
$Instance->{Filter} = $Filterpath;
$Instance->{Consumer} = $Consumerpath;
my $Result = $Instance->Put_(wbemFlagUseAmendedQualifiers);
Это форма постоянной регистрации события. Чтобы отключить и очистить весь процесс, удалите созданные объекты:
- экземпляр __EventFilter "myfilter"
- экземпляр __EventConsumer "myscript" или "mycommand"
- экземпляр __EventToConsumerBinding
Вы можете искать объекты с помощью WMI CIM Studio. Скачать бесплатно от Microsoft можно здесь.