usb накопитель, узнать о нем все (WMI/WinAPI)
От: Аноним  
Дата: 04.12.06 09:22
Оценка: -1
Приветсвую всех!

Раньше с .Net'ом не работал. Есть задача, узнать о usb накопителях подключенных к сисмете всю информацию (буква диска, серийный номер либо другой id, что то еще). Киньте примеры плиз для WMI или WinAPI, как я понял WMI не очень то дружит с usb накопителями...

Спасибо!
Re: usb накопитель, узнать о нем все (WMI/WinAPI)
От: OldDino Россия  
Дата: 04.12.06 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Раньше с .Net'ом не работал. Есть задача, узнать о usb накопителях подключенных к сисмете всю информацию (буква диска, серийный номер либо другой id, что то еще). Киньте примеры плиз для WMI или WinAPI, как я понял WMI не очень то дружит с usb накопителями...


WMI очень даже дружит с USB-накопителями. Просто USB-накопители бывают разные. Флэшка определяется одним способом, внешний USB-винчестер — другим, кард-ридер — третьим.

С уважением,

OldDino
Re[2]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: Аноним  
Дата: 04.12.06 10:23
Оценка:
Ок. Поясню задачю : нужен некий механизм, который бы определял что к usb подключенно некое устройство на котором есть файлы или же их можно туда записать. при этом нужно знать было ли это устройство подключенно рание. Никак не придет в голову как это сделать с использованием WMI.

Здравствуйте, OldDino, Вы писали:

OD>Здравствуйте, Аноним, Вы писали:


А>>Раньше с .Net'ом не работал. Есть задача, узнать о usb накопителях подключенных к сисмете всю информацию (буква диска, серийный номер либо другой id, что то еще). Киньте примеры плиз для WMI или WinAPI, как я понял WMI не очень то дружит с usb накопителями...


OD>WMI очень даже дружит с USB-накопителями. Просто USB-накопители бывают разные. Флэшка определяется одним способом, внешний USB-винчестер — другим, кард-ридер — третьим.


OD>С уважением,


OD>OldDino
Re[3]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: OldDino Россия  
Дата: 04.12.06 10:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ок. Поясню задачю : нужен некий механизм, который бы определял что к usb подключенно некое устройство на котором есть файлы или же их можно туда записать. при этом нужно знать было ли это устройство подключенно рание. Никак не придет в голову как это сделать с использованием WMI.


Повторю ещё раз — разные устройства (флэшка, USB-диск, внешний кард-ридер) определяются разными способами, соответственно, и программы тоже будут разными. Кроме того, одно USB-устройство может определяться как несколько физических и, соответственно, логических дисков. Ну, и ещё масса нюансов. Можно узнать, поддерживает ли устройство запись на него.
Ну, и, разумеется, можно отследить момент подключения или отключения устройства. Но, как я уже сказал, во всех случаях будут разные программы. Если бы была понятна потребность, то, возможно, было бы предложено решение.

С уважением,

OldDino
Re[4]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: Аноним  
Дата: 04.12.06 13:18
Оценка:
Задача примерно следующая, необходимо держать список неких файлов, расположенных на этих самых носителях, после запроса пользователя ему их отдавать, но нужно отдавать именно тот файл именно с того носителя независимо какой буквой (следует рассматривать только те носители, что существуют в системе как диски) он подключился в данный момент.


Здравствуйте, OldDino, Вы писали:

OD>Повторю ещё раз — разные устройства (флэшка, USB-диск, внешний кард-ридер) определяются разными способами, соответственно, и программы тоже будут разными. Кроме того, одно USB-устройство может определяться как несколько физических и, соответственно, логических дисков. Ну, и ещё масса нюансов. Можно узнать, поддерживает ли устройство запись на него.

OD>Ну, и, разумеется, можно отследить момент подключения или отключения устройства. Но, как я уже сказал, во всех случаях будут разные программы. Если бы была понятна потребность, то, возможно, было бы предложено решение.

OD>С уважением,


OD>OldDino
Re[5]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: OldDino Россия  
Дата: 04.12.06 13:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача примерно следующая, необходимо держать список неких файлов, расположенных на этих самых носителях, после запроса пользователя ему их отдавать, но нужно отдавать именно тот файл именно с того носителя независимо какой буквой (следует рассматривать только те носители, что существуют в системе как диски) он подключился в данный момент.


Так... А как планируется осуществлять идентификацию дисков? Насколько мне помнится, серийника у удаляемых дисков (физических) может и не быть. Серийника у логических дисков в некоторых случаях может и не быть. А если на разных устройствах есть разные файлы с одинаковыми именами? А если есть устройство, но, скажем, по каким-то причинам файлы на нём недоступны, что бывает очень часто?
У меня складывается впечатление, что Вы, уважаемый Аноним, не совсем чётко представляете себе то, что Вы хотите сделать. Я настоятельно рекомендую БОЛЕЕ ТЩАТЕЛЬНО проработать задачу. Когда задача будет проработана, можно будет говорить и о путях и способах её решения.
Справедливости ради скажу, что решение всех проблем, за исключением способа идентификации дисков, является достаточно простым. Думаю, что как только задача приобретёт более ясные очертания, мы с Вам достаточно быстро (скажем, в течение одного дня) реализуем обращения к WMI.

С уважением,

OldDino
Re[6]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: Аноним  
Дата: 05.12.06 07:04
Оценка:
Вы немного так поняли... об этих проблемах я знаю сам. Давайте я дам точную узкую подзадачу. Необходимо собрать информацию из WMI, которая бы предоставляла мне следующие данные: Буква диска, уникальный/серийный номер или же номер по которому можно устройство точно опознать, usb или нет.

Здравствуйте, OldDino, Вы писали:

OD>Здравствуйте, Аноним, Вы писали:


А>>Задача примерно следующая, необходимо держать список неких файлов, расположенных на этих самых носителях, после запроса пользователя ему их отдавать, но нужно отдавать именно тот файл именно с того носителя независимо какой буквой (следует рассматривать только те носители, что существуют в системе как диски) он подключился в данный момент.


OD>Так... А как планируется осуществлять идентификацию дисков? Насколько мне помнится, серийника у удаляемых дисков (физических) может и не быть. Серийника у логических дисков в некоторых случаях может и не быть. А если на разных устройствах есть разные файлы с одинаковыми именами? А если есть устройство, но, скажем, по каким-то причинам файлы на нём недоступны, что бывает очень часто?

OD>У меня складывается впечатление, что Вы, уважаемый Аноним, не совсем чётко представляете себе то, что Вы хотите сделать. Я настоятельно рекомендую БОЛЕЕ ТЩАТЕЛЬНО проработать задачу. Когда задача будет проработана, можно будет говорить и о путях и способах её решения.
OD>Справедливости ради скажу, что решение всех проблем, за исключением способа идентификации дисков, является достаточно простым. Думаю, что как только задача приобретёт более ясные очертания, мы с Вам достаточно быстро (скажем, в течение одного дня) реализуем обращения к WMI.

OD>С уважением,


OD>OldDino
Re[7]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: OldDino Россия  
Дата: 05.12.06 07:47
Оценка: 7 (2)
Здравствуйте, Аноним, Вы писали:

А>Вы немного так поняли... об этих проблемах я знаю сам. Давайте я дам точную узкую подзадачу. Необходимо собрать информацию из WMI, которая бы предоставляла мне следующие данные: Буква диска, уникальный/серийный номер или же номер по которому можно устройство точно опознать, usb или нет.


Что ж... Давайте попробуем...

ManagementObjectColection collection = ( new ManagementObjectSearcher( "SELECT * FROM Win32_DiskDrive WHERE InterfaceType=\"USB\"" ) ).Get();

Это даст весь список свойст ФИЗИЧЕСКИХ дисков с интерфейсом USB. Теперь возникает вопрос — а как получить привязку физических дисков к логическим, то есть узнать, на каком ФИЗИЧЕСКОМ устройстве расположен тот или иной ЛОГИЧЕСКИЙ диск.
Напрямую это узнать невозможно. Но мы разыграем двухходовую комбинацию.

Ход первый. Для каждого ФИЗИЧЕСКОГО диска получим список разделов, находящихся на нём. Для этого для каждого объекта, полученного на предыдущем этапе, выдаём следующий запрос:

collection = ( new ManagementObjectSearcher( "ASSOCIATORS OF {" + usbDevice.Path + "} WHERE AssocClass=Win32_DiskDriveToDiskPartition" ) ).Get();

Таким образом для каждого USB-устройства мы получили коллекцию разделов, находящихся на нём. И теперь дело остаётся за малым.

Ход второй. Для каждого раздела, полученного на предыдущем шаге, выдаём запрос:

collection = ( new ManagementObjectSearcher( "ASSOCIATORS OF {" + partitionObject.Path + "} WHERE AssocClass=Win32_LogicalDiskToPartition" ) ).Get();

А вот кадый объект из этой коллекции и представляет собой ЛОГИЧЕСКИЙ диск.

Таким образом, мы получили список всех ФИЗИЧЕСКИХ дисков с USB-интерфейсом, затем для каждого диска получили список располагающихся на нём разделов, а затем для каждого раздела получили список соответствующих ему логических дисков. Думаю, что свойства отдельного логического диска перебрать не так уж сложно, верно?

С уважением,

OldDino
Re[8]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: ZAVRus Украина  
Дата: 05.12.06 20:49
Оценка:
Здравствуйте, OldDino, Вы писали:

А не подскажите как узнать о подключении к usb устройства, не обязательно как диска.
Т.е. нужно определить что к usb подключено какое-то устройство. Важно что любое, например мышка или ещё что-нибудь.
Re[9]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: OldDino Россия  
Дата: 06.12.06 06:07
Оценка:
Здравствуйте, ZAVRus, Вы писали:

ZAV>А не подскажите как узнать о подключении к usb устройства, не обязательно как диска.

ZAV>Т.е. нужно определить что к usb подключено какое-то устройство. Важно что любое, например мышка или ещё что-нибудь.

Скажу так — подключение мышек и других устройств не отслеживал, но, думаю, направление подсказать смогу.
Итак, то, что я написал вчера, — это порядок (скажем так, обычный, так как нюансов очень много) определения наличия дисков на момент запуска программы или метода. Для того, чтобы можно было отследить моменты наступления того или иного события, используются т.н. event'ы. Давайте, скажем, попробуем поймать event о подключении диска (так как я, собственно говоря, только с дисками и работал) (пример сгенерирован, то есть копирайт не мой):

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
public class WMIReceiveEvent
{
public WMIReceiveEvent()
{
try
{
WqlEventQuery query = new WqlEventQuery(
"SELECT * FROM Win32_VolumeChangeEvent");

ManagementEventWatcher watcher = new ManagementEventWatcher(query);
Console.WriteLine("Waiting for an event...");

watcher.EventArrived +=
new EventArrivedEventHandler(
HandleEvent);

// Start listening for events
watcher.Start();

// Do something while waiting for events
System.Threading.Thread.Sleep(10000);

// Stop listening for events
watcher.Stop();
return;
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to receive an event: " + err.Message);
}
}

private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
Console.WriteLine("Win32_VolumeChangeEvent event occurred.");
}

public static void Main()
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
return;
}

}
}

Думаю, понятно, что в этом примере мы подписываемся на сообщение, затем десять секунд ждём это сообщение, после чего программа заканчивает работу. А теперь заглянем в список сообщений WMI! В нём, например, можно увидеть Win32_DeviceChangeEvent, Win32_SystemConfigurationChangeEvent, __InstanceCreationEvent, _InstanceModificationEvent, __InstanceDeletionEvent... Думаю, если поэкспериментировать с этими сообщениями, то подключение и отключение любого USB-устройства можно отследить без труда. А ограничить список устройств, на подключение или отключение которых будет реагировать программа, можно при помощи более конкретного запроса.

С уважением,

OldDino
Re[10]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: ZAVRus Украина  
Дата: 07.12.06 15:45
Оценка:
Здравствуйте, OldDino, Вы писали:

OD>Думаю, понятно, что в этом примере мы подписываемся на сообщение, затем десять секунд ждём это сообщение, после чего программа заканчивает работу. А теперь заглянем в список сообщений WMI! В нём, например, можно увидеть Win32_DeviceChangeEvent, Win32_SystemConfigurationChangeEvent, __InstanceCreationEvent, _InstanceModificationEvent, __InstanceDeletionEvent... Думаю, если поэкспериментировать с этими сообщениями, то подключение и отключение любого USB-устройства можно отследить без труда. А ограничить список устройств, на подключение или отключение которых будет реагировать программа, можно при помощи более конкретного запроса.


OD>OldDino


Всё конечно хорошо, но что делать на win2000.

Win32_DeviceChangeEvent, Win32_SystemConfigurationChangeEvent,

Client Requires Windows XP.
Server Requires Windows Server 2003.

да и __InstanceCreationEvent, _InstanceModificationEvent, __InstanceDeletionEvent не подходят
Re[11]: usb накопитель, узнать о нем все (WMI/WinAPI)
От: OldDino Россия  
Дата: 07.12.06 16:41
Оценка:
Здравствуйте, ZAVRus, Вы писали:

ZAV>Всё конечно хорошо, но что делать на win2000.


Ну, возможно, перейти с Win2000 хотя бы на XP. А ещё лучше, наверное, сразу на Vista. В ней (в частности, в WMI) исправлены масса ошибок, которые присутствуют в XP.

С уважением,

OldDino
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.