Detectar a montagem de um volume virtual (TrueCrypt) no script do Windows PowerShell

3

Estou usando o seguinte script powershell para detectar quando um determinado volume é montado para que eu possa executar um script que mova os arquivos da minha máquina para o dispositivo (não sei muito sobre os scripts do powershell, encontrei isso on-line) .

#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 é um disco rígido externo físico e F é um contêiner TrueCrypt dentro de G. Quando o script detecta que o dispositivo correto está montado como G, ele dorme 5 segundos para dar o tempo de autocompletar para montar F e, em seguida, executa o script encontrado em F Parece que os eventos de alteração de volume são gerados somente quando a unidade física é conectada / desconectada (pelo menos é a única vez que o script recebe um evento), porque deixar G conectado e montar / desmontar F não aciona o script. Eu gostaria de ser capaz de detectar quando o contêiner TrueCrypt é montado sem nada mudar. Em algum nível isso deve ser possível, porque o Windows Explorer atualiza suas unidades quando o container é montado ou desmontado. Obrigado pela ajuda.

    
por Matthew Patey 05.05.2013 / 18:35

1 resposta

0

Eu não entendo muito bem o roteiro que você forneceu, mas acho que isso pode ser útil para você. Não é tão legal quanto usar os gatilhos do WMI, mas deve funcionar.

# The while loop in this script will naturally generate errors until F is mounted.
# This line shuts PowerShell up for awhile.
$ErrorActionPreference = 'SilentlyContinue'

# Loop the script until F is mounted.
while ($FMounted -eq $null)
{
    $FMounted = Get-PSDrive F
}

# Reset $ErrorActionPreference to default.
$ErrorActionPreference = 'Continue'

Testado no PS 3.0 no Windows 7 Ultimate x64. Deve ser razoavelmente compatível com versões anteriores.

EDIT: Bem, meus testes acima foram um pouco mais rudimentares e fizeram funcionar. Mas o roteiro completo parece quebrar um pouco, pelo menos no ISE. Veja o que estava trabalhando para mim no console do PowerShell.

$ErrorActionPreference = 'SilentlyContinue'
$x = Get-PSDrive X
while ($x -eq $null) {$x = Get-PSDrive X};echo 'X is mounted'

O comando seria interrompido até que eu montasse uma unidade TrueCrypt em X, depois ele executaria o comando echo e terminaria.

Eu cortei o script um pouco mais no ISE e tentei fazer o loop completo ... while como você tinha, adicionando outro loop while para pendurar o script até que o X fosse desmontado. Ele funcionou uma vez para executar um comando echo quando a unidade foi montada e novamente quando desmontada. No entanto, desde então, Get-PSDrive de dentro do ISE não mostra X, independentemente do seu status atual.

Eu iniciei um novo console do PowerShell no ISE e executei o script completo novamente, desta vez começando com o X já montado. O primeiro loop while foi encerrado com sucesso, mas o loop while condicionado em $x -ne $null permaneceu preso mesmo depois que meu disco foi desmontado. A eliminação do script e a verificação de Get-PSDrive mostraram que essa instância do PowerShell ainda mostrava X como disponível, embora não estivesse realmente presente.

Talvez você tenha mais sorte ou encontre uma solução alternativa. Por favor, deixe-me saber se isso ajuda, e se você descobrir uma solução.

    
por 07.09.2013 / 07:29