# Форум на русском языке  > Разное  > Софт - общий  >  Как зафиксировать букву для флешки?

## PavelA

Вчера столкнулся с такой проблемой. В некой программе ключи хранятся
на флешке, причем с привязкой к букве диска.
Система каждый раз дает букву случайным образом. Покопавшись в Интернете, на oszone.net нашел советы как это сделать через средства системы, но разобраться до конца в них не смог. Если кто расскажет подробно, то буду благодарен.

второй способ: *USB Safely Remove*.
Сайт: http://safelyremove.com/ru/
 Данная программа позволяет сделать с подключенными флешками много интересного, в том числе и зафиксировать букву.

----------

Надоело быть жертвой? Стань профи по информационной безопасности, получай самую свежую информацию об угрозах и средствах защиты от ведущего российского аналитического центра Anti-Malware.ru:

----------


## Vadim_SVN

1. Вставить флешку
2. запустить "управление компьютером"
3. управление дисками, на флешке правый клик - изменить букву диска.
и все, вроде бы должно работать  :Smiley: 

Позднее их можно найти и удалить в этом ключе реестра:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
\DosDevices\G:
\DosDevices\H:
и т.д.

----------


## PavelA

Как оказалось, что все это не так просто. Имеем 4-е флешки Transend 2G.
Нужно сделать так, чтобы две разные флешки были с буквой "Е".
Фиксировать программой получается только одну флешку, вторая уже не опознается как такая же и получает другую букву.

----------


## Vadim_SVN

А про две разговора не было  :Smiley: 

Вроде как нормального решения нет, поэтому я, например, действовал от противного (когда от банк-клиента надо было 3 флешки посадить на одну букву).
При вставке флешке (которой не назначалась буква диска) она будет получать первую свободную букву от начала алфавита, поэтому:

Т.к. флешки будут вставляться по одной (которые с ключами) (так ведь?), то сделать по другому:
- удалить по указанному ключу в реестре инфо про все буквы флешек
- вставить по одной флешке с ключами (они получат первую свободную букву алфавита и по отдельности будут висеть на этой одной букве)
- если используются на постоянной основе еще флешки, то вставить их и им уже назначить через диспетчер дисков букву чуть далее. Тогда они (даже вставленные в одиночестве и раньше ключевых) получат именно ту, более далекую букву.
А вставленная затем флешка с ключами запросит первую свободную, т.е. ту, которая нам нужна. В настройках БК тогда просто сменить букву на нужную.

Т.е. пример:
HDD - C, D
DVD - E
Флешки (вставленные по одной с ключами будут иметь одну букву)
1фл. и 2фл. с ключами - F
Двум остальным флешкам назначить буквы принудительно
3фл - G
4фл - H
В какой бы комбинации флешки не вставлялись: 3 и 4 получать свои отдаленные буквы, а флешки с ключами (вставленные по одной) - первую свободную и одну и ту же.
При вставке новой 5 флешки она тоже получит первую свободную букву ...

Путанно обьяснил, но вроде как понятно  :Smiley:

----------


## Damien

> В некой программе ключи хранятся
> на флешке, причем с привязкой к букве диска.


еще есть альтернативное решение. Разместить в корне флешки bat файл монтирующий папку флешки как диск, через команду SUBST.
Скрипт можно написать таким образом, что если флешка не смонтировалась под нужным диском - за нее это сделает SUBST.

----------


## Vadim_SVN

> Скрипт можно написать таким образом, что если флешка не смонтировалась под нужным диском - за нее это сделает SUBST


- а если эта буква диска занята в текущий момент?
- а если пользователь просто выдернет флешку из компа, что будет?

----------


## PavelA

> Флешки (вставленные по одной с ключами будут иметь одну букву)
> 1фл. и 2фл. с ключами - F
> Двум остальным флешкам назначить буквы принудительно
> 3фл - G
> 4фл - H
> В какой бы комбинации флешки не вставлялись: 3 и 4 получать свои отдаленные буквы, а флешки с ключами (вставленные по одной) - первую свободную и одну и ту же.
> При вставке новой 5 флешки она тоже получит первую свободную букву ...


Также и сделал. У меня ситуация чуть похуже: два КБ, у каждого по две флешки, причем у одного из них 1-я и 2-я подпись, лежащая на разных носителях, должны иметь одну и ту же букву.

----------


## Damien

> - а если эта буква диска занята в текущий момент?


