3 votes

Détecter le montage d'un volume virtuel (TrueCrypt) dans Windows PowerShell script.

J'utilise le script powershell suivant pour détecter quand un volume particulier est monté afin que je puisse exécuter un script qui déplacera les fichiers de ma machine vers le périphérique (je ne connais pas beaucoup les script powershell, je l'ai trouvé en ligne).

#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 est un disque dur externe physique et F est un conteneur truecrypt dans G. Lorsque le script détecte que le bon périphérique est monté en tant que G, il dort 5 secondes pour donner à truecrypt le temps de monter F, puis exécute le script trouvé sur F. Il semble que les événements de changement de volume ne soient générés que lorsque le lecteur physique est connecté/déconnecté (du moins, c'est le seul moment où le script reçoit un événement), car laisser G connecté et monter/démonter F ne déclenche pas le script. J'aimerais pouvoir détecter quand le conteneur truecrypt est monté sans que rien d'autre ne change. À un certain niveau, cela doit être possible, car l'explorateur Windows met à jour son affichage des lecteurs lorsque le conteneur est monté ou démonté. Merci pour votre aide.

0voto

Iszi Points 13065

Je ne comprends pas tout à fait le script que vous avez fourni, mais je pense que ce bout peut vous être utile. Ce n'est pas aussi soigné que l'utilisation des déclencheurs WMI, mais cela devrait fonctionner.

# 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'

Testé dans PS 3.0 sur Windows 7 Ultimate x64. Il devrait être assez compatible avec les versions antérieures.

EDIT : Eh bien, mes tests de ce qui précède étaient un peu plus rudimentaires et a fait travail. Mais le script complet semble se casser un peu, au moins dans l'ISE. Voici ce qui suit était qui fonctionne pour moi dans la console PowerShell.

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

La commande se bloquait correctement jusqu'à ce que je monte un lecteur TrueCrypt sur X, puis elle exécutait la commande echo et se terminait.

J'ai étoffé le script un peu plus dans l'ISE et j'ai essayé de faire la boucle complète do ... while comme vous l'aviez, en ajoutant une autre boucle while pour suspendre le script jusqu'à ce que X soit démonté. Cela a fonctionné une fois pour lancer une commande echo lorsque le lecteur était monté et à nouveau lorsqu'il était démonté. Cependant, depuis lors, Get-PSDrive à partir de l'ISE n'affiche pas X, quel que soit son état réel.

J'ai démarré une nouvelle console PowerShell dans l'ISE et j'ai exécuté à nouveau le script complet, en commençant cette fois avec X déjà monté. La première boucle while s'est terminée avec succès, mais la boucle while conditionnée sur $x -ne $null est resté bloqué même après que mon lecteur ait été démonté. En tuant le script et en vérifiant Get-PSDrive a montré que l'instance PowerShell montrait toujours X comme disponible alors qu'il n'était pas vraiment là.

Vous aurez peut-être plus de chance ou trouverez une solution de contournement. Faites-moi savoir si cela vous aide, et si vous trouvez une solution.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X