gifts2017

Как определить букву флеш-накопителя

Опубликовал AHgpuXa (AHgpuXa) в раздел Программирование - Практика программирования

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

Изначально думал заставить монтироваться флешку всегда на одну-единственную букву, но к сожалению однозначного решения не нашел.

Поэтому решил определять эту букву по какому-нибудь ID устройства. Вот что получилось:

Функция ПолучитьБуквуДиска(SN)
scrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
scrptCtrl.Language = "vbscript";
scrptCtrl.addcode("Public Function RunCodeIn1c()
|Res = vbNullString
|strComputer="".""
|strSN="""+SN+"""
|Set objWMIService = GetObject(""winmgmts:\\"" & strComputer & ""\root\CIMV2"")
|Set colItems = objWMIService.ExecQuery(_
|""Sel ect * fr om Win32_LogicalDisk where VolumeSerialNumber = '"" & strSN & ""' "",,48)
|For Each objItem in colItems
|Res = objItem.DeviceID
|Next
|RunCodeIn1c = Res
|End Function
|
");
Рез = scrptCtrl.Run("RunCodeIn1c");
Возврат(Рез);
КонецФункции

Информацию о подключенных флеш-накопителях можно получить например так (в EXCEL):
Private Sub CommandButton1_Click()
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Sel ect * from Win32_LogicalDisk", , 48)
i = 0
For Each objItem In colItems
i = i + 1
Cells(i, 1) = objItem.Caption
Cells(i, 2) = objItem.Description
Cells(i, 3) = objItem.DeviceID
Cells(i, 4) = objItem.DriveType
Cells(i, 5) = objItem.FileSystem
Cells(i, 6) = objItem.InstallDate
Cells(i, 7) = objItem.FreeSpace
Cells(i, 8) = objItem.MediaType
Cells(i, 9) = objItem.PNPDeviceID
Cells(i, 10) = objItem.Name
Cells(i, 11) = objItem.PNPDeviceID
Cells(i, 12) = objItem.PowerManagementCapabilities
Cells(i, 13) = objItem.PowerManagementSupported
'Cells(i, 14) = objItem.ProtocolSupported
Cells(i, 15) = objItem.Status
Cells(i, 16) = objItem.StatusInfo
Cells(i, 17) = objItem.SystemCreationClassName
Cells(i, 18) = objItem.SystemName
Cells(i, 19) = objItem.TimeOfLastReset
Cells(i, 20) = objItem.VolumeDirty
Cells(i, 21) = objItem.SystemName
Cells(i, 22) = objItem.VolumeName
Cells(i, 23) = objItem.VolumeSerialNumber
Next
End Sub


objItem.VolumeSerialNumber
- это и есть Серийный номер раздела.
Подробнее о Win32_LogicalDisk Class можно почитать здесь


См. также

Подписаться Добавить вознаграждение
Комментарии
1. Кирилл Коновалов (akkvamarin) 04.06.09 14:45
Скрипт контрол подключать не обязательно, можно записать это покороче:

Функция ПолучитьБуквуДиска(SN)
Рез = "";
//strComputer можно и не указывать, по умолчанию текущая машина
objWMIService = ПолучитьCOMОбъект(""winmgmts:\\"" & strComputer & ""\root\CIMV2"")
colItems = objWMIService.ExecQuery("Sel ect * fr om Win32_LogicalDisk where VolumeSerialNumber = '" + strSN + "'");
Для каждого objItem из colItems Цикл // одна пробежка в цикле
Рез = objItem.DeviceID;
КонецЦикла;

Возврат(Рез);
КонецФункции

А про Эксель могу сказать что вы так переберете только все логические диски компьютера. Ни в запросе ни в цикле я не увидел условия на проверку DriveType, числовое значение которого как раз отвечает за определение флешки (DriveType = 1)
2. Аркадий Кучер (Abadonna) 04.06.09 15:10
API GetDriveType (kernel32) возвращает тип диска по букве
типы:
2 =DRIVE_REMOVABLE
3 = DRIVE_FIXED
5= DRIVE_CDROM
Перебрать все буквы можно при помощи API
GetLogicalDriveStrings
3. Алексей Константинов (alexk-is) 04.06.09 16:04
(0) Как написано в статье не работает :(
Лишние пробелы. Несуществующие свойства... Для какой ОС приведен пример?
http://msdn.microsoft.com/en-us/library/aa394173.aspx
По указанной ссылке описаны другие свойства. Не те что в статье, а те что работают.

Хорошо что есть большой напильник...
4. AHgpuXa (AHgpuXa) 04.06.09 16:07
(1) >Скрипт контрол подключать не обязательно
Понял, учту.
> что вы так переберете только все логические диски компьютера
Согласен. Просто цель была определить серийник диска, а не выбрать именно флешки. И DriveType = 2 для флешки.
(2) И как потом получить именно нужную из нескольких?
5. Аркадий Кучер (Abadonna) 04.06.09 16:11
(4)> И как потом получить именно нужную из нескольких?
Получил список всех флешек (с буквами), а дальше уж определяй, какая тебе именно нужна. Примерно твоим методом...
Зато по (2) абсолютно точно знать, под какими буквами у тебя сейчас съемные, один один, хоть сколько портов в компе
6. AHgpuXa (AHgpuXa) 04.06.09 16:24
(3) Лишние пробелы не пойми где взялись. ProtocolSupported - действительно несуществующее св-во :) Остальные совпадают с теми что по ссылке. И по указанной ссылке перечислены все св-ва, а в статье - выборочные.
А так работает в Windows XP и Windows 7