Как из 1С определить букву диска Windows (флешки)?
По-моему уже где-то пробегало, только никак найти не могу...
Нужно из 1С:Предприятие 8.2 (8.2.13.219) определить букву подключенного по USB сканера штрих-кодов Motorola CS3000. В системе он появляется как флешка с именем CS3000. Путь к файлу с данными на этой флешке всегда постоянен, но на разных компах разное количество дисков - нужно автоматизировать получение данных для неподготовленного пользователя...
Нужно из 1С:Предприятие 8.2 (8.2.13.219) определить букву подключенного по USB сканера штрих-кодов Motorola CS3000. В системе он появляется как флешка с именем CS3000. Путь к файлу с данными на этой флешке всегда постоянен, но на разных компах разное количество дисков - нужно автоматизировать получение данных для неподготовленного пользователя...
По теме из базы знаний
Найденные решения
Да кстати от com лучше избавится как-то так
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Результат =СокрЛП(disk);
objWMIService ="";
Возврат Результат;
КонецФункции;
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Результат =СокрЛП(disk);
objWMIService ="";
Возврат Результат;
КонецФункции;
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)(4)(5) cool.vlad4 громадное спасибо, что откликнулись на мою проблему. Попробую Ваш вариант.
Но где-то на Инфостарте пробегала темка, связанная с паролями 1С. Там в комментариях народ предлагал хранить кодовое слово на флешке в файлике, уникальное для пользователя, как один из способов дополнительной секьюрности. И предлагалось несколько довольно несложных способов определения флешки (если ничего не путаю). Я еще тогда для себя отметил, что может пригодится - и как водится забыл...
Но где-то на Инфостарте пробегала темка, связанная с паролями 1С. Там в комментариях народ предлагал хранить кодовое слово на флешке в файлике, уникальное для пользователя, как один из способов дополнительной секьюрности. И предлагалось несколько довольно несложных способов определения флешки (если ничего не путаю). Я еще тогда для себя отметил, что может пригодится - и как водится забыл...
В общем получилось. Взял из обработки "Получить ID USB" (7) скрипт, немного допилил под себя, стало такого вида:
На выходе получаю Текст = "SYSTEM;C:;DATA;D:;ITS1108U;E:;CS3000;F:;HP_SW;G:;DATA;Z:;". Я специально вынес VolumeName первым, чтоб по нему искать свой CS3000, а после него уже выбрать букву диска. В моем случае CS3000 это диск F:. Кому не подходит - меняйте местами VolumeName с DeviceId.
По-хорошему можно было бы прямо в самом скрипте проверять на содержание CS3000 в поле VolumeName и сразу получать букву диска. Но я не силен в VB, мне проще выдрать из строки нужные данные... :)
ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
ScrptCtrl.Language = "vbscript";
ScrptCtrl.addcode("
|Function GetComputers()
| Set objWMIService = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"")
| Set colDisks = objWMIService.ExecQuery (""Select * from Win32_LogicalDisk"")
| For Each objDisk in colDisks
| disk = disk & objDisk.VolumeName & "";"" & objDisk.DeviceId & "";""
| Next
| GetComputers = disk
|End Function
|");
Текст = СокрЛП(ScrptCtrl.Run("GetComputers"));
ПоказатьНа выходе получаю Текст = "SYSTEM;C:;DATA;D:;ITS1108U;E:;CS3000;F:;HP_SW;G:;DATA;Z:;". Я специально вынес VolumeName первым, чтоб по нему искать свой CS3000, а после него уже выбрать букву диска. В моем случае CS3000 это диск F:. Кому не подходит - меняйте местами VolumeName с DeviceId.
По-хорошему можно было бы прямо в самом скрипте проверять на содержание CS3000 в поле VolumeName и сразу получать букву диска. Но я не силен в VB, мне проще выдрать из строки нужные данные... :)
(10) Тоже самое на 1С, не проверял, только, что сделал
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Возврат СокрЛП(disk);
КонецФункции;
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Возврат СокрЛП(disk);
КонецФункции;
сайт безобразно работает(((
сообщение второй раз пишу((
...
У себя так и не нашел, сделал просто перечисление USB устройств, но можно переделать под себя зная ID устройства. А так удобно использовать WMI creator (есть еще версия от Душелова для 1С)
strComputer = ".";
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive where InterfaceType='USB'",,48);
//colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive",,48);
Для Каждого drive Из colItems Цикл
ManagementObject = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"]
+ "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition");
Для Каждого partition Из ManagementObject Цикл
Сообщить("Partition=" + partition["Name"]);
disks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
+ partition["DeviceID"]+"'} WHERE AssocClass =Win32_LogicalDiskToPartition");
Для Каждого disk Из disks Цикл
Сообщить("Disk=" + disk["Name"]);
КонецЦикла;
КонецЦикла;
Сообщить("Serial=" + drive["DeviceID"]);
serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
//["SerialNumber"])
Для Каждого number Из serial Цикл
Сообщить(serial["SerialNumber"]);
КонецЦикла;
КонецЦикла;
сообщение второй раз пишу((
...
У себя так и не нашел, сделал просто перечисление USB устройств, но можно переделать под себя зная ID устройства. А так удобно использовать WMI creator (есть еще версия от Душелова для 1С)
strComputer = ".";
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive where InterfaceType='USB'",,48);
//colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive",,48);
Для Каждого drive Из colItems Цикл
ManagementObject = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"]
+ "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition");
Для Каждого partition Из ManagementObject Цикл
Сообщить("Partition=" + partition["Name"]);
disks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
+ partition["DeviceID"]+"'} WHERE AssocClass =Win32_LogicalDiskToPartition");
Для Каждого disk Из disks Цикл
Сообщить("Disk=" + disk["Name"]);
КонецЦикла;
КонецЦикла;
Сообщить("Serial=" + drive["DeviceID"]);
serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
//["SerialNumber"])
Для Каждого number Из serial Цикл
Сообщить(serial["SerialNumber"]);
КонецЦикла;
КонецЦикла;
В последних строчках , вот это
serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
//["SerialNumber"])
Для Каждого number Из serial Цикл
Сообщить(serial["SerialNumber"]);
КонецЦикла;
лишнее, пардон...
serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
//["SerialNumber"])
Для Каждого number Из serial Цикл
Сообщить(serial["SerialNumber"]);
КонецЦикла;
лишнее, пардон...
Да кстати от com лучше избавится как-то так
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Результат =СокрЛП(disk);
objWMIService ="";
Возврат Результат;
КонецФункции;
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Результат =СокрЛП(disk);
objWMIService ="";
Возврат Результат;
КонецФункции;
(13) Так, Ваш вариант мне понравился больше собственного :), так что взял его за основу и переделал под себя. Окончательный вариант:
Тут я четко на выходе имею букву нужного мне диска (или пустую строку).
Функция ПолучитьДиск()
disk = "";
Попытка
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
Для Каждого objDisk Из colDisks Цикл
Если СокрЛП(objDisk.VolumeName) = "CS3000" Тогда
disk = СокрЛП(objDisk.DeviceId);
Прервать;
КонецЕсли;
КонецЦикла;
objWMIService = "";
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат disk;
КонецФункции;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот