5

Я обнаружил, что Windows 7 не позволяет автозапуск на USB-накопителях.

Можно ли обойти это (безопасным способом), настроив задачу с помощью Task Scheduler, который срабатывает при вставке USB-накопителя? На первый взгляд, я не смог найти связанных событий с Event Viewer.

4 ответа4

4

У меня был такой же вопрос, как и у вас, и я кое-что проработал с PowerShell (встроенным в Windows скриптингом) с использованием техник из Блога сценаристов здесь и здесь. Сценарий выполняется непрерывно как фоновый процесс, который можно запустить при входе в систему с помощью планировщика задач. Сценарий будет уведомлен всякий раз, когда подключен новый диск, и затем что-то предпринимает (здесь вы настраиваете сценарий, а не задачу). Так как он в основном приостановлен во время ожидания следующего подключенного диска, вы не должны обнаружить, что он занимает много ресурсов. Здесь я иду:

1) Запустите Powershell ISE, который можно найти в меню «Пуск» в разделе «Стандартные» /«Windows Powershell».

2) Скопируйте и вставьте следующее в 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) Вам нужно изменить приведенный выше скрипт, чтобы указать скрипту, какой диск искать и что выполнять. Две строки для изменения:

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

    Мой жесткий диск USB с именем Mirror установлен как диск Z:. Вы можете просто использовать if ($driveLabel -eq 'MyDiskLabel') если вас не волнует письмо.

  • start-process "Z:\sync.bat"

    Путь любой задачи, которую вы хотите сделать. В моем примере я создал пакетный файл на своем USB-накопителе, который запускает 3-4 задания резервного копирования, но это может быть что угодно.

4) Когда вы закончите, сохраните ваш скрипт где-нибудь (расширение .ps1), затем создайте задачу в планировщике задач, чтобы ваш скрипт работал в фоновом режиме. Моя выглядит так:

  • Триггер: при входе в систему
  • Действие: запустить программу
  • Программа / скрипт: powershell
  • Добавьте аргументы: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Вуаля!

6) Дополнительные вещи: если вы хотите, чтобы окно вашего скрипта было скрыто, используйте следующие аргументы:

  • Добавьте аргументы: -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Если вы хотите вывести сообщения сценария в файл журнала (который перезаписывается при каждом запуске сценария, то есть при входе в систему), используйте следующее действие задачи:

  • Программа / скрипт: cmd
  • Добавьте аргументы: / c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"> "D:\Stuff\script log.txt"

В любое время, когда вы хотите завершить выполнение скрытого скрипта, вы можете завершить процесс "Powershell" в диспетчере задач.

2

Нет. Вы не можете использовать планировщик заданий.

Единственное зарегистрированное событие, которое возникает при подключении USB-устройства, - это запуск службы «Перечисление переносных устройств». Но вы не можете использовать его в диспетчере задач, потому что одно и то же событие возникает, когда любая служба запускается и останавливается. (Кроме того, событие не будет запущено, если служба уже запущена при подключении устройства.)

1

У USB Safely Remove есть такая функция: он может запускать программу при подключении USB-устройства.

Другая функция безопасного удаления USB, которая отличает его от аналогичного программного обеспечения, запускает любые приложения не только после подключения устройства, но и перед его удалением. Функция автозапуска позволяет настроить резервное копирование данных перед отсоединением съемного жесткого диска, запустить Total Commander с содержимым перьевого диска, автоматически отключить зашифрованный диск TrueCrypt перед отключением USB-носителя и т.д.

альтернативный текст

0

Я не думаю, что планировщик задач будет правильным инструментом. Вам нужно что-то, что будет отвечать каждый раз, когда добавляется новое USB-устройство. Для этого потребуется специальное приложение, которое может обнаруживать новые USB-устройства, и, таким образом, оно заменит функцию автозапуска Windows.

Да, такое приложение возможно. Это было бы непросто.

Использование планировщика задач означает, что вы просто собираетесь запускать автозапуск снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова и снова, снова, снова и снова Снова получишь картинку) Вам понадобится механизм, предотвращающий использование автозапуска дважды. И вам нужен механизм, который определяет, доступен ли автозапуск или нет, иначе вы получите постоянные сообщения об ошибках. Это все равно что ударить молотком по стене, надеясь, что между ними есть гвоздь. Планировщик не знает, когда начинать, а когда останавливаться.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .