-
Интересно, что делает чудо-программа, если на машине много разделов на хардах, и пара оптических приводов?
Vadim_SVN, Для начала проверить бы, можно ли обмануть программу при помощи subst. То есть, копируем ключи в папку на харде, делаем subst и проверяем. Если помогает, идем дальше.
Задача разбивается на три попроще.
1) Застолбить литеры под наши девайсы. Решение - subst в автозагрузке.
2) Идентифицировать флеш. Решение - по ID или по метке тома. Другое дело, что как отлавливать момент подключения стандартными средствами (на скриптах, батниках и проч) я не знаю. Поэтому могу только перепилить под это дело одну свою софтинку. Она определяет флеху по ID, и выполняет
3) "Перемонтировать" буквы. Решение. Освобождаем (subst /d) нужную литеру. Определяем букву нашего реального накопителя, монтируем его корневой раздел на освободившуюся букву.
-
-
Будь в курсе!
Будь в курсе!
Надоело быть жертвой? Стань профи по информационной безопасности, получай самую свежую информацию об угрозах и средствах защиты от ведущего российского аналитического центра Anti-Malware.ru:
-
antanta,
реализация идентификации флэхи (как это кто-то тут собирался делать скриптом
Я не кто-то. Ибо азъ есмь!
как отлавливать момент подключения стандартными средствами (на скриптах,батниках и проч)
Код:
@echo off
rem Создание сценария получения списка томов:
echo LIST VOLUME>lv
rem Вывод списка томов на экран и в файл:
diskpart /s lv &diskpart /s lv>vol_lst.txt
Дальше нужно определиться, по чему будем идентифицировать нужную флешку: по метке тома, серийному номеру (0000-0000?! ) или маркерному файлу.
Где-то у меня валялся MapDrive.cmd с забугорного форума, позволяющий без перезагрузки переназначать буквы, там нужно всего-лишь адаптировать разбор вывода diskpart к великому и могучему.
-
VV2006, Это все в цикле? Пока юзер не подключит устройство?
-
-
antanta, а зачем городить постоянный цикл опроса устройств, если задача сводится к выполнению отдельной прикладной задачи? Включаем все требуемые процедуры в один пакетный файл и всё.
-
Сообщение от
VV2006
antanta, а зачем городить постоянный цикл опроса устройств, если задача сводится к выполнению отдельной прикладной задачи? Включаем все требуемые процедуры в один пакетный файл и всё.
Мой моск не смог предположить, что из юзермода (по крайней мере из батника) можно такие фокусы проделывать. Код в студию, пожалуйста.
Иначе мне придется таки кодить, раз обещал Выручайте уж
-
-
Сообщение от
antanta
Для начала проверить бы, можно ли обмануть программу при помощи subst.
К сожалению, такая возможность не представляется возможной (каламбурчик). БК работают, главбухи тоже - и лучше их не трогать (себе дороже может выйти)
По поводу программы - всякии сии чуда пишутся специализированно, и на что она готова обмануться, а на что нет - это только одной ей (программе) и известно.
Сообщение от
antanta
Иначе мне придется таки кодить, раз обещал
Да наверное не придется Спрашивалось из разряда факультатива. В любом случае получается, что это будет заточено именно под определенную программу и для определенной конкретной задачи, а не универсальным решением.
Но на возможные варианты решения не против и посмотреть
-
Сообщение от
PavelA
Нужно сделать так, чтобы две разные флешки были с буквой "Е".
http://www.uwe-sieber.de/usbdlm_e.html
-
-
Iron Monk, на предыдущей странице ее обсудили уже
-
Сообщение от
Vadim_SVN
- 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.
Почти четыре строчки кода получилось.
Последний раз редактировалось Iron Monk; 27.03.2010 в 14:56.
Причина: Добавлено
-
-
Iron Monk, Момент подключения обрабатывается очень просто. Но, у некоторых студЭнтов возникают проблемы с "буквой" подключенного устройтва. Особенно, когда их более одного . Если поможете нам всем чиста конкретным кодом, мы все будем очень благодарны. Заодно проясним Ваш взгляд на решение этой проблемы. Ждем-с.
-
-
Сообщение от
antanta
Момент подключения обрабатывается очень просто
Каким образом стандартными методами?
Код из поста выше, меняет букву флешки на заданную, идентифицируя нужную флешку по файлу.
Последний раз редактировалось Iron Monk; 27.03.2010 в 20:08.
-
-
Сообщение от
Iron Monk
Каким образом стандартными методами?
Разве что 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 минуту
Сообщение от
Iron Monk
[CODE]
Почти четыре строчки кода получилось.
Не считая окна.
Последний раз редактировалось antanta; 29.03.2010 в 11:23.
Причина: Добавлено
-
-
Junior Member
- Вес репутации
- 64
Ну можно например использовать встроеную программу 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, Откроется командная строка, где будут указаны все доступные носители.
На первый вопрос нужно ввести номер тома (левая колонка) для которого надо изменить букву, на второй вопрос надо ввести новую букву...
извращение конечно, но это быстрее, чем пользоваться диспетчером дисков.
-
Сообщение от
Vadim_SVN
Условие:
- для успешной работы флешки должны получать одну и ту же букву диска.
- при работе с программой необходимо последовательно вставить все флешки (одну за одной).
- минимизировать кол-во телодвижений для данной процедуры
Сообщение от
arriah
Достаточно запустить new.cmd, Откроется командная строка, где будут указаны все доступные носители.
На первый вопрос нужно ввести номер тома (левая колонка) для которого надо изменить букву, на второй вопрос надо ввести новую букву...
Не только "количество телодвижений" огромно, так еще "аналитическое мышление" нужно подключить.
И еще бабушек в бухгалтерии обучить всему этому.
Добавлено через 1 минуту
Сообщение от
arriah
Ну можно например использовать встроеную программу diskpart из командной строки
Post #29
Добавлено через 21 минуту
Сообщение от
antanta
Скрипт *.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.
Последний раз редактировалось Iron Monk; 29.03.2010 в 16:17.
Причина: Добавлено
-
-
-
-
Сообщение от
antanta
могут обойтись "голыми руками" (тем же WMI
Кабы не ентот ужас:
Код:
While (True)
Wscript.Sleep(1000)
Wend
уж лучше окошками сообщение ждать, чем постоянный опрос. Хотя, может и это обойти можно.
-
-
"Голыми руками" - это про удаленку через WMI. Тот же RPC, там проблем быть не должно. По ссылке, которую я приводил, в самом конце было про "Создание постоянных потребителей событий WMI". Как я и говорил, для меня это темный лес. Да еще и не нужный. Интуиция подсказывает, что копать нужно сюда (в отличие от "Создание временных потребителей событий WMI" , где используются WScript.Timeout = XXXX типа sleep). Каюсь еще раз, это все мои предположения, основанные на отрывочных знаниях о COM. Как-то это просто должно быть применимо к теме. Винду не ламеры писали (только не цитируйте меня на ЛОРе ).
Я и сам любитель "штатных" средств, но этот их ООП - это слишком.
-
-
Сообщение от
antanta
"Создание постоянных потребителей событий 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-файл:
Делаем скрипт USB.vbs:
Код:
Set oUSB = CreateObject("Wscript.Shell")
oUSB.Run("cmd.exe")
и забрасываем его в папку c:\windows\system32\wbem. Теперь при подключении съемного диска запускается cmd.exe(можно посмотреть в процессах). Работает, блин...
Последний раз редактировалось Iron Monk; 29.03.2010 в 23:49.
-
-
Сообщение от
Iron Monk
Теперь при подключении съемного диска запускается cmd.exe(можно посмотреть в процессах).
Работает, блин...
Вот и чудненько. Кстати, запускается от SYSTEM.
-
-
Сообщение от
antanta
Вот и чудненько. Кстати, запускается от SYSTEM.
Совершенно верно, поэтому доступ к телу, то бишь скрипту, желательно ограничить от юзверей.
-