2013-05-05 1 views
5

Я использую следующий сценарий powershell для Windows, чтобы определить, когда определенный том установлен, поэтому я могу запустить сценарий, который будет перемещать файлы с моей машины на устройство (I не знаю много о сценариях powershell, я нашел это онлайн).Обнаружение установки виртуального (TrueCrypt) тома в сценариях 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 'G:' -and $driveLabel -eq 'My Book') 
    { 
     write-host (get-date -format s) "  Starting task in 5 seconds..." 
    start-sleep -seconds 5 
     start-process "F:\copy_backups.bat" 
    } 
    } 
    Remove-Event -SourceIdentifier volumeChange 
} while (1-eq1) #Loop until next event 
Unregister-Event -SourceIdentifier volumeChange 

G представляет собой физический внешний жесткий диск и F является TrueCrypt контейнер в G. Когда сценарий обнаруживает правильное устройство монтируется как G, он спит 5 секунд, чтобы дать TrueCrypt время для монтирования F, а затем бежит скрипт, найденный на F. Похоже, что события изменения тома генерируются только тогда, когда физический диск подключен/отключен (по крайней мере, это единственный случай, когда сценарий получает событие), поскольку оставляя G подключенным и устанавливая/демонтируя F, не запускает сценарий ,

Я хотел бы иметь возможность обнаруживать, когда контейнер truecrypt монтируется без изменения каких-либо изменений. На каком-то уровне это должно быть возможно, потому что Windows Explorer обновляет свои диски, когда контейнер монтируется или демонтируется. Я прочитал на win32_VolumeChangeEvent, но я не смог ничего найти в связи с виртуальными дисками. Спасибо за помощь.

ответ

1

Я был удивлен, что это было в течение года и не было ответа! Для тех, кто посещает:

Регистрация_WMIEvent не работает для меня вообще. Вместо этого я использовал другой подход для мониторинга события накопителя. К сожалению, сценарий не является надежным, поскольку он выполняет действие при добавлении ЛЮБОГО нового диска. Не стесняйтесь добавлять к нему дополнительные условия. Я бы предположил, что Регистрация_WMIEvent для win32_VolumeChangeEvent контролирует только при изменении физического диска в соответствии с записями диспетчера томов.

Вот сценарий, который позволит вам выполнить любое действие, которое вы хотите. (Подсказка: Возможно смонтировать ТС контейнеры на высокой букве и сделать функцию ограничивается этими только, так что сценарий не будет срабатывать, когда несколько ниже буква диска подключен, такие как флэшки)

$DrivesCount = (gwmi -Query "Select * from Win32_LogicalDisk").Count 
$Drives = (gwmi -Query "Select * from Win32_LogicalDisk") 

while(1) { 
Start-Sleep -Seconds 5 
    $DrivesCountNew = (gwmi -Query "Select * from Win32_LogicalDisk").Count 
     if ($DrivesCount -ne $DrivesCountNew) 
      { 
      $DrivesNew = (gwmi -Query "Select * from Win32_LogicalDisk") 
      $DriveLetter = Compare-Object -ReferenceObject $Drives -DifferenceObject $DrivesNew | Select -ExpandProperty InputObject | Select -ExpandProperty DeviceId 
      if (!($DriveLetter -eq $null)) { 
      Write-host "New drive mounted $DriveLetter" 

      ##Place for you to do something with your drive 
      } 
      $DrivesCount = (gwmi -Query "Select * from Win32_LogicalDisk").Count 
      } 
     } 

Как для быстрых комментариев вокруг сценария:

$DrivesCount берет начальное значение вашего списка дисков, а $Drives перечисляет все их в переменной. После этого начинается бесконечный цикл, где он отсчитывается каждые 5 секунд, если установлен новый диск ($DrivesCountNew). Если изменения не были зарегистрированы, никаких действий не предпринимается (значения одинаковы). Однако, если новый диск появляется, $DriveLetter переменной проверка путем сравнения разницы и возвращает единственную букву диска (с помощью ExpandProperty пара раз.

После этого чек против $DriveLetter делается, так как скрипт будет срабатывать если диск удален (и мы не хотим, чтобы в этом месте не было никаких действий). Конечно, скрипт будет выполнять любой скриптовый блок после этого, поэтому было бы разумно ограничить выполнение, добавив некоторое условие (например: if ($DriveLetter -eq "Z:") { }) Затем, в конце успешного выполнения, он снова перезаписывает переменную $DrivesCount (чтобы сценарий не повторял действие, поскольку старая переменная все равно удерживалась).

Ну, извините, что у вас не было такого ответа своевременно, но я надеюсь, что кто-то найдет сценарий полезным. (И, по крайней мере, я узнал немного больше о объектах WMI).

0

Сценарий posted by Koliat очень приятный, он работает, но там есть две ошибки, которые я уже исправил. Новый скрипт с ошибкой (надеюсь) должен выглядеть примерно так:

$DrivesCount = (gwmi -Query "Select * from Win32_LogicalDisk").Count 
$Drives = (gwmi -Query "Select * from Win32_LogicalDisk") 

while(1) { 
    Start-Sleep -Seconds 5 
    $DrivesCountNew = (gwmi -Query "Select * from Win32_LogicalDisk").Count 
    if ($DrivesCount -ne $DrivesCountNew) { 
     $DrivesNew = (gwmi -Query "Select * from Win32_LogicalDisk") 
     $DriveLetter = Compare-Object -ReferenceObject $Drives -DifferenceObject $DrivesNew | Select -ExpandProperty InputObject | Select -ExpandProperty DeviceId 

     if (!($DriveLetter -eq $null)) { 

      $match = $DrivesNew -match $DriveLetter 

      if ([string]::IsNullOrEmpty($match)) { 
       write-host "Drive $DriveLetter REMOVED" 
      } else { 
       Write-host "Drive $DriveLetter MOUNTED" 
       ##Place for you to do something with your drive 
       if ($DriveLetter -eq "M:") { 
        write-host " Starting task in 3 seconds..." 
        start-sleep -seconds 3 
        #start-process "anything" 
       } 
      }  
     } 
     $DrivesCount = $DrivesCountNew 
     $Drives = $DrivesNew 
    } 
} 
+0

Здравствуйте, добро пожаловать в SO. Было бы лучше, если бы вы четко объяснили, что эти 2 ошибки. И вообще, добавление какого-то комментария или объяснения вместо того, чтобы просто давать код, лучше. Поэтому, пожалуйста, отредактируйте свой ответ и попытайтесь описать, что он делает и как. Спасибо! –