检测Windows PowerShell脚本中虚拟(TrueCrypt)卷的安装


3

我正在使用以下powershell脚本来检测何时安装了特定的卷,因此我可以运行一个脚本,该文件会将文件从我的机器移至设备(我对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是G中的一个truecrypt容器。当脚本检测到正确的设备作为G挂载时,它将休眠5秒钟以使truecrypt时间挂载F,然后运行在F上找到的脚本。仅当物理驱动器已连接/断开连接时才会生成卷更改事件(至少这是脚本唯一接收事件的时间),因为保持G连接并且安装/卸载F不会触发脚本。我希望能够检测何时安装了truecrypt容器,而无需进行其他任何更改。在某种程度上,这是必须可行的,因为在安装或卸载容器时,Windows资源管理器会更新其驱动器显示。谢谢您的帮助。


您是否想知道何时安装了任何卷,特别是TrueCrypt卷?
罗伯特·克尔

我认为您最好在stackoverflow上获得好运。
罗伯特·克尔

所需的行为是在安装特定的truecrypt卷时执行脚本
Matthew

Answers:


0

我不太了解您提供的脚本,但是我认为这可能对您有用。它不像使用WMI触发器那样整洁,但是应该可以使用。

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

已在Windows 7 Ultimate x64的PS 3.0中进行测试。但是应该相当向后兼容。

编辑:好了,我上面的测试是一个有点简陋和没有工作。但是完整的脚本似乎有些破损,至少在ISE中是如此。这在PowerShell控制台中为我工作的内容。

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

该命令将正确挂起,直到我将TrueCrypt驱动器安装到X,然后运行echo命令并终止。

我在ISE中将脚本充实了一下,然后尝试完全执行... while循环,就像您一样,添加了另一个while循环来挂起脚本,直到卸载X。安装驱动器时,它一次运行回显命令,而卸载时,它又运行一次。但是,此后,无论其实际状态如何,ISE中的Get-PSDrive都不会显示X。

我在ISE中启动了一个新的PowerShell控制台,然后再次运行了完整脚本,这次是从已经安装的X开始。第一个while循环成功退出,但是以条件为条件的while循环$x -ne $null即使在卸载驱动器后仍然停留在卡住状态。杀死脚本并检查Get-PSDrive表明,PowerShell实例即使实际上并没有显示X仍然可用。

也许您会获得更好的运气或找到解决方法。请告诉我这是否有帮助,以及您是否找到解决办法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.