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는 실제 외부 hdd이고 F는 G 내의 truecrypt 컨테이너입니다. 스크립트가 올바른 장치가 G로 마운트 된 것을 감지하면 5 초 동안 휴면하여 F를 마운트하는 데 truecrypt 시간을 준 다음 F에서 찾은 스크립트를 실행합니다. 볼륨 변경 이벤트는 물리적 드라이브가 연결 / 연결 해제 된 경우에만 생성됩니다 (적어도 스크립트가 이벤트를 수신하는 유일한 시간 임). G 연결을 그대로두고 F를 마운트 / 마운트 해제해도 스크립트가 트리거되지 않기 때문입니다. 다른 변경없이 truecrypt 컨테이너가 마운트 된시기를 감지하고 싶습니다. 컨테이너가 마운트 또는 마운트 해제 될 때 Windows 탐색기가 드라이브 표시를 업데이트하므로 일부 레벨에서는 이것이 가능해야합니다. 도와 주셔서 감사합니다.


어떤 볼륨이 마운트되었는지, 특히 TrueCrypt 볼륨이 언제인지 알고 있습니까?
Robert Kerr

나는 당신이 stackoverflow에서 이것으로 더 나은 행운을 가질 것이라고 생각합니다.
Robert Kerr

원하는 동작은 특정 truecrypt 볼륨이 마운트 될 때 스크립트를 실행하는 것입니다.
Matthew Patey

답변:


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에서 약간 깨지는 것 같습니다. 여기에 무엇 파워 쉘 콘솔에서 나를 위해 작동합니다.

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

TrueCrypt 드라이브를 X에 마운트 할 때까지 명령이 올바르게 중단 된 다음 echo 명령을 실행하고 종료되었습니다.

나는 ISE에서 스크립트를 조금 더 만들어 내고 전체 루프를 만들려고했습니다 ... while 루프는 다른 루프를 추가하여 X가 마운트 해제 될 때까지 스크립트를 중단시킵니다. 드라이브를 마운트 할 때와 마운트 해제 할 때 다시 에코 명령을 실행하기 위해 한 번 작동했습니다 . 그러나 그 이후로 ISE 내에서 Get-PSDrive는 실제 상태에 관계없이 X를 표시하지 않습니다.

ISE에서 새 PowerShell 콘솔을 시작하고 이번에는 X가 이미 마운트 된 상태에서 전체 스크립트를 다시 실행했습니다. 첫 번째 while 루프가 성공적으로 종료되었지만, $x -ne $null드라이브가 마운트 해제 된 후에도 상태가 유지 되는 while 루프가 계속 고정되어 있습니다. 스크립트를 종료하고 확인한 Get-PSDrive결과 PowerShell 인스턴스에 X가없는 경우에도 여전히 X를 사용 가능한 것으로 표시하는 것으로 나타났습니다.

운이 좋거나 해결 방법을 찾을 수 있습니다. 이것이 도움이되는지, 그리고 수정 사항을 알아 내면 알려주십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.