Detecta el montaje de un volumen virtual (TrueCrypt) en el script de Windows PowerShell

3

Estoy usando el siguiente script de PowerShell para detectar cuándo se monta un volumen en particular para poder ejecutar un script que moverá los archivos de mi máquina al dispositivo (no sé mucho sobre los scripts de PowerShell, encontré esto en línea).

#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 es un disco duro externo físico y F es un contenedor de cripta verdadera dentro de G. Cuando el script detecta que el dispositivo correcto está montado como G, duerme 5 segundos para dar tiempo de cripta verdadera para montar F, y luego ejecuta el script encontrado en F. Aparece que los eventos de cambio de volumen solo se generan cuando la unidad física está conectada / desconectada (al menos esa es la única vez que el script recibe un evento), porque dejar G conectado y montar / desmontar F no activa el script. Me gustaría poder detectar cuándo se monta el contenedor truecrypt sin cambiar nada más. En algún nivel, esto debe ser posible, porque Windows Explorer actualiza las pantallas de sus unidades cuando el contenedor está montado o desmontado. Gracias por la ayuda.

Matthew Patey
fuente
¿Está tratando de saber cuándo se monta algún volumen, o específicamente los volúmenes TrueCrypt?
Robert Kerr
Creo que tendrías mejor suerte con esto en stackoverflow.
Robert Kerr
el comportamiento deseado es ejecutar una secuencia de comandos cuando se monta un volumen de cripta verdadera particular
Matthew Patey

Respuestas:

0

No entiendo completamente el script que ha proporcionado, pero creo que este bit puede serle útil. No es tan bueno como usar disparadores WMI, pero debería 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'

Probado en PS 3.0 en Windows 7 Ultimate x64. Sin embargo, debería ser bastante compatible con versiones anteriores.

EDIT: Bueno, mis pruebas de lo anterior eran un poco más rudimentario y hacían el trabajo. Pero el script completo parece romperse un poco, al menos en el ISE. Esto es lo que estaba trabajando para mí en la consola de PowerShell.

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

El comando se colgaría correctamente hasta que monté una unidad TrueCrypt en X, luego ejecutó el comando echo y finalizó.

Desarrollé el script un poco más en el ISE y traté de hacer el ciclo completo do ... while como lo hizo, agregando otro ciclo while para colgar el script hasta que X se desmonte. Funcionó una vez para ejecutar un comando de eco cuando se montó la unidad y nuevamente cuando se desmontó. Sin embargo, desde entonces, Get-PSDrive desde el ISE no muestra X independientemente de su estado real.

Comencé una nueva consola PowerShell en el ISE y volví a ejecutar el script completo, esta vez comenzando con X ya montado. El primer bucle while salió con éxito, pero el bucle while condicionado $x -ne $nullpermaneció atascado incluso después de desmontar mi unidad. Matar el script y verificar Get-PSDrivemostró que esa instancia de PowerShell todavía mostraba X como disponible, aunque en realidad no estaba allí.

Quizás tenga mejor suerte o encuentre una solución alternativa. Avíseme si esto ayuda, y si encuentra una solución.

Iszi
fuente