на нет - и суда нет. Предполагается что програма ищет ключи на определенном специально зарезервированном для нее диске. Ведь если она будет искать его на "D" диске, а это CDRom - неужели пльзователь каждый раз будет ковырять диспетчер логических дисков?
C SUBST можно выбрать какую нибудь максимально удаленную букву в алфавите чтоб гарантированно не заехать на те 7 флешек.

----------


## VV2006

*PavelA*, 
Думается, здесь помог бы батник, переназначающий при необходимости букву флешки по её уникальному идентификатору.
Или другой вариант: временное копирование с разных флешек на диск с предопределённой для проги буквой, что тоже реализуемо батником.

----------


## PavelA

> Или другой вариант: временное копирование с разных флешек на диск с предопределённой для проги буквой, что тоже реализуемо батником.


 Нельзя. По условиям работы программы.

----------


## Vadim_SVN

> C SUBST можно выбрать какую нибудь максимально удаленную букву в алфавите чтоб гарантированно не заехать на те 7 флешек.


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

----------


## fp_post

to *PavelA*:
как вариант: UsbDLM



> USBDLM is a Windows service that gives control over Window's drive letter assignment for USB drives. Running as service makes it independent of the logged on user's privileges, so there is no need to give the users the privilege to change drive letters.
> It automatically solves conflicts between USB drives and network or subst drives of the currently logged on user.
> Furthermore you can define new default letters for USB drives and much more.

----------


## PavelA

*fp_post*, Деньги они просят за эту программу.

----------


## Neo-473

за использование программы или за скачивание?
если за скачивание,то вот
http://www.s3blog.org/download/others/soft/usbdlm.zip

----------


## PavelA

*Neo-473*, Читаем:
http://www.uwe-sieber.de/usbdlm_e.html#download




> USBDLM is Freeware for private and educational (schools, colleges, universities) use only. The students shall outnumber all others.
> Otherwise one licence per computer is required after a 30 day test period even though the software does not expire

----------


## antanta

Или мало данных, или я невнимательно прочитал.
     Если в некой софтине жестко зашита литера, то это более, чем странно. Если это так, сообщите, будем подумать.
    Если привязка к букве идет во время установки, то предложенный ранее вариант с subst должен помочь. Длэ этого нужно "застолбить" литеру до установки всяких съёмных накопителей. Затем можно сопоставить корневой раздел реально накопителя с требуемым диском. (Как- объясню, если вцелом идея подходит).
Делается прописыванием "батника" в автозапуск. 
   Тут может случиться неожиданный фейл. У меня были проблемы с доступом к такому диску (если диск создан админом, а доступ получает сонсоль (cmd), открытая от system. Абсурд, но - факт).
   Если интересна реализация идентификации флэхи (как это кто-то  тут собирался делать скриптом - интересно уже мне) , в ПМ или в топик.

----------


## PavelA

> Если в некой софтине жестко зашита литера, то это более, чем странно. Если это так, сообщите, будем подумать.


Да, зашита. КБ от одного из банков. Доп. условие: их две флешки и желательно на одну букву: одна - ГД, вторая - главбух.
И плюс на этом же компьютере парочка от другого КБ.

----------


## Vadim_SVN

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

*antanta*, очень интересно. Изложите свой вариант, пожалуйста.

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

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

----------


## PavelA

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


Это BSS-клиент с Крипто-Про. Там, конечно, можно извратиться одной подписи одну букву назначить, другой следующую. Уж очень головная боль большая.

ежели учесть, что у меня в конюшне аж 10 КБ установлено и еще несколько штук намечается.

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

----------


## Vadim_SVN

> Это BSS-клиент с Крипто-Про. Там, конечно, можно извратиться одной подписи одну букву назначить, другой следующую. Уж очень головная боль большая.


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

----------


## antanta

Интересно, что делает чудо-программа, если на машине много разделов на хардах, и пара оптических приводов?
*Vadim_SVN*, Для начала проверить бы, можно ли обмануть программу при помощи subst. То есть, копируем ключи в папку на харде, делаем subst и проверяем. Если помогает, идем дальше.
Задача разбивается на три попроще.
1) Застолбить литеры под наши девайсы. Решение - subst в автозагрузке.
2) Идентифицировать флеш. Решение  - по ID или по метке тома. Другое дело, что как отлавливать момент подключения стандартными средствами (на скриптах, батниках и проч) я не знаю. Поэтому могу только перепилить под это дело одну свою софтинку. Она определяет флеху по ID, и выполняет 
3) "Перемонтировать" буквы. Решение. Освобождаем (subst /d) нужную литеру. Определяем букву нашего реального накопителя, монтируем его корневой раздел на освободившуюся букву.

----------

Надоело быть жертвой? Стань профи по информационной безопасности, получай самую свежую информацию об угрозах и средствах защиты от ведущего российского аналитического центра Anti-Malware.ru:

----------


## VV2006

*antanta*, 



> реализация идентификации флэхи (как это кто-то тут собирался делать скриптом


Я не кто-то. Ибо азъ есмь!  :Smiley: 



> как отлавливать момент подключения стандартными средствами (на скриптах,батниках и проч)




```
@echo off
rem Создание сценария получения списка томов:
echo LIST VOLUME>lv
rem Вывод списка томов на экран и в файл:
diskpart /s lv &diskpart /s lv>vol_lst.txt
```

Дальше нужно определиться, по чему будем идентифицировать нужную флешку: по метке тома, серийному номеру (0000-0000?!  :Smiley: ) или маркерному файлу.
Где-то у меня валялся MapDrive.cmd с забугорного форума, позволяющий без перезагрузки переназначать буквы, там нужно всего-лишь адаптировать разбор вывода diskpart к великому и могучему.

----------


## antanta

*VV2006*, Это все в цикле? Пока юзер не подключит устройство?

----------


## VV2006

*antanta*, а зачем городить постоянный цикл опроса устройств, если задача сводится к выполнению отдельной прикладной задачи? Включаем все требуемые процедуры в один пакетный файл и всё.

----------


## antanta

> *antanta*, а зачем городить постоянный цикл опроса устройств, если задача сводится к выполнению отдельной прикладной задачи? Включаем все требуемые процедуры в один пакетный файл и всё.


 Мой моск не смог предположить, что из юзермода (по крайней мере из батника) можно такие фокусы проделывать. Код в студию, пожалуйста.
 Иначе мне придется таки кодить, раз обещал  :Cheesy:  Выручайте уж  :Smiley:

----------


## Vadim_SVN

> Для начала проверить бы, можно ли обмануть программу при помощи subst.


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



> Иначе мне придется таки кодить, раз обещал


Да наверное не придется  :Wink:  Спрашивалось из разряда факультатива. В любом случае получается, что это будет заточено именно под определенную программу и для определенной конкретной задачи, а не универсальным решением.

Но на возможные варианты решения не против и посмотреть  :Wink:

----------


## Iron Monk

> Нужно сделать так, чтобы две разные флешки были с буквой "Е".


http://www.uwe-sieber.de/usbdlm_e.html

----------


## Vadim_SVN

*Iron Monk*, на предыдущей странице ее обсудили уже

----------


## Iron Monk

> - 2 или 3 флешки с одинаковыми файлами (но с разным содержимым).




```
@echo off
set usb=
FOR %%d IN (c: d: e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w: x: y: z:) DO IF EXIST %%d\sign.key SET USB=%%d
if "%usb%"=="" GOTO END
if "%usb%"=="z:" GOTO END
rem diskpart list volume (choose tom number of the removable disk)
echo select volume=3 >sl
echo assign letter=z >>sl
diskpart /s sl
del sl
:end
```

А момент подключения флешки стандартными средствами не реализуешь. Необходимо обработать сообщение Windows _WM_DeviceChange где wParam= DBT_DEVICEARRIVAL_.
Почти четыре строчки кода получилось. :Wink:

----------


## antanta

*Iron Monk*, Момент подключения обрабатывается очень просто. Но, у некоторых студЭнтов возникают проблемы с "буквой" подключенного устройтва. Особенно, когда их более одного  :Wink:  . Если поможете нам всем чиста конкретным кодом, мы все будем очень благодарны. Заодно проясним Ваш взгляд на решение этой проблемы. Ждем-с.

----------


## Iron Monk

> Момент подключения обрабатывается очень просто


Каким образом стандартными методами?
Код из поста выше, меняет букву флешки на заданную, идентифицируя нужную флешку по файлу.

----------


## antanta

> Каким образом стандартными методами?


 Разве что WMI? http://www.script-coding.info/WMI.html
Хотя, для меня - темный лес. Проще на асме.
 Определение буквы не вызывает затруднений до тех пор, пока флешка одна. Когда встала задача работать с двумя и более, я и почувствовал себя студЭнтом. Найденные мной на форумах способы выглядят кривыми. 
 Например, читать отсюда *HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices* . Зато недавно нашел вот такой способ отлова момента подключения:
    0)   *Dir* db "C:\WINDOWS\system32\NtmsData",0
   1) invoke FindFirstChangeNotification, addr *Dir*, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME
   2) mov pChang, eax
   3) invoke WaitForSingleObject, pChang, INFINITE
   4) PROFIT
 Плюсы: Работает, не требует создания окна.
 Минус: Требует запущенной службы "Съемные ЗУ". Возможно, чего-то еще.

*Добавлено через 1 минуту*




> [CODE]
> Почти четыре строчки кода получилось.


Не считая окна.

----------


## arriah

Ну можно например использовать встроеную программу diskpart из командной строки (написать cmd файл) например так:

Я для теста создал папку scripts на диске d:
 В этой папке создал файл new.cmd и поместил туда следующий код:

*diskpart /s d:/scripts/listvol.txt > drive.txt
type drive.txt
@echo off

set /p NumVol=Enter volum number: 

set /P NewLet=Enter the new drive letter:

echo select vol %NumVol% > change.txt
echo assign letter=%NewLet% >> change.txt
echo list vol >> change.txt

diskpart /s d:/scripts/change.txt > drive.txt
type drive.txt

rem set /p aaa=Press any key to exit...

del drive.txt
del change.txt
*
Так же в этой папке создал файл listvol.txt и написал в нем:
*list vol*

Все. Достаточно запустить new.cmd, Откроется командная строка, где будут указаны все доступные носители.
На первый вопрос нужно ввести номер тома (левая колонка) для которого надо изменить букву, на второй вопрос надо ввести новую букву...

извращение конечно, но это быстрее, чем пользоваться диспетчером дисков.

----------


## Iron Monk

> Условие:
> - для успешной работы флешки должны получать одну и ту же букву диска.
> - при работе с программой необходимо последовательно вставить все флешки (одну за одной).
> - минимизировать кол-во телодвижений для данной процедуры





> Достаточно запустить new.cmd, Откроется командная строка, где будут указаны все доступные носители.
> На первый вопрос нужно ввести номер тома (левая колонка) для которого надо изменить букву, на второй вопрос надо ввести новую букву...


Не только "количество телодвижений" огромно, так еще "аналитическое мышление" нужно подключить.
И еще бабушек в бухгалтерии обучить всему этому. :Wink: 

*Добавлено через 1 минуту*




> Ну можно например использовать встроеную программу diskpart из командной строки


Post #29

*Добавлено через 21 минуту*




> Разве что WMI? http://www.script-coding.info/WMI.html


Скрипт *.vbs:


```
Sub SINK_OnObjectReady(objReceivedEvent, objAsyncContext)
    Wscript.Echo "Name: " & objReceivedEvent.TargetInstance.Name
    Wscript.Echo "Caption: " & objReceivedEvent.TargetInstance.Caption
    Wscript.Echo "FileSystem: " & objReceivedEvent.TargetInstance.FileSystem
    Wscript.Echo "Description: " & objReceivedEvent.TargetInstance.Description
End Sub

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set MySink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync MySink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'Win32_LogicalDisk'" & _
    " AND TargetInstance.DriveType = 2"
 
WScript.Echo "Ожидаем события ..."
While (True)
    Wscript.Sleep(1000)
Wend
```

Пример сценария асинхронного отслеживания подключения дисковых устройств USB.

----------


## antanta

> Каким образом стандартными методами?


 То есть, WMI таки работает? Вот и чудненько.  Не пременю скопипастить на черный день. Респект полиглотам.
 А оленя - лучше!  :Cheesy: 
  По поводу  бабушек, существуют средства удаленного администрирования. Бабушек ничто не потревожит. Тут возможен холивор, но все же... pstools от Руссиновича со товарищи рулит в локалке. Хотя, некоторые  :Wink:   , как я понял, могут обойтись "голыми руками" (тем же WMI)  :Cheesy:

----------


## Iron Monk

> могут обойтись "голыми руками" (тем же WMI


Кабы не ентот ужас:


```
While (True)
    Wscript.Sleep(1000)
Wend
```

уж лучше окошками сообщение ждать, чем постоянный опрос. Хотя, может и это обойти можно. :Shocked:

----------


## antanta

"Голыми руками" - это про удаленку через WMI. Тот же RPC, там проблем быть не должно. По ссылке, которую я приводил, в самом конце было про "Создание постоянных потребителей событий WMI". Как я и говорил, для меня это темный лес. Да еще и не нужный. Интуиция подсказывает, что копать нужно сюда (в отличие от "Создание временных потребителей событий WMI" , где используются WScript.Timeout = XXXX типа sleep). Каюсь еще раз, это все мои предположения, основанные на отрывочных знаниях о COM. Как-то это просто должно быть применимо к теме. Винду не ламеры писали (только не цитируйте меня на ЛОРе  :Cheesy:  ).
 Я и сам любитель "штатных" средств, но этот их ООП - это слишком.

----------


## Iron Monk

> "Создание постоянных потребителей событий WMI"


Создаем текстовый файл:

```
#pragma namespace ("\\\\.\\root\\subscription")
instance of ActiveScriptEventConsumer as $CONSUMER
{
Name = "USBConsumer";
KillTimeout = 300;
ScriptingEngine = "VBScript";
ScriptFileName = "c:\\windows\\system32\\wbem\\USB.vbs";
};
instance of __EventFilter as $FILTER
{
Name = "USBFilter";
Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA"
"\"Win32_LogicalDisk\"AND TargetInstance.DriveType = 2" ;
QueryLanguage = "WQL";
EventNamespace = "root\\CIMv2";
};
instance of __FilterToConsumerBinding
{
Consumer = $CONSUMER;
Filter = $FILTER;
};
```

Сохраняем его как C:\USB.mof
Для того чтобы созданный нами MOF-файл был импортирован в репозиторий WMI и события подключения USB FlashDrive стали отлавливаться, нам необходимо скомпилировать этот MOF-файл:


```
mofcomp c:\usb.mof
```

Делаем скрипт USB.vbs:

```
Set oUSB = CreateObject("Wscript.Shell")
oUSB.Run("cmd.exe")
```

и забрасываем его в папку c:\windows\system32\wbem. Теперь при подключении съемного диска запускается cmd.exe(можно посмотреть в процессах). :Wink:  Работает, блин...

----------


## antanta

> Теперь при подключении съемного диска запускается cmd.exe(можно посмотреть в процессах). Работает, блин...


Вот и чудненько. Кстати, запускается от SYSTEM.

----------


## Iron Monk

> Вот и чудненько. Кстати, запускается от SYSTEM.


Совершенно верно, поэтому доступ к телу, то бишь скрипту, желательно ограничить от юзверей.

----------


## antanta

Я уже упоманал в начале обсуждения, что у subst от имени SYSTEM могут быть проблемы с доступом к содержимому виртуальных дисков, созданных обычным админом (кто бы объяснил это глюк?) Хотя, можно обойтись и без subst. Завтра покумекаем. 
Предлагаю для начала следующее содержание USB.vbs:


```
Set SAPI = CreateObject ( "sapi.spvoice") 
sapi.Speak "Ah htwuung! Removable detected!"
```

 Если голосовым движком установлен стандартный Sam, доставляет характерным акцентом  :Wink:

----------

Надоело быть жертвой? Стань профи по информационной безопасности, получай самую свежую информацию об угрозах и средствах защиты от ведущего российского аналитического центра Anti-Malware.ru:

----------


## Iron Monk

> subst


КБ от Сбербанка subst игнорирует, даже когда виртуалишь директорию на съемном диске - может увидеть - может не увидеть. С diskpart реализуется на Ура.
WMI на W2K - проблематичнее, чем subst. Пока удачи не видать. Будем поискать...
Sam - бабушкам инфаркт. :Cheesy:

----------


## antanta

w2k %)  Жесть. Далее - только эмоции.
 В одной  конторе, где я трудился пару месяцев, шеф держал всех на 2k. Уже в то время (2003 год) все технари (и разработчики, и "аудиторы", и админы) не смогли переубедить шефа перейти на XP. Конторской закалки  человек! Чекист бывшим не бывает. 
 Сообразно традициям большинства форумов, могу посоветовать сменить ось. Теперь мы оказались перед выбором. Доводить ли до ума вариант под XP и выше, или из принципа наколбасить решение под 2к. 
 Логичнее 2-е, но - неспортивно. Под 2к работал механизм ntbackup. Должно было существовать решение для бэкапа по событию. 
 я уже хотел приколоться, и вставить в скрипт что-то вроде 

```
 mount -t vfat /dev/sda3 /mnt/a
```

 А тут подкинули ось еще экзотичнее  :Cheesy:

----------


## PavelA

> w2k %)  Жесть.


ОТ:Прелесть, а не ось. Перешел на нее с 98-го и дальше пока не собираюсь. Для работы все что нужно есть, а красота она нафик не нужна.

По поводу выбора ОС: знаю одну крупную контору, в которой приказ о переходе на другую ОС осуществляется по приказу ГД. Все остальные ОС в конторе вне закона, как и большинство ПО.

----------


## Iron Monk

OFF:


> ОТ:Прелесть, а не ось.


На работе стоит. Очень стабильная. Но. Два поста выше и не только WMI. А красота в XP дома убрана - "Параметры - максимальное быстодействие". ХРя дома без переустановки работает с 2004г. :Wink: 
А по теме, кроме diskpart ничего не могу найти, чтобы менять имена дисков на лету. Если потребуется для себя решать такую задачу - в XP - связка WMI - vbsscript - bat(diskpart). В W2K вместо WMI слепить окошко для обработки сообщений, дальше - без изменений. :Smiley: 
*Релиз.*
USB.bat:

```
@echo off
echo list volume |diskpart |find "SIGN"> sl
FOR /F "tokens=2,3 delims= " %%i in (sl) ^
do (
IF %%j==W GOTO END
echo select volume=%%i >sl
echo assign letter=W >>sl
)
diskpart /s sl
:END
del sl
```

Остальное отсюда:
http://virusinfo.info/showpost.php?p...2&postcount=38, только "cmd.exe" поменять на "usb.bat". :Wink: 
Диск опознается по метке, в данном случае "SIGN".

----------


## antanta

Сегодня решил упростить процесс. Упростил. И, в поисках этой темы по форуму, нашел это http://virusinfo.info/showthread.php?t=74300
 "Все украдено до нас!" (С). Не знал, что эти значения сохряняются и после перезагрузки. 
Чем это решение не устраивает? Сложилось впечатление, что мы тут ерундой занимаемся.

*PavelA*, Ничего не имею против 2k. Правда, в свое время, напугали скорым прекращением поддержки (и выпуска обновлений). XP можно так пообрезать, то по безглючности она не уступит 2k (у которой были свои  глюки. Я гарантирую это).

*Iron Monk*, Нет под рукой 2k. Там WMI было, кажись. Что именно не работает? Может быть, просто обновить WSH?

----------


## PavelA

Не знал, что эти значения сохряняются и после перезагрузки. 
--- Они на всю жизнь системы хранятся, пока не зачистишь реестр.

----------


## antanta

И молчали, как партизан... 
Кстати, пытаюсь менять один байт в REG_BINARY - восстанавливается после подключения накопителя. Кто-то знает, как формируется параметр значений вида \DosDevices\X: ?

----------


## Iron Monk

> Сложилось впечатление, что мы тут ерундой занимаемся.





> Входные данные такие:
> - программа, использующая флеш носитель как ключевой контейнер (т.е. обычная флешка, не токен)
> - 2 или 3 флешки с одинаковыми файлами (но с разным содержимым).
> - автозапуск с флешек запрещен
> 
> Условие:
> - для успешной работы флешки должны получать одну и ту же букву диска.
> - при работе с программой необходимо последовательно вставить все флешки (одну за одной).
> - минимизировать кол-во телодвижений для данной процедуры


Если править в реестре, необходима перезагрузка. Спасает diskpart. То бишь, наш USB.bat.
Чтобы запустить батник - лишнее телодвижение. Спасает WMI, которое перехватывает сообщение о подключении флешки.
В W2K конечно есть WMI, даже в 98Win можно привязать. Но обрезаный. Можно, конечно, почитать и заточить подо все оси, но, если честно, лень. Если только ради спортивного интереса.
По мне так проще лишнее окошко сваять +четыре строчки кода.  :Wink: 

*Добавлено через 1 час 46 минут*




> Кто-то знает, как формируется параметр значений вида \DosDevices\X: ?


http://download.sysinternals.com/Files/WinObj.zip
Потыкать флешку, F5, посмотреть изменение параметров GLOBAL??
Правда это никому еще не помогло.... :Cheesy:

----------


## Vadim_SVN

> Сегодня решил упростить процесс. Упростил. И, в поисках этой темы по форуму, нашел это http://virusinfo.info/showthread.php?t=74300
> "Все украдено до нас!" (С). Не знал, что эти значения сохряняются и после перезагрузки.
> Чем это решение не устраивает? Сложилось впечатление, что мы тут ерундой занимаемся.


Второй пост этого топика  :Wink:

----------


## antanta

> Второй пост этого топика


 :Cool:  - это изображен я. Только палочки не хватает.
Все же, лезть в управление дисками - это нужно ручками, что не позволяет автоматизировать процесс.
 Интересно, что будет, если буквы кончатся? 
