Как из 1С определить букву диска Windows (флешки)?

1. V_V_V 28.09.11 14:06 Сейчас в теме
По-моему уже где-то пробегало, только никак найти не могу...
Нужно из 1С:Предприятие 8.2 (8.2.13.219) определить букву подключенного по USB сканера штрих-кодов Motorola CS3000. В системе он появляется как флешка с именем CS3000. Путь к файлу с данными на этой флешке всегда постоянен, но на разных компах разное количество дисков - нужно автоматизировать получение данных для неподготовленного пользователя...
По теме из базы знаний
Найденные решения
13. cool.vlad4 2 28.09.11 18:35 Сейчас в теме
Да кстати от 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 ="";
Возврат Результат;
КонецФункции;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ~gekK@~ 28.09.11 14:11 Сейчас в теме
актуальный вопрос! встречался с такой проблемой, пока решить не удалось. ждем ответов
3. cool.vlad4 2 28.09.11 14:16 Сейчас в теме
щас попробую у себя найти, смысл в том, что через wmi...и по какому-то идентификатору
6. V_V_V 28.09.11 15:35 Сейчас в теме
(3)(4)(5) cool.vlad4 громадное спасибо, что откликнулись на мою проблему. Попробую Ваш вариант.
Но где-то на Инфостарте пробегала темка, связанная с паролями 1С. Там в комментариях народ предлагал хранить кодовое слово на флешке в файлике, уникальное для пользователя, как один из способов дополнительной секьюрности. И предлагалось несколько довольно несложных способов определения флешки (если ничего не путаю). Я еще тогда для себя отметил, что может пригодится - и как водится забыл...
7. cool.vlad4 2 28.09.11 15:39 Сейчас в теме
9. V_V_V 28.09.11 15:55 Сейчас в теме
(7) Да, это оно. Как минимум это тема, которую я искал. Спасибо, буду ковырять дальше!
(8) Я перечислять не буду, что только не набиралось при поиске... Но "секрет" и "информация" точно не пробовалось... :)
10. V_V_V 28.09.11 18:23 Сейчас в теме
В общем получилось. Взял из обработки "Получить ID USB" (7) скрипт, немного допилил под себя, стало такого вида:
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, мне проще выдрать из строки нужные данные... :)
11. cool.vlad4 2 28.09.11 18:28 Сейчас в теме
(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);
КонецФункции;
4. cool.vlad4 2 28.09.11 15:14 Сейчас в теме
сайт безобразно работает(((
сообщение второй раз пишу((
...

У себя так и не нашел, сделал просто перечисление 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"]);
КонецЦикла;

КонецЦикла;
5. cool.vlad4 2 28.09.11 15:18 Сейчас в теме
В последних строчках , вот это
serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
//["SerialNumber"])
Для Каждого number Из serial Цикл
Сообщить(serial["SerialNumber"]);
КонецЦикла;
лишнее, пардон...
8. cool.vlad4 2 28.09.11 15:40 Сейчас в теме
При поиске главное запоминать ключевые фразы))) я нашел по "секретная информация"
12. cool.vlad4 2 28.09.11 18:31 Сейчас в теме
Проверил 1-ую строку надо заменить на

objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") ;
13. cool.vlad4 2 28.09.11 18:35 Сейчас в теме
Да кстати от 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 ="";
Возврат Результат;
КонецФункции;
14. V_V_V 28.09.11 19:31 Сейчас в теме
(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;
КонецФункции;
Показать
Тут я четко на выходе имею букву нужного мне диска (или пустую строку).
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот