Показать полную графическую версию : [решено] подключение/отключение томов TrueCrypt
Прошу помощи в переводе данного скрипта BAT на VBS.
@echo off
set letr=w
set "file=w.tc"
set "TrCt=C:\Program Files\TrueCrypt\TrueCrypt.exe"
if exist "%letr%:" goto ds
"%TrCt%" /l%letr% /v %file% /hn /cn /mrm /q
exit
:ds
"%TrCt%" /d%letr% /q /s /w
if exist "%letr%:" goto :ds
exit
Единственным отличием хочется видеть автоматическую подстановку буквы диска (берется из имени файла) при перетаскивании нужного файла на скрипт.
Слишком много файлов набралось и иметь для каждого собственный BAT уже не целесообразно, а один для всех случаев, как BAT не получится.
автоматическую подстановку буквы диска (берется из имени файла) при перетаскивании нужного файла на скрипт. »
а один для всех случаев, как BAT не получится »
Почему не получится – при ваших требованиях?
Пишем батник, который ниже, и кладём ярлык к нему на рабочий стол. Нужный файл бросаем на этот ярлык.
@echo off
setlocal
::Если батник запущен без параметра (например, просто щелчком по ярлыку), то завершаем его работу
if "%1" == "" goto fin
::Иначе во временную переменную вводим путь/имя того файла, который бросили на ярлык к этому батнику
set tempvar1=%1
::и вытаскиваем из неё букву диска, на котором лежит этот файл
set letr=%tempvar1:~0,1%
::после чего продолжение (в которое я не вчитывался) вашего батника,
::к которому дописан выход на случай отсутствия параметра %1
set "file=w.tc"
set "TrCt=C:\Program Files\TrueCrypt\TrueCrypt.exe"
if exist "%letr%:" goto ds
"%TrCt%" /l%letr% /v %file% /hn /cn /mrm /q
exit
:ds
"%TrCt%" /d%letr% /q /s /w
if exist "%letr%:" goto :ds
exit
:fin
exit
Мой вариант в виде пакетного файла:
@echo off
setlocal enableextensions enabledelayedexpansion
set sContainerFile=%~1
if defined sContainerFile (
if exist "%sContainerFile%" (
if exist "%ProgramFiles%\TrueCrypt\TrueCrypt.exe" (
if not exist "%~n1:\." (
start "" "%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /letter %~n1 /volume "%sContainerFile%" /history n /cache n /mountoption removable /quit
) else (
start "" "%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /dismount %~n1 /wipecache /silent /quit
)
) else (
echo Can't find [TrueCrypt.exe] in [%ProgramFiles%\TrueCrypt].
exit /b 3
)
) else (
echo Can't find TrueCrypt container file [%sContainerFile%].
exit /b 2
)
) else (
echo Usage: %~nx0 ^<TrueCrypt container file^>
exit /b 1
)
endlocal
exit /b 0
и на WSH:
Option Explicit
Dim strContainerFile
Dim strPath2TrueCrypt
Dim strDriveLetter
If WScript.Arguments.Count = 1 Then
strContainerFile = WScript.Arguments.Item(0)
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strContainerFile) Then
strPath2TrueCrypt = .BuildPath(WScript.CreateObject("Shell.Application").NameSpace("shell:ProgramFiles").self.Path, "TrueCrypt\TrueCrypt.exe")
If .FileExists(strPath2TrueCrypt) Then
strDriveLetter = .GetBaseName(strContainerFile) & ":"
If Not .DriveExists(strDriveLetter) Then
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /letter " & strDriveLetter & " /volume """ & strContainerFile & """ /history n /cache n /mountoption removable /quit", 1, False
Else
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /dismount " & strDriveLetter & " /wipecache /silent /quit", 1, False
End If
Else
WScript.Echo "Can't find [" & strPath2TrueCrypt & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find TrueCrypt container file [" & strContainerFile & "]."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <TrueCrypt container file>"
WScript.Quit 1
End If
WScript.Quit 0
Большое спасибо!
Батники не пробовал, поскольку вариант с ярлыком не подходит, т.к. тома (файлы) располагаются на флешке и возможно подключение с разной буквой самой флешки.
А вот в скрипте VBS обнаружилась интересная "фича".
Если имя файла состоит больше чем с одной буквы - том монтируется под первой из них, жаль только при попытке отмонтирования выдает ошибку о том что том уже смонтирован.
Хотел бы дополнительно попросить, чтобы такое поведение осталось, но отмонтирование происходило нормально.
А вот в скрипте VBS обнаружилась интересная "фича". »
Какую логику заказывали, ту и получили. Никаких проверок на то, что базовое имя файла контейнера окажется длиннее одного символа, не делалось.
жаль только при попытке отмонтирования выдает ошибку о том что том уже смонтирован. »
Это естественно — см. выше.
Хотел бы дополнительно попросить, чтобы такое поведение осталось, но отмонтирование происходило нормально. »
Замените строку:
strDriveLetter = .GetBaseName(strContainerFile) & ":"
на:
strDriveLetter = Left(.GetBaseName(strContainerFile), 1) & ":"
вариант с ярлыком не подходит, т.к. тома (файлы) располагаются на флешке и возможно подключение с разной буквой самой флешки »
Файлы и скрипт находятся на одной и той же флэшке? Если да – то ещё проще: небольшая модификация пакетного файла – и при его запуске (хоть двойным щелчком, хоть как) автоматом будет подставляться текущая буква флэшки, на которой лежит комплект:
@echo off
setlocal
::Во временную переменную считываем букву диска/флэшки (например, H:), на котором лежит батник
set tempvar1=%~d0
::и вытаскиваем из неё только букву
set letr=%tempvar1:~0,1%
::после чего продолжение (в которое я не вчитывался) вашего батника,
set "file=w.tc"
set "TrCt=C:\Program Files\TrueCrypt\TrueCrypt.exe"
if exist "%letr%:" goto ds
"%TrCt%" /l%letr% /v %file% /hn /cn /mrm /q
exit
:ds
"%TrCt%" /d%letr% /q /s /w
if exist "%letr%:" goto :ds
exit
Прошу не счесть за наглость, но может поможете перевести на WSH и этот пакетный скрипт?
@echo off
set letr=x
set "MYFILES=C:\Program Files\TrueCrypt\TrueCrypt.exe"
if exist "%letr%:" goto ds
"%MYFILES%" /l%letr% /a devices /hn /cn /mts /mrm /q /w /s
echo start Dexpot? (y/n)
set /p varl=""
if %varl%==y (start /b "" "%letr%:\sOft\Dexpot\Dexpot.exe")
if %varl%==n (start /b "" "%letr%:\sOft\TotalCommander\TOTALCMD.EXE %letr% %letr%")
exit
:ds
taskkill.exe /fi "ImageName eq dexpot.exe"
:rp
"%MYFILES%" /d%letr% /q /s /w
@echo on
if exist "%letr%:" goto rp
exitПоскольку подключается не контейнер, а раздел диска - по аналогии с предыдущим вариантом, букву для подключения брать из имени самого скрипта.
Пробуйте (по понятным причинам — не проверялось):
Option Explicit
Dim strPath2TrueCrypt
Dim strDriveLetter
Dim strPath2App
With WScript.CreateObject("Scripting.FileSystemObject")
strPath2TrueCrypt = .BuildPath(WScript.CreateObject("Shell.Application").NameSpace("shell:ProgramFiles").self.Path, "TrueCrypt\TrueCrypt.exe")
If .FileExists(strPath2TrueCrypt) Then
strDriveLetter = Left(WScript.ScriptName, 1) & ":"
If Not .DriveExists(strDriveLetter) Then
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /letter " & strDriveLetter & " /auto devices /history n /cache n /mountoption removable /mountoption timestamp /quit", 1, True
Select Case MsgBox("Yes: start «Dexpot»" & vbLf & "No: start «Total Commander»" & vbLf & "Cancel: nothing start", vbInformation + vbYesNoCancel, "Start application")
Case vbYes
strPath2App = .BuildPath(strDriveLetter, "sOft\Dexpot\Dexpot.exe")
If .FileExists(strPath2App) Then
WScript.CreateObject("WScript.Shell").Run """" & strPath2App & """", 1, False
Else
WScript.Echo "Can't find [" & strPath2App & "]."
WScript.Quit 2
End If
Case vbNo
strPath2App = .BuildPath(strDriveLetter, "sOft\TotalCommander\TOTALCMD.EXE")
If .FileExists(strPath2App) Then
WScript.CreateObject("WScript.Shell").Run """" & strPath2App & """", 1, False
Else
WScript.Echo "Can't find [" & strPath2App & "]."
WScript.Quit 2
End If
Case vbCancel
' Nothing to do
End Select
Else
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /dismount " & strDriveLetter & " /wipecache /silent /quit", 1, True
End If
Else
WScript.Echo "Can't find [" & strPath2TrueCrypt & "]."
WScript.Quit 1
End If
End With
WScript.Quit 0
Снятие процесса приложения виртуальных рабочих столов делать не стал. Проверку на то, что первый символ скрипта — буква, тоже не делал.
не пойму в чем дело, но что-то явно не так...
вместо окна TrueCrypt с предложением ввести пароль, появляется окно с сообщением о том, что пароль не подошел или том не найден.
по идее, для подстановки пароля нужен ключ "/p", а мы его не используем, следовательно такого сообщения и не должны получать.
pzh2393, Вы меня таки вынудили пожертвовать разделом для проверки ;).
У меня появляется:
http://i.imgur.com/cPVjSsl.png
http://i.imgur.com/S7gvQj7.png
http://i.imgur.com/W3qyqZy.png
При повторном запуске скрипта — диск отмонтируется (если, конечно, не был заблокирован каким-либо приложением).
вдвойне странно.. у меня на двух разных машинах (обе с winXPx86ru)
http://i.imgur.com/1P1eNz6.gif
Upd.
:) Проверил батник, который я тут привел... точно такое же поведение!
Хотя тот батник, что я пользуюсь постоянно, от приведенного отличается только этим:
set /p pass=
"%MYFILES%" /l%letr% /a devices /hn /cn /mts /mrm /q /w /s /p "%pass%без ключа "/p" у меня на системе именно такое поведение.. почему-то принудительно подставляет скешированный пароль от другого тома.
Windows XP SP3. Какая версия TrueCrypt (полностью)?
Какая версия TrueCrypt (полностью)? »
7.1a
Тут наверное ещё наверное важно уточнить, что и системный раздел зашифрован TrueCrypt.
7.1a »
Аналогично.
Тут наверное ещё наверное важно уточнить, что и системный раздел зашифрован TrueCrypt. »
Ага! Попробуем. Подключаемый раздел зашифрован? Скрыт? Но системный раздел я шифровать не стану, даже не просите ;).
Цитата Iska:
Подключаемый раздел зашифрован?»
Да, весь раздел (диск, винчестер) зашифрован, но на другой машине зашифрованный раздел является лишь логическим разделом диска. Поведение в обоих случаях идентичное.
Цитата Iska:
Скрыт? »
Из системы скрыт (буква не присвоена), а для TrueCrypt является обычным (не скрытым).
Цитата Iska:
Но системный раздел я шифровать не стану, даже не просите »
Зачем такие жертвы, если выяснилось что это особенности поведения самого TrueCrypt, а вовсе не скрипта.
P.S. Если предварительно очистить пароли в кэше драйвера ключом "/wipe" - скрипт отрабатывает нормально.
Прошу глянуть, что я сделал не так?
Dim strDriveLetter
Dim strPath2App
If WScript.Arguments.Count = 1 Then
strContainerFile = WScript.Arguments.Item(0)
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strContainerFile) Then
strPath2TrueCrypt = .BuildPath(WScript.CreateObject("Shell.Application").NameSpace("shell:ProgramFiles").self.Path, "TrueCrypt\TrueCrypt.exe")
If .FileExists(strPath2TrueCrypt) Then
strDriveLetter = Left(.GetBaseName(strContainerFile), 1) & ":"
If Not .DriveExists(strDriveLetter) Then
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /letter " & strDriveLetter & " /volume """ & strContainerFile & """ /history n /cache y /mountoption removable /quit", 1, False
strPath2App = .BuildPath(strDriveLetter, "autorun.bat")
If .FileExists(strPath2App) Then
WScript.CreateObject("WScript.Shell").Run """" & strPath2App & """", 1, False
Else
WScript.Quit 4
End If
Else
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /dismount " & strDriveLetter & " /quit", 1, False
End If
Else
WScript.Echo "Can't find [" & strPath2TrueCrypt & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find TrueCrypt container file [" & strContainerFile & "]."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <TrueCrypt container file>"
WScript.Quit 1
End If
WScript.Quit 0
Почему не запускается autorun.bat из корневого каталога смонтированного тома?
Почему не запускается autorun.bat из корневого каталога смонтированного тома? »
Например, потому, что этого тома ещё нет:
WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /letter " & strDriveLetter & " /volume """ & strContainerFile & """ /history n /cache y /mountoption removable /quit", 1, False
Замените «False» на «True».
P.S. Если предварительно очистить пароли в кэше драйвера ключом "/wipe" - скрипт отрабатывает нормально. »
Ну, у меня работало и в исходном виде. А вот когда был одинаковый пароль для разных томов — в моём конкретном случае для одного обычного тома и одного скрытого — я наблюдал аналогичное поведение. «Ручками» сделав пароли разными — всё снова заработало.
Прошу подсказать ещё раз!
Можно ли передать значение переменной strDriveLetter, указанного выше скрипта, в другой VBS, в частности для использования в autorun.vbs?
Например в таком autorun.vbs
Option Explicit
WScript.CreateObject("WScript.Shell").Run """" & "sOft\TotalCommander\TOTALCMD.EXE" & """l=strDriveLetter", 3, False
WScript.Quit 0
т.е. запуск TotalCommander сразу с открытым смонтированным диском в панели.
Можно ли передать значение переменной strDriveLetter, указанного выше скрипта, в другой VBS, в частности для использования в autorun.vbs? »
Можно. Например, параметром этого второго скрипта при его вызове. Соответствующим образом модифицировав этот самый второй скрипт.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.