Кстати, кому интересно, из чего складывается значени параметра вида *\DosDevices\X:* , то вот что получается:
 Первый блок: 5C 00 3F 00 3F 00 5C 00    -это просто-   \??\
 Третий блок (после третьего диеза #) - GUID диска (как устройства).
 Между ними ID тома(или как правильно?). Только слэши заменены диезами.

Хотя, wmi выдает серийный номер тома, который в этом значении нигде не проглядывает. Брал так:


```
 wmic.exe logicaldisk where (caption='F:') get caption,volumeserialnumber
```

----------


## Iron Monk

> Все же, лезть в управление дисками - это нужно ручками, что не позволяет автоматизировать процесс.


Кому как. С помощью diskpart и некоторой обвязки - идет на ура.



> Интересно, что будет, если буквы кончатся?


Сетевые диски будут отключаться. Если все буквы заняты HDD - ничего не будет. :Shocked:

----------


## antanta

Iron, я говорил об том посте, где описывался процесс смены буквы через гуй.
Насколько я понял, можно намутить полную автоматизацию стандартными средствами.
 Можно менять букву на ходу. Devcon enable/disable. (devcon.exe из DDK). Возможностей обнаружено много, а реализацию каждый делает под свои задачи. Хоть гуй на vbs пишите  :Smiley: 

*Добавлено через 3 часа 23 минуты*

Штатными средствами можно много чего сделать :
eventtriggers /Create /tr 666 /l system /eid 666  /tk d:\0\trigger.cmd  - создаем триггер
eventcreate /id 666  /l system /t warning /d ACHTUNG!!!1111  - засылаем событив в журнал. Триггер срабатывает
А еще есть недокументированные ключи, для организации мьютексов и семафоров :
/et mutex , /et semaphore

----------


## Iron Monk

> Можно менять букву на ходу. Devcon enable/disable.


Хотелось бы посмотреть на того, кто смог это проделать... :Cheesy:

----------


## antanta

> Хотелось бы посмотреть на того, кто смог это проделать...


  Только вот это 


> А еще есть недокументированные ключи, для организации мьютексов и семафоров :
> /et mutex , /et semaphore


 следует воспринимать с поправкой на дату  :Wink: 
 Если хочется посмотреть, милости просим  :Smiley: 
 А луше, проделайте сами. И можно будет регулярно лицезреть героя в зеркале. Вот сама утилита 
 Допустим, есть \DosDevices\H: и \DosDevices\F: . Меняем местами литеры, запускаем devcon с нужными параметрами, любуемся результатом. 
 Что до параметров, тут могут быть затруднения. 
Мне известны ID моих накопителей. 
Например, имеем USB\VID_1307&PID_0163\8DB622A636119B.
 Тогда 

```
devcon disable USB\VID_1307&PID_0163*
```

благополучно отключает накопитель, а 

```
devcon enable USB\VID_1307&PID_0163*
```

 соответственно, включает. 
 Или просто restart.
 Я определял ID с помощью CM_Get_Device_ID. Но, если говорим о стандартных средствах, можно и так:


```
devcon drivernodes *usb\vid_*
```

 .

----------


## PavelA

devcon disable USB\VID_1307&PID_0163*соответственно, включает. 
---
Не включит так. enable надо написать.

----------


## antanta

очепятка. Спасибо. Поправлю. Еще можно *restart **
Но, не советую  :Smiley: 
Возможен следующий алгоритм:
0) (Подготовка) Экспортируем HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices с нужными наборами букив для каждого БК, в разные файлы.
  Создаем запускающий файл сценария, в котором
1) Импортируем подходящий REG-файл
2) devcon restart для всех флешек
3) Запуск собственно КБ

----------


## Iron Monk

> 1) Импортируем подходящий REG-файл
> 2) devcon restart для всех флешек


Это придется делать для каждой флешки. По условию, для одного КБ нужны три "однобуквенных" флешки. :Wink:

----------


## antanta

*Iron Monk*, У Вас что-то с глазом, подергивается.  :Smiley: 
Про три не видел. Значит, у меня проблемы с обоими глазами.

Был предложен вариант, который кого-то усторит. Кому-то подойдет добавить в него пункт с отловом подключения. У меня в голове вообще вертелась такая картина: Есть два БК, для каждого - от одной до n флешек. И, требуется, чтобы каждый набор флешек садился на один и тот же набор букв.
 Иначе - непонятно, как это вообще у кого-то работает. Разве что флешки прошиты на один серийник. ИЛИ в самом БК реализован механизм, который мы тут пытаемся изобразить. И, этот механизм не срабатывает на конкретных машинах. Или ось не та (не w2k часом?) или еще чего.
 PS: Предлагая варианты, отличные от Вашего, я не утверждаю, что Ваш плох.

----------


## Iron Monk

> Есть два БК, для каждого - от одной до n флешек. И, требуется, чтобы каждый набор флешек садился на один и тот же набор букв.


