Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] подключение/отключение томов TrueCrypt (http://forum.oszone.net/showthread.php?t=294423)

pzh2393 24-01-2015 23:33 2460813

подключение/отключение томов 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 не получится.

mwz 25-01-2015 01:43 2460845

Цитата:

Цитата pzh2393
автоматическую подстановку буквы диска (берется из имени файла) при перетаскивании нужного файла на скрипт. »

Цитата:

Цитата pzh2393
а один для всех случаев, как 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


Iska 25-01-2015 08:33 2460883

Мой вариант в виде пакетного файла:
Скрытый текст
Код:

@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


pzh2393 25-01-2015 16:10 2461077

Большое спасибо!

Батники не пробовал, поскольку вариант с ярлыком не подходит, т.к. тома (файлы) располагаются на флешке и возможно подключение с разной буквой самой флешки.

А вот в скрипте VBS обнаружилась интересная "фича".
Если имя файла состоит больше чем с одной буквы - том монтируется под первой из них, жаль только при попытке отмонтирования выдает ошибку о том что том уже смонтирован.

Хотел бы дополнительно попросить, чтобы такое поведение осталось, но отмонтирование происходило нормально.

Iska 25-01-2015 17:02 2461099

Цитата:

Цитата pzh2393
А вот в скрипте VBS обнаружилась интересная "фича". »

Какую логику заказывали, ту и получили. Никаких проверок на то, что базовое имя файла контейнера окажется длиннее одного символа, не делалось.

Цитата:

Цитата pzh2393
жаль только при попытке отмонтирования выдает ошибку о том что том уже смонтирован. »

Это естественно — см. выше.

Цитата:

Цитата pzh2393
Хотел бы дополнительно попросить, чтобы такое поведение осталось, но отмонтирование происходило нормально. »

Замените строку:
Код:

strDriveLetter = .GetBaseName(strContainerFile) & ":"
на:
Код:

strDriveLetter = Left(.GetBaseName(strContainerFile), 1) & ":"

mwz 25-01-2015 23:09 2461298

Цитата:

Цитата pzh2393
вариант с ярлыком не подходит, т.к. тома (файлы) располагаются на флешке и возможно подключение с разной буквой самой флешки »

Файлы и скрипт находятся на одной и той же флэшке? Если да – то ещё проще: небольшая модификация пакетного файла – и при его запуске (хоть двойным щелчком, хоть как) автоматом будет подставляться текущая буква флэшки, на которой лежит комплект:

Скрытый текст
Код:

@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


pzh2393 31-01-2015 18:30 2464340

Прошу не счесть за наглость, но может поможете перевести на 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

Поскольку подключается не контейнер, а раздел диска - по аналогии с предыдущим вариантом, букву для подключения брать из имени самого скрипта.

Iska 31-01-2015 23:33 2464510

Пробуйте (по понятным причинам — не проверялось):
Скрытый текст
Код:

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


Снятие процесса приложения виртуальных рабочих столов делать не стал. Проверку на то, что первый символ скрипта — буква, тоже не делал.

pzh2393 01-02-2015 15:56 2464742

не пойму в чем дело, но что-то явно не так...
вместо окна TrueCrypt с предложением ввести пароль, появляется окно с сообщением о том, что пароль не подошел или том не найден.
по идее, для подстановки пароля нужен ключ "/p", а мы его не используем, следовательно такого сообщения и не должны получать.

Iska 01-02-2015 23:26 2464941

pzh2393, Вы меня таки вынудили пожертвовать разделом для проверки ;).

У меня появляется:
Скрытый текст

Скрытый текст

Скрытый текст

При повторном запуске скрипта — диск отмонтируется (если, конечно, не был заблокирован каким-либо приложением).

pzh2393 02-02-2015 12:12 2465100

вдвойне странно.. у меня на двух разных машинах (обе с winXPx86ru)
Скрытый текст


Upd.
:) Проверил батник, который я тут привел... точно такое же поведение!
Хотя тот батник, что я пользуюсь постоянно, от приведенного отличается только этим:
Код:

    set /p pass=
    "%MYFILES%" /l%letr% /a devices /hn /cn /mts /mrm /q /w /s /p "%pass%

без ключа "/p" у меня на системе именно такое поведение.. почему-то принудительно подставляет скешированный пароль от другого тома.

Iska 02-02-2015 12:38 2465117

Windows XP SP3. Какая версия TrueCrypt (полностью)?

pzh2393 02-02-2015 14:30 2465199

Цитата:

Цитата Iska
Какая версия TrueCrypt (полностью)? »

7.1a

Тут наверное ещё наверное важно уточнить, что и системный раздел зашифрован TrueCrypt.

Iska 02-02-2015 14:43 2465213

Цитата:

Цитата pzh2393
7.1a »

Аналогично.

Цитата:

Цитата pzh2393
Тут наверное ещё наверное важно уточнить, что и системный раздел зашифрован TrueCrypt. »

Ага! Попробуем. Подключаемый раздел зашифрован? Скрыт? Но системный раздел я шифровать не стану, даже не просите ;).

pzh2393 02-02-2015 15:17 2465234

Цитата Iska:
Подключаемый раздел зашифрован?»
Да, весь раздел (диск, винчестер) зашифрован, но на другой машине зашифрованный раздел является лишь логическим разделом диска. Поведение в обоих случаях идентичное.

Цитата Iska:
Скрыт? »
Из системы скрыт (буква не присвоена), а для TrueCrypt является обычным (не скрытым).

Цитата Iska:
Но системный раздел я шифровать не стану, даже не просите »
Зачем такие жертвы, если выяснилось что это особенности поведения самого TrueCrypt, а вовсе не скрипта.

P.S. Если предварительно очистить пароли в кэше драйвера ключом "/wipe" - скрипт отрабатывает нормально.

pzh2393 02-02-2015 16:53 2465305

Прошу глянуть, что я сделал не так?

Код:

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 из корневого каталога смонтированного тома?

Iska 02-02-2015 17:01 2465309

Цитата:

Цитата pzh2393
Почему не запускается autorun.bat из корневого каталога смонтированного тома? »

Например, потому, что этого тома ещё нет:
Цитата:

WScript.CreateObject("WScript.Shell").Run """" & strPath2TrueCrypt & """ /letter " & strDriveLetter & " /volume """ & strContainerFile & """ /history n /cache y /mountoption removable /quit", 1, False
Замените «False» на «True».

Цитата:

Цитата pzh2393
P.S. Если предварительно очистить пароли в кэше драйвера ключом "/wipe" - скрипт отрабатывает нормально. »

Ну, у меня работало и в исходном виде. А вот когда был одинаковый пароль для разных томов — в моём конкретном случае для одного обычного тома и одного скрытого — я наблюдал аналогичное поведение. «Ручками» сделав пароли разными — всё снова заработало.

pzh2393 14-05-2015 11:15 2507197

Прошу подсказать ещё раз!

Можно ли передать значение переменной 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 сразу с открытым смонтированным диском в панели.

Iska 22-05-2015 15:47 2510259

Цитата:

Цитата pzh2393
Можно ли передать значение переменной strDriveLetter, указанного выше скрипта, в другой VBS, в частности для использования в autorun.vbs? »

Можно. Например, параметром этого второго скрипта при его вызове. Соответствующим образом модифицировав этот самый второй скрипт.


Время: 19:23.

Время: 19:23.
© OSzone.net 2001-