Однако, на одну букву.



> Входные данные такие:
> - программа, использующая флеш носитель как ключевой контейнер (т.е. обычная флешка, не токен)
> - *2 или 3 флешки* с одинаковыми файлами (но с разным содержимым).
> - автозапуск с флешек запрещен
> 
> Условие:
> - для успешной работы *флешки должны получать одну и ту же букву диска.*
> - при работе с программой необходимо последовательно вставить все флешки (одну за одной).
> - минимизировать кол-во телодвижений для данной процедуры





> PS: Предлагая варианты, отличные от Вашего, я не утверждаю, что Ваш плох.


Да и я из Ваших постов почерпнул довольно много интересного для себя. Некоторые идеи меня действительно заинтересовали.

----------


## Derv1sh

> Я уже упоманал в начале обсуждения, что у subst от имени SYSTEM могут быть проблемы с доступом к содержимому виртуальных дисков, созданных обычным админом (кто бы объяснил это глюк?) Хотя, можно обойтись и без subst. Завтра покумекаем. 
> Предлагаю для начала следующее содержание USB.vbs:
> 
> 
> ```
> Set SAPI = CreateObject ( "sapi.spvoice") 
> sapi.Speak "Ah htwuung! Removable detected!"
> ```
> 
>  Если голосовым движком установлен стандартный Sam, доставляет характерным акцентом


Очень и очень интересно. попробовал все работает, а собственнаый подход чет не пашет.
Содержание USB.vbs:
wscript.echo "Подключена флешка"
 процес запускается а на экран не выводится :Sad:

----------

Надоело быть жертвой? Стань профи по информационной безопасности, получай самую свежую информацию об угрозах и средствах защиты от ведущего российского аналитического центра Anti-Malware.ru:

----------


## Iron Monk

> Содержание USB.vbs:
> wscript.echo "Подключена флешка"
> процес запускается а на экран не выводится


Процесс запускается от SYSTEM, поэтому юзеру окна не видны.

----------


## Derv1sh

РРРРРР. а нуна нуна :Angry:

----------


## Iron Monk

> РРРРРР. а нуна нуна


Учетная запись NT Authority\System не имеет прав интерактивного входа. Пользователи не видят и не могут взаимодействовать с программами, запущенными с разрешений системы. 



> Один батюшка строил церковь. И все бы хорошо, но колокольня все время падала. Построят - упадет. Снова построят - снова упадет. И вот явился к батюшке ангел божий и изрек: "Вмуруй жену свою в фундамент и в веках простоит Храм твой". Жену юную батюшка очень любил, но Господа тоже любил. И храм строить нужно. Погоревал, поплакал, попрощался с женой (а она была барышня богобоязненная, надо так надо) и таки замуровал.
> 
> А колокольня все равно упала.
> 
> Потому что сопромат не на$б$шь.


SYSTEM может выполнять только неинтерактивные задачи типа *net send.*
USB.vbs


```
Set oUSB = CreateObject("Wscript.Shell")
oUSB.Run("net send user USB connected!!!")
```

На компьютере должна быть запущена служба сообщений, в скрипте *user* заменить на реальное имя пользователя.

----------


## Derv1sh

пасиб, буду пробовать)

----------


## UksusoFF

> *Neo-473*, Читаем:
> 
> http://www.uwe-sieber.de/usbdlm_e.html#download


замечательная утилита, в бухгалтерии поставил, ключи у них на флешках

----------


## Vadim_SVN

> замечательная утилита, в бухгалтерии поставил, ключи у них на флешках


Ну если подходить с точки зрения лицензионности, то:


> USBDLM is Freeware for private and educational (schools, colleges, universities) use only

----------


## UksusoFF

*Vadim_SVN*, у меня школа  :Smiley: 
да и не думаю что проверка будет придираться к этой утилитке

----------


## gokors

Внесу и я 5 копеек... Нарыл способ.

Вкратце:
Такой *.bat, запущенный с флешки (с правами админа), перемонтирует её на букву W:


```
@echo off
cd /d c:
for /f "tokens=*" %%a in (' mountvol %~d0 /l ') do ( mountvol %~d0 /d & mountvol W: %%a & exit )
```

ЗАПУСКАТЬ *.bat С СИСТЕМНОГО ДИСКА  НЕ РЕКОМЕНДУЕТСЯ!

----------


## Nikollay

Данное решение упоминалось вскользь в теме. Но развития не получило.
А именно использование программы USBDLM 
Решило проблему. На раз два. Элегантно , просто и эффективно.

